当前位置:   article > 正文

关于科大讯飞语音合成的开发(先写个本地的,简单)_科大讯飞 文字转语音 armsdk

科大讯飞 文字转语音 armsdk

1、首先在科大讯飞官网申请应用下载语音合成SDK,在项目中导入Msc.jar包,别忘了还有armeabi目录下的文件。然后建一个语音合成的工具类SpeechUtil_xf,具体代码下面贴出来,相信大家看注释已经很清楚了;

  1. package com.chainway.nursestation.tool;
  2. import com.iflytek.cloud.ErrorCode;
  3. import com.iflytek.cloud.InitListener;
  4. import com.iflytek.cloud.SpeechConstant;
  5. import com.iflytek.cloud.SpeechError;
  6. import com.iflytek.cloud.SpeechSynthesizer;
  7. import com.iflytek.cloud.SpeechUtility;
  8. import com.iflytek.cloud.SynthesizerListener;
  9. import com.iflytek.cloud.util.ResourceUtil;
  10. import com.iflytek.cloud.util.ResourceUtil.RESOURCE_TYPE;
  11. import android.content.Context;
  12. import android.os.Bundle;
  13. import android.os.Environment;
  14. import android.util.Log;
  15. import android.widget.Toast;
  16. /**
  17. * 科大讯飞的语音合成工具类
  18. * @author wushengjun
  19. * @date 2016年8月23日
  20. */
  21. public class SpeechUtil_xf {
  22. private String TAG = "SpeechUtil_xf";
  23. private Context context;
  24. private String app_id = "57bbbdf5";
  25. //语音合成对象
  26. private SpeechSynthesizer mSpeechSynthesizer;
  27. // 默认云端发音人
  28. public static String voicerCloud="xiaoyan";
  29. // 默认本地发音人
  30. public static String voicerLocal="xiaoyan";
  31. // 引擎类型
  32. private String mEngineType = SpeechConstant.TYPE_LOCAL;
  33. private int speed = 50; //合成语音音速
  34. private int pitch = 50; //合成语音音调
  35. private int volume = 100; //合成语音音量,0-100
  36. private int stream_type = 3; //播放器的音频流类型
  37. private boolean isInterrupt = true; //播放合成音频打断音乐播放,默认为true
  38. private String audio_formal = "wav"; //音频格式,只支持wav和pcm格式
  39. public SpeechUtil_xf(Context context) {
  40. this.context = context;
  41. setAppId(); //一定要在语音合成对象实例化前设置,不然会报21001错误(没有安装语音组件)
  42. init();
  43. setParams();
  44. }
  45. /**
  46. * 初始化语音合成
  47. */
  48. private void init() {
  49. mSpeechSynthesizer = SpeechSynthesizer.createSynthesizer(context, mInitListener);
  50. }
  51. /**
  52. * 设置语音合成的参数
  53. */
  54. private void setParams() {
  55. // 清空参数
  56. mSpeechSynthesizer.setParameter(SpeechConstant.PARAMS, null);
  57. //设置合成的模式
  58. //设置使用本地引擎
  59. mSpeechSynthesizer.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_LOCAL);
  60. //设置发音人资源路径
  61. mSpeechSynthesizer.setParameter(ResourceUtil.TTS_RES_PATH, getResourcePath());
  62. //设置发音人
  63. mSpeechSynthesizer.setParameter(SpeechConstant.VOICE_NAME, voicerLocal);
  64. //设置合成音速
  65. mSpeechSynthesizer.setParameter(SpeechConstant.SPEED, String.valueOf(speed));
  66. //设置合成音调
  67. mSpeechSynthesizer.setParameter(SpeechConstant.PITCH, String.valueOf(pitch));
  68. //设置合成音量
  69. mSpeechSynthesizer.setParameter(SpeechConstant.VOLUME, String.valueOf(volume));
  70. //设置播放器音频流类型
  71. mSpeechSynthesizer.setParameter(SpeechConstant.STREAM_TYPE, String.valueOf(stream_type));
  72. // 设置播放合成音频打断音乐播放,默认为true
  73. mSpeechSynthesizer.setParameter(SpeechConstant.KEY_REQUEST_FOCUS, String.valueOf(isInterrupt));
  74. // 设置合成音频格式,只支持wav和pcm格式
  75. mSpeechSynthesizer.setParameter(SpeechConstant.AUDIO_FORMAT, audio_formal);
  76. mSpeechSynthesizer.setParameter(SpeechConstant.TTS_AUDIO_PATH, Environment.getExternalStorageDirectory()+"/xf_yuyin/tts.wav");
  77. }
  78. /**
  79. * 开始合成语音并播放
  80. * @param content 播放内容
  81. * @return 播放结果码
  82. */
  83. public int startSpeak(String content) {
  84. // setParams();
  85. int result = mSpeechSynthesizer.startSpeaking(content, mTtsListener);
  86. if(result != ErrorCode.SUCCESS) {
  87. toastMessage("语音合成失败,错误码: " + result);
  88. }
  89. return result;
  90. }
  91. /**
  92. * 开始合成语音并播放
  93. * @param content 播放内容的资源id
  94. * @return 播放结果码
  95. */
  96. public int startSpeak(int resId) {
  97. return startSpeak(context.getString(resId));
  98. }
  99. /**
  100. * 初始化监听
  101. */
  102. private InitListener mInitListener = new InitListener() {
  103. @Override
  104. public void onInit(int arg0) {
  105. // TODO Auto-generated method stub
  106. Log.d(TAG, "InitListener init, code=" + arg0);
  107. if(arg0 != ErrorCode.SUCCESS) {
  108. toastMessage("初始化失败,错误码:" + arg0);
  109. } else {
  110. }
  111. }
  112. };
  113. /**
  114. * 合成回调监听。
  115. */
  116. private SynthesizerListener mTtsListener = new SynthesizerListener() {
  117. @Override
  118. public void onSpeakBegin() {
  119. //开始播放
  120. }
  121. @Override
  122. public void onSpeakPaused() {
  123. //暂停播放
  124. }
  125. @Override
  126. public void onSpeakResumed() {
  127. //"继续播放")
  128. }
  129. @Override
  130. public void onBufferProgress(int percent, int beginPos, int endPos,
  131. String info) {
  132. // 合成进度
  133. }
  134. @Override
  135. public void onSpeakProgress(int percent, int beginPos, int endPos) {
  136. // 播放进度
  137. }
  138. @Override
  139. public void onCompleted(SpeechError error) {
  140. if (error == null) { //播放完成
  141. } else {
  142. toastMessage("code=" + error.getErrorCode() + ",msg=" + error.getErrorDescription());
  143. }
  144. }
  145. @Override
  146. public void onEvent(int eventType, int arg1, int arg2, Bundle obj) {
  147. // 以下代码用于获取与云端的会话id,当业务出错时将会话id提供给技术支持人员,可用于查询会话日志,定位出错原因
  148. // 若使用本地能力,会话id为null
  149. }
  150. };
  151. /**
  152. * 获取本地assets文件夹下的发音人资源路径
  153. */
  154. private String getResourcePath() {
  155. StringBuffer tempBuffer = new StringBuffer();
  156. //合成通用资源
  157. tempBuffer.append(ResourceUtil.generateResourcePath(context, RESOURCE_TYPE.assets, "tts/common.jet"));
  158. tempBuffer.append(";");
  159. //发音人资源
  160. tempBuffer.append(ResourceUtil.generateResourcePath(context, RESOURCE_TYPE.assets, "tts/"+ voicerLocal +".jet"));
  161. return tempBuffer.toString();
  162. }
  163. /** 应用程序入口处调用,避免手机内存过小,杀死后台进程后通过历史intent进入Activity造成SpeechUtility对象为null
  164. * 注意:此接口在非主进程调用会返回null对象,如需在非主进程使用语音功能,请增加参数:SpeechConstant.FORCE_LOGIN+"=true"
  165. * 参数间使用“,”分隔。
  166. * 设置你申请的应用appid
  167. * 注意: appid 必须和下载的SDK保持一致,否则会出现10407错误
  168. * 一定要在语音合成对象实例化前设置,不然会报21001错误(没有安装语音组件)
  169. */
  170. private void setAppId() {
  171. StringBuffer param = new StringBuffer();
  172. param.append("appid="+app_id);
  173. param.append(",");
  174. // 设置使用v5+
  175. param.append(SpeechConstant.ENGINE_MODE+"="+SpeechConstant.MODE_MSC);
  176. SpeechUtility.createUtility(context, param.toString());
  177. }
  178. public void toastMessage(String msg) {
  179. Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();
  180. }
  181. public void toastMessage(int resId) {
  182. Toast.makeText(context, resId, Toast.LENGTH_SHORT).show();
  183. }
  184. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214
  • 215
  • 216
  • 217
  • 218
  • 219

