Android学习笔记---集成百度语音合成的坑与坑
程序员文章站
2022-05-14 13:05:06
...
每天一个小目标,早晚单车变摩托
今天本小菜遇到一个问题,就是项目中使用了科大讯飞的语音合成,由于没有审核,每天只有500次,但是远远不够用于测试,每天一上午就用完啦,于是乎,决定把科大讯飞的语音合成替换为百度语音合成,百度的免费次数又多,而且语音也比科大讯飞的好听 哈哈,下面进入正题(真的比科大讯飞的好听)
首先我们要先去百度语音开放平台 http://yuyin.baidu.com/ 我们去注册一个账号然后创建应用
选择咱们自己需要的服务即可
创建完应用之后点击查看key
记住KEY之后 我们点击SDK下载
下载到本地 接下来的就是集成了
打开APP目录
在自己的项目的配置文件中加入以下权限
<!-- 集成时请添加下列权限 --> <!-- 测试完成后,您自己的appId appKey secretKey 请在 SynthActivity 和 MiniActivity 中修改 --> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_SETTINGS" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
然后把jar包已经assets,jniLibs下面的东西都复制到咱们自己的项目
然后在项目中的build.gradle里面引用百度语音合成的jar包
之后我们就来写代码咯
先来用到一个工具类
转自:http://blog.csdn.net/aquarius_seven/article/details/76850292
TTSUtils.java
package com.th.hecheng; import android.content.Context; import android.os.Environment; import android.util.Log; import com.baidu.tts.client.SpeechError; import com.baidu.tts.client.SpeechSynthesizer; import com.baidu.tts.client.SpeechSynthesizerListener; import com.baidu.tts.client.TtsMode; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; /** * Created by As on 2017/8/7 */ public class TTSUtils implements SpeechSynthesizerListener { private static final String TAG = "TTSUtils"; private static volatile TTSUtils instance = null; private SpeechSynthesizer mSpeechSynthesizer; private static final String SAMPLE_DIR = Environment.getExternalStorageDirectory().getAbsolutePath() + "/baiduTTS/"; private static final String SPEECH_FEMALE_MODEL_NAME = "bd_etts_speech_female.dat"; private static final String TEXT_MODEL_NAME = "bd_etts_text.dat"; //===========================需要替换的部分======================================== private static final String APIKEY = "EOLInCg8QSnGx4GRHYngRQMj"; private static final String SECRETKEY = "ba86210f1cc6028d18884db928995e76"; private static final String APPID = "10261021"; //===========================需要替换的部分结束=========================================== private TTSUtils() { } public static TTSUtils getInstance() { if (instance == null) { synchronized (TTSUtils.class) { if (instance == null) { instance = new TTSUtils(); } } } return instance; } public void init(Context context) { File file = new File(SAMPLE_DIR); if (!file.exists()) { file.mkdirs(); } File textModelFile = new File(SAMPLE_DIR + TEXT_MODEL_NAME); if (!textModelFile.exists()) { copyAssetsFile2SDCard(context, TEXT_MODEL_NAME, SAMPLE_DIR + TEXT_MODEL_NAME); } File speechModelFile = new File(SAMPLE_DIR + SPEECH_FEMALE_MODEL_NAME); if (!speechModelFile.exists()) { copyAssetsFile2SDCard(context, SPEECH_FEMALE_MODEL_NAME, SAMPLE_DIR + SPEECH_FEMALE_MODEL_NAME); } // 获取语音合成对象实例 mSpeechSynthesizer = SpeechSynthesizer.getInstance(); // 设置context mSpeechSynthesizer.setContext(context); // 设置语音合成状态监听器 mSpeechSynthesizer.setSpeechSynthesizerListener(this); mSpeechSynthesizer.setApiKey(APIKEY, SECRETKEY); // 设置离线语音合成授权,需要填入从百度语音官网申请的app_id mSpeechSynthesizer.setAppId(APPID); // 设置语音合成文本模型文件 mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_TTS_TEXT_MODEL_FILE, SAMPLE_DIR + TEXT_MODEL_NAME); // 设置语音合成声音模型文件 mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_TTS_SPEECH_MODEL_FILE, SAMPLE_DIR + SPEECH_FEMALE_MODEL_NAME); // 发音人(在线引擎),可用参数为0,1,2,3。。。(服务器端会动态增加,各值含义参考文档,以文档说明为准。0--普通女声,1--普通男声,2--特别男声,3--情感男声。。。) mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_SPEAKER, "0"); // 设置Mix模式的合成策略 mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_MIX_MODE, SpeechSynthesizer.MIX_MODE_DEFAULT); // 初始化tts mSpeechSynthesizer.initTts(TtsMode.MIX); } //需要合成的msg长度不能超过1024个GBK字节。 public void speak(String msg) { int result = mSpeechSynthesizer.speak(msg); if (result < 0) { Log.e(TAG, "error,please look up error code = " + result + " in doc or URL:http://yuyin.baidu.com/docs/tts/122 "); } } public void pause() { mSpeechSynthesizer.pause(); } public void resume() { mSpeechSynthesizer.resume(); } public void stop() { mSpeechSynthesizer.stop(); } public void release() { if (null != mSpeechSynthesizer) { mSpeechSynthesizer.release(); } } @Override public void onSynthesizeStart(String s) { // 监听到合成开始,在此添加相关操作 } @Override public void onSynthesizeDataArrived(String s, byte[] bytes, int i) { // 监听到有合成数据到达,在此添加相关操作 } @Override public void onSynthesizeFinish(String s) { // 监听到合成结束,在此添加相关操作 } @Override public void onSpeechStart(String s) { // 监听到合成并播放开始,在此添加相关操作 } @Override public void onSpeechProgressChanged(String s, int i) { // 监听到播放进度有变化,在此添加相关操作 } @Override public void onSpeechFinish(String s) { // 监听到播放结束,在此添加相关操作 } @Override public void onError(String s, SpeechError speechError) { // 监听到出错,在此添加相关操作 } public static void copyAssetsFile2SDCard(Context context, String fileName, String path) { try { InputStream is = context.getAssets().open(fileName); FileOutputStream fos = new FileOutputStream(new File(path)); byte[] buffer = new byte[1024]; int byteCount = 0; while ((byteCount = is.read(buffer)) != -1) {// 循环从输入流读取buffer字节 fos.write(buffer, 0, byteCount);// 将读取的输入流写入到输出流 } fos.flush();// 刷新缓冲区 is.close(); fos.close(); } catch (IOException e) { Log.e(TAG, "copyAssetsFile2SDCard: " + e.toString()); } } }
其中需要替换的部分大家替换成自己的APPID和KEY即可
MainActivity.java
package com.th.hecheng; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //初始化百度语音合成 TTSUtils.getInstance().init(this); findViewById(R.id.button).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { TTSUtils.getInstance().speak("欢迎使用百度语音合成"); } }); } }
好了 我们来运行一下看看 已经可以说话了
下面说一下一个错误
解决方案1:出现此本地百度得到的信息是找不到so文件,只需要检查jniLibs目录下的So文件即可
解决方案2:在项目中的build.gradle中添加以下两句话
repositories {
flatDir {
dir 'libs'
}
}
android {
sourceSets {
main {
jniLibs.srcDir 'libs'
}
}
整体图
好了 百度语音合成到这里就结束了,希望能帮助到大家
demo下载地址
http://download.csdn.net/download/crackgmkey/10030522