700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 集成Android 科大讯飞语音合成播报功能(附源码)

集成Android 科大讯飞语音合成播报功能(附源码)

时间:2022-01-25 20:43:28

相关推荐

集成Android 科大讯飞语音合成播报功能(附源码)

概述

开篇先介绍一下‘科大讯飞’,毕竟是我家乡合肥的科技公司,我感到骄傲,更重要的是它在语音识别行业也是佼佼者,在如今人工智能横飞的时代,依然能够保持着较高水准的技术优势。在此,希望科大在AI之战中能发展的越来越棒。好了,接下里进入主题,先来看看科大讯飞在MSC移动语音终端(Android)开放的功能接口。

源码连接:/download/csdn_aiyang/10158914

资料参考

集成Android平台开发官方文档

集成准备

首先,打开科大讯飞平台,进行登录注册及创建应用。

点击右上控制台,进入管理应用和创建应用。

创建完应用,选择添加在线语音合成。另外,请注意该应用的APPID,及右方该应用的下载SDK。

接下里就是点击SDK下载进入选择页面。 有单选和组合两种方式下载。组合就是多个功能一起使用。

点击下载SDK,下载完成后,打开压缩包进入,并找到sample -->lib 里 Msc.jar文件和.so文件复制到项目里。(若gradle默认引用lib下所有文件,直接sync即可)

代码工作

完成上面的准备工作,接下里就是在项目里写代码了。创建MyApplication.class类

并在AndroidManifest.xml的application标签里添加 android:name=".MyApplication"。

public class MyApplication extends Application {private static Context context;@Overridepublic void onCreate() {super.onCreate();context = getApplicationContext();SpeechUtility.createUtility(this, "appid=12345678");//=号后面写自己应用的APPIDSetting.setShowLog(true); //设置日志开关(默认为true),设置成false时关闭语音云SDK日志打印//TTSUtils.getInstance().init(); 初始化工具类}//获取应用上下文环境public static Context getContext() {return context;}}

需要注意,一定要记得写在平台上创建的应用APPID。另外,下载的SDK文件夹命名也会有APPID。

这里封装好一个工具类,可以直接拿到项目中使用。TTSUtils.class类

public class TTSUtils implements InitListener, SynthesizerListener {private static volatile TTSUtils instance = null;private boolean isInitSuccess = false;private SpeechSynthesizer mTts;//单例模式public static TTSUtils getInstance() {if (instance == null) {synchronized (TTSUtils.class) {if (instance == null) {instance = new TTSUtils();}}}return instance;}// 初始化合成对象public void init() {mTts = SpeechSynthesizer.createSynthesizer(MyApplication.getContext(), this);// 清空参数mTts.setParameter(SpeechConstant.PARAMS, null);// 设置在线云端mTts.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD);// 设置发音人mTts.setParameter(SpeechConstant.VOICE_NAME, "xiaoyan");// 设置发音语速mTts.setParameter(SpeechConstant.SPEED, "50");// 设置音调mTts.setParameter(SpeechConstant.PITCH, "50");// 设置合成音量mTts.setParameter(SpeechConstant.VOLUME, "100");// 设置播放器音频流类型mTts.setParameter(SpeechConstant.STREAM_TYPE, "3");// 设置播放合成音频打断音乐播放,默认为truemTts.setParameter(SpeechConstant.KEY_REQUEST_FOCUS, "true");// 设置音频保存路径,需要申请WRITE_EXTERNAL_STORAGE权限,如不需保存注释该行代码mTts.setParameter(SpeechConstant.TTS_AUDIO_PATH,"./sdcard/iflytek.pcm");}//开始合成public void speak(String msg) {if (isInitSuccess){if (mTts.isSpeaking()) {stop();}mTts.startSpeaking(msg, this);}else {init();}}public void stop() {mTts.stopSpeaking();}@Overridepublic void onEvent(int eventType, int i1, int i2, Bundle bundle) {//以下代码用于获取与云端的会话id,当业务出错时将会话id提供给技术支持人员,可用于查询会话日志,定位出错原因if (SpeechEvent.EVENT_SESSION_ID == eventType) {String sid = bundle.getString(SpeechEvent.KEY_EVENT_SESSION_ID);}}@Overridepublic void onInit(int code) {if (code == ErrorCode.SUCCESS) {isInitSuccess = true;}}@Overridepublic void onSpeakBegin() {// 监听:开始播放}@Overridepublic void onBufferProgress(int percent, int beginPos, int endPos,String info) {// 合成进度}@Overridepublic void onSpeakPaused() {// 暂停播放}@Overridepublic void onSpeakResumed() {// 继续播放}@Overridepublic void onSpeakProgress(int percent, int beginPos, int endPos) {// 播放进度}@Overridepublic void onCompleted(SpeechError speechError) {if (speechError != null) {}}public void pause() {mTts.pauseSpeaking();}public void resume() {mTts.resumeSpeaking();}public void release() {if (null != mTts) {mTts.stopSpeaking();mTts.destroy(); //退出时释放}}}

在需要使用播放语音的地方调用即可

TTSUtils.getInstance().speak("hello,我想说的话在这里");

另外,记得在AndroidManifest.xml申请权限(6.0需要动态申请权限,参考博文Android 权限Permission大全及Android6.0动态申请步骤)

[html]view plaincopy<uses-permissionandroid:name="android.permission.RECORD_AUDIO"/> <uses-permissionandroid:name="android.permission.INTERNET"/> <uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permissionandroid:name="android.permission.ACCESS_WIFI_STATE"/> <uses-permissionandroid:name="android.permission.CHANGE_NETWORK_STATE"/> <uses-permissionandroid:name="android.permission.READ_PHONE_STATE"/> <uses-permissionandroid:name="android.permission.ACCESS_FINE_LOCATION"/> <uses-permissionandroid:name="android.permission.READ_CONTACTS"/> <uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permissionandroid:name="android.permission.WRITE_SETTINGS"/> <uses-permissionandroid:name="android.permission.READ_EXTERNAL_STORAGE"/>

其他补充

科大讯飞发音人SpeechConstant.VOICE_NAME修改

1、可以在官网试听

2、参数名称表

最后,注意一些坑

SpeechUtility.createUtility为null或SpeechSynthesizer为null时,会抛出init fail 初始化失败。项目会直接崩溃~~~ 这个讯飞有点过分了。

不过,这种情况出现的情况不多,注意一下就好。

1、一般是appid没有和下载SDK相对应;

2、还有SpeechUtility.createUtility(this, "") 需要放在主线程!

项目的Android SDK API较低时MyApplication会出现不在主线程....这个我也很无奈,然后放在需要用到语音的Activity页面OnCreate中初始化就好。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。