请尊重他人的劳动成果,转载请注明出处:【Android语音合成TTS】百度语音接入方法,和使用技巧详解

Ps.

依托于百度开放云,百度语音为合作伙伴提供了业界领先、永久免费的语音技术服务,目前已上线的服务包括语音识别、语义解析、语音合成,后续会继续带来开放资源、多轮对话等技术服务;通过SDK、REST API及离线开发包等多种服务方式,满足不同开发者的开发需求。

目前百度语音提供免费的语音接入,语音合成质量尚可,但还没开放离线TTS。

服务接入流程

具体详情可查看:http://yuyin.baidu.com/dev.php

集成开发

导入百度语音的相关jar包和so文件如图:

提示:

将开发包中的 libs目录整体拷贝到工程目录,libs目录包括了各平台的 SO库,开发者视应用需要可以进行删减。galaxy_lite.jar是百度 Android公共基础库,如果项目中还集成了其它百度 SDK,如 PushSDK,在打包过程中出现类似如下的错误信息:

[2013-10-22 11:02:57 - Dex Loader] Unableto execute dex: Multiple dex files defineLcom/baidu/android/common/logging/Configuration; [2013-10-22 11:02:57 -VoiceRecognitionDemo] Conversion to Dalvik format failed: Unable to executedex: Multiple dex files define Lcom/baidu/android/common/logging/Configuration;

请将此 Jar 包移除。如果 Eclipse ADT版本插件低于 17,需要手工添加依赖库,添加方法为:Project => Properties => Java Build Path => Libraries => AddJAR... 3

为了方便使用我这里将百度语音合成引擎做了进一步的封装,封装成了SpeechUtil以方便调用:

package com.jph.tts;import android.content.Context;
import android.media.AudioManager;
import android.util.Log;import com.baidu.speechsynthesizer.SpeechSynthesizer;
import com.baidu.speechsynthesizer.SpeechSynthesizerListener;
import com.baidu.speechsynthesizer.publicutility.SpeechError;/*** 语音合成工具类* * @author JPH* @date 2015-4-14 下午1:33:37*/
public class SpeechUtil implements SpeechSynthesizerListener {protected static final int UI_LOG_TO_VIEW = 0;private SpeechSynthesizer speechSynthesizer;private Context context;public SpeechUtil(Context activity) {this.context = activity;init();}/*** 初始化合成相关组件* * @author JPH* @date 2015-4-14 下午1:36:53*/private void init() {speechSynthesizer = new SpeechSynthesizer(context, "holder", this);// 此处需要将setApiKey方法的两个参数替换为你在百度开发者中心注册应用所得到的apiKey和secretKeyspeechSynthesizer.setApiKey("your apiKey","your secretKey");speechSynthesizer.setAudioStreamType(AudioManager.STREAM_MUSIC);
//      activity.setVolumeControlStream(AudioManager.STREAM_MUSIC);setParams();}/*** 开始文本合成并朗读* @author JPH* @date 2015-4-14 下午1:47:05* @param content*/public void speak(final String content) {new Thread(new Runnable() {@Overridepublic void run() {
//                 setParams();int ret = speechSynthesizer.speak(content.toString());if (ret != 0) {Log.e("inf","开始合成器失败:"+ret);}}}).start();}/*** 取消本次合成并停止朗读* @author JPH* @date 2015-4-14 下午2:20:33*/public void cancle() {speechSynthesizer.cancel();}/*** 暂停文本朗读,如果没有调用speak(String)方法或者合成器初始化失败,该方法将无任何效果* @author JPH* @date 2015-4-14 下午2:21:07*/public void pause() {speechSynthesizer.pause();}/*** 继续文本朗读,如果没有调用speak(String)方法或者合成器初始化失败,该方法将无任何效果* @author JPH* @date 2015-4-14 下午2:21:29*/public void resume() {speechSynthesizer.resume();}/*** 为语音合成器设置相关参数* @author JPH* @date 2015-4-14 下午1:45:11*/private void setParams() {speechSynthesizer.setParam(SpeechSynthesizer.PARAM_SPEAKER, "0");//发音人,目前支持女声(0)和男声(1) speechSynthesizer.setParam(SpeechSynthesizer.PARAM_VOLUME, "9");//音量,取值范围[0, 9],数值越大,音量越大speechSynthesizer.setParam(SpeechSynthesizer.PARAM_SPEED, "5");//朗读语速,取值范围[0, 9],数值越大,语速越快speechSynthesizer.setParam(SpeechSynthesizer.PARAM_PITCH, "5");//音调,取值范围[0, 9],数值越大,音量越高speechSynthesizer.setParam(SpeechSynthesizer.PARAM_AUDIO_ENCODE,SpeechSynthesizer.AUDIO_ENCODE_AMR);//音频格式,支持bv/amr/opus/mp3,取值详见随后常量声明speechSynthesizer.setParam(SpeechSynthesizer.PARAM_AUDIO_RATE,SpeechSynthesizer.AUDIO_BITRATE_AMR_15K85);//音频比特率,各音频格式支持的比特率详见随后常量声明}@Overridepublic void onStartWorking(SpeechSynthesizer synthesizer) {Log.i("msg", "开始工作,请等待数据...");}@Overridepublic void onSpeechStart(SpeechSynthesizer synthesizer) {Log.i("msg", "朗读开始");}@Overridepublic void onSpeechResume(SpeechSynthesizer synthesizer) {Log.i("msg", "朗读继续");}@Overridepublic void onSpeechProgressChanged(SpeechSynthesizer synthesizer,int progress) {// TODO Auto-generated method stub}@Overridepublic void onSpeechPause(SpeechSynthesizer synthesizer) {Log.i("msg", "朗读已暂停");}@Overridepublic void onSpeechFinish(SpeechSynthesizer synthesizer) {Log.i("msg", "朗读已停止");}@Overridepublic void onNewDataArrive(SpeechSynthesizer synthesizer,byte[] audioData, boolean isLastData) {Log.i("msg", "新的音频数据:" + audioData.length+ (isLastData ? "(end)" : ""));}@Overridepublic void onError(SpeechSynthesizer synthesizer, SpeechError error) {Log.i("msg", "发生错误:" + error.errorDescription + "(" + error.errorCode+ ")");}@Overridepublic void onCancel(SpeechSynthesizer synthesizer) {Log.i("msg", "已取消");}@Overridepublic void onBufferProgressChanged(SpeechSynthesizer synthesizer,int progress) {// TODO Auto-generated method stub}
}

使用方法:

package com.jph.tts;import android.app.Activity;
import android.os.Bundle;
import android.text.method.ScrollingMovementMethod;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;import com.baidu.tts.sample.R;public class HomeActivity extends Activity implements OnClickListener {protected static final int UI_LOG_TO_VIEW = 0;private TextView logView;private EditText inputTextView;private Button startButton;private SpeechUtil speechUtil;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_home);logView = (TextView) findViewById(R.id.logView);logView.setMovementMethod(new ScrollingMovementMethod());inputTextView = (EditText) findViewById(R.id.inputTextView);speechUtil = new SpeechUtil(this);}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.btnStart:speechUtil.speak(inputTextView.getText().toString());break;case R.id.btnPause:speechUtil.pause();break;case R.id.btnResume:speechUtil.resume();break;case R.id.btnStop:speechUtil.cancle();break;default:break;}}
}

因为百度TTS需要联网解析所以要赋予应用相应的权限:

<uses-permission android:name="android.permission.INTERNET"></uses-permission><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission><uses-permission android:name="android.permission.READ_PHONE_STATE"/>

推荐阅读:

【Android语音合成TTS】国内主流引擎对比 
【Android语音合成TTS】云知声离线TTS使用详解

