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

Ps.

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

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

服务接入流程

【Android语音合成TTS】百度语音接入方法,和使用技巧详解_第1张图片

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

集成开发

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

【Android语音合成TTS】百度语音接入方法,和使用技巧详解_第2张图片

提示:

将开发包中的 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() {             @Override             public 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);}@Override    public 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使用详解


更多相关文章

  1. 多态在android中(利用接口调用服务中方法)的应用
  2. 什么是Android静默拍摄 Android静默拍摄app制作方法
  3. Eclipse在线升级Android ADT和SDK(4.x)方法介绍
  4. android UI进阶之android中隐藏的layout 抽屉的使用方法
  5. WebView的介绍与简单实现Android和H5互调的方法
  6. Android中module引入aar的方法

随机推荐

  1. Android系统启动流程(2) —— 解析Zygote
  2. Android中 GridLayout 【网格布局】 全面
  3. Android延长Toast的时间以及自定义Toast
  4. Android深入浅出系列课程---Lesson2 AAF1
  5. React-Native测试报告
  6. AsyncTask的使用详解
  7. android:gravity与android:layout_gravit
  8. android UI 配置参数
  9. 初学Android学到的关于LinearLayout的知
  10. [转]Jollen 的 Android 教學,#11: AndroidM