2、剩下的就是在自定义Application里创建这个语音合成对象,调用它的startSpeak(String content)方法即可,传入参数就是要播放的语音内容,还可传入资源文件对应id;

  1. /*
  2. * 科大讯飞语音声明
  3. */
  4. private SpeechUtil_xf mXFSpeech;
  5. private int playType = 1; //用哪种播放,1科大讯飞
  6. private boolean isPlay = true; //是否播放语音
  7. public static SysApplication getInstance() {
  8. return instance;
  9. }
  10. @Override
  11. public void onCreate() {
  12. super.onCreate();
  13. applicationContext = this;
  14. instance = this;
  15. mSpeechUtil = new SpeechUtil(SysApplication.this); //实例化语音合成类
  16. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

3、在哪个地方需要文字转语音便调用Application类的这个方法即可;

  1. public void speak(String content) {
  2. if(isPlay) {
  3. if(playType == 1) {
  4. speaking(content);
  5. }
  6. }
  7. }
  8. public void speak(int resId) {
  9. speak(getString(resId));
  10. }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

4、差点忘了,还要申请权限

  1. <uses-permission android:name="android.permission.RECORD_AUDIO" />
  2. <!-- 云播放需要网络权限,本地的就不用了 -->
  3. <uses-permission
  4. android:name="android.permission.INTERNET" />
  5. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  6. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
  7. <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
  8. <uses-permission android:name="android.permission.READ_PHONE_STATE" />
  9. <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
  10. <uses-permission android:name="android.permission.READ_CONTACTS" />
  11. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  12. <uses-permission android:name="android.permission.WRITE_SETTINGS" />
  13. <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

5、大功告成!现在基本的功能已经完成了。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/830480
推荐阅读
相关标签
  

闽ICP备14008679号