【Android语音合成TTS】百度语音接入方法,和使用技巧详解相关推荐

  1. android sdk 环境签名,SDK接入必备常识——keystore签名文件详解

    已经在使用u8sdk的童鞋应该知道,我们在u8sdk中增加了签名相关的配置.但是,有很多对Android不了解的童鞋,对签名文件还是了解甚少.关于u8sdk中自定义签名文件可以看之前的博客(自定义签名 ...

  2. 汽车中控屏显示com点android,手机映射车载中控屏方法 手机映射功能详解

    用usb数据线的两端连接上手机和中控,连接成功后就能够映射到车载中控屏上了,车载蓝牙和手机蓝牙匹配成功后也能够映射到车载中控屏上,手机打开热点,中控连接上热点也可以映射到车载中控屏. 手机映射功能 汽 ...

  3. 安卓(Android)开发百度语音唤醒(识别)

    安卓(Android)开发百度语音唤醒(识别) 目录 安卓(Android)开发百度语音唤醒(识别) 一:准备 1:获取自定义唤醒词 2:SDK下载 3:将bdasr_V3_xxx_xxx.jar引入 ...

  4. Android JNI使用方法,JNI机制详解

    Android JNI使用方法,JNI机制详解 JNI的出现使得开发者既可以利用Java语言跨平台.类库丰 富.开发便捷等特点,又可以利用Native语言的高效. JNI是JVM实现中的一部分,因此N ...

  5. Android基础入门教程——2.3.1 TextView(文本框)详解

    Android基础入门教程--2.3.1 TextView(文本框)详解 标签(空格分隔): Android基础入门教程 本节引言: 学习完Android中的六大布局,从本节开始我们来一个个讲解And ...

  6. 【百度联盟峰会】李彦宏详解AI时代思维方式,算法驱动的降维攻击

     [百度联盟峰会]李彦宏详解AI时代思维方式,算法驱动的降维攻击 新智元 2017-05-23 14:51:52 李彦宏 手机 百度 阅读(20879) 评论(19) 新智元报道 来源:百度 [新 ...

  7. 百度提前批-百度智能小程序(面经详解)

    文章目录 百度提前批-百度智能小程序(面经详解) 1.定位 2.z-index .层叠 3.作用域(scope) 4.单例模式 5.原型链 6.继承(借用构造函数,寄生组合继承,缺点是什么) 7.闭包 ...

  8. Android四大组件之——Activity的生命周期(图文详解)

        转载请在文章开头处注明本博客网址:http://www.cnblogs.com/JohnTsai       联系方式:JohnTsai.Work@gmail.com       [Andro ...

  9. android相册和拍照并裁剪图片大小,Android 拍照并对照片进行裁剪和压缩实例详解...

    Android 拍照并对照片进行裁剪和压缩实例详解 本文主要介绍 Android 调用摄像头拍照并对照片进行裁剪和压缩,文中给出了主要步骤和关键代码. 调用摄像头拍照,对拍摄照片进行裁剪,代码如下. ...

最新文章

  1. 家庭中计算机应用包括,《管理信息系统中计算机应用》沟通考笔试B卷答案
  2. PyCharm安装及配置
  3. C#多线程之旅(4)——APM初探
  4. Spring Cloud脚手架源码
  5. 视频|每日CeBIT:沃森机器人走进生活、三星无线很便利
  6. 原生js实现选中所有的checkbox
  7. JQuery的Alert插件介绍
  8. 用U盘安装一个Linux系统
  9. python3字典详解_Python3实现的字典遍历操作详解
  10. 莱维特LEWITT声卡驱动安装设置方法
  11. 打开WORD文档出错提示
  12. Description Resource Path Location Type The import collides with another import statement
  13. 石溪大学计算机科学咋么样,弗吉尼亚理工和石溪大学的计算机科学专业哪个好?为啥?...
  14. 类ku6未注册域名分享
  15. Resistors in Parallel(找规律+大数)
  16. 华为机试python打印机_华为校园招聘上机笔试题 扑克牌大小(python)
  17. Dell笔记本拆机加内存条
  18. 在iPad应用中嵌入字体的方法——非人云亦云版
  19. 软件工程7-软件测试
  20. 即将踏入工作,你对公司的若干职简称了解么?(CEO、CFO、CTO、CDO、CAO ...)

热门文章

  1. CCAI中国人工智能大会活动第一天报道
  2. 流畅看1080p、2k、4k视频需要多大带宽?
  3. 当前时间转换为yy-mm-dd hh:mm:ss格式
  4. dnf一换线就服务器不稳定,网吧路由多线路环境下出现DNF换频道就掉线的问题解决方法...
  5. 手机用蓝牙键盘好使吗_最好用的蓝牙键盘
  6. 揭秘Deepfake换脸视频背后的技术细节
  7. 怎么在公众号添加附件链接(Word、Excel、Pdf等)
  8. 淘宝api app版淘宝店铺商品
  9. js 判断数据类型的四种方法
  10. 环保,IT也需要环保,世界需要环保.