当前位置:   article > 正文

【Android语音合成TTS】百度语音接入方法,和使用技巧详解_tts语音引擎网络导入

tts语音引擎网络导入

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

Ps.

依托于百度开放云,百度语音为合作伙伴提供了业界领先、永久免费的语音技术服务,目前已上线的服务包括语音识别、语义解析、语音合成,后续会继续带来开放资源、多轮对话等技术服务;通过SDKREST 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以方便调用:

  1. package com.jph.tts;
  2. import android.content.Context;
  3. import android.media.AudioManager;
  4. import android.util.Log;
  5. import com.baidu.speechsynthesizer.SpeechSynthesizer;
  6. import com.baidu.speechsynthesizer.SpeechSynthesizerListener;
  7. import com.baidu.speechsynthesizer.publicutility.SpeechError;
  8. /**
  9. * 语音合成工具类
  10. *
  11. * @author JPH
  12. * @date 2015-4-14 下午1:33:37
  13. */
  14. public class SpeechUtil implements SpeechSynthesizerListener {
  15. protected static final int UI_LOG_TO_VIEW = 0;
  16. private SpeechSynthesizer speechSynthesizer;
  17. private Context context;
  18. public SpeechUtil(Context activity) {
  19. this.context = activity;
  20. init();
  21. }
  22. /**
  23. * 初始化合成相关组件
  24. *
  25. * @author JPH
  26. * @date 2015-4-14 下午1:36:53
  27. */
  28. private void init() {
  29. speechSynthesizer = new SpeechSynthesizer(context, "holder", this);
  30. // 此处需要将setApiKey方法的两个参数替换为你在百度开发者中心注册应用所得到的apiKey和secretKey
  31. speechSynthesizer.setApiKey("your apiKey",
  32. "your secretKey");
  33. speechSynthesizer.setAudioStreamType(AudioManager.STREAM_MUSIC);
  34. // activity.setVolumeControlStream(AudioManager.STREAM_MUSIC);
  35. setParams();
  36. }
  37. /**
  38. * 开始文本合成并朗读
  39. * @author JPH
  40. * @date 2015-4-14 下午1:47:05
  41. * @param content
  42. */
  43. public void speak(final String content) {
  44. new Thread(new Runnable() {
  45. @Override
  46. public void run() {
  47. // setParams();
  48. int ret = speechSynthesizer.speak(content.toString());
  49. if (ret != 0) {
  50. Log.e("inf","开始合成器失败:"+ret);
  51. }
  52. }
  53. }).start();
  54. }
  55. /**
  56. * 取消本次合成并停止朗读
  57. * @author JPH
  58. * @date 2015-4-14 下午2:20:33
  59. */
  60. public void cancle() {
  61. speechSynthesizer.cancel();
  62. }
  63. /**
  64. * 暂停文本朗读,如果没有调用speak(String)方法或者合成器初始化失败,该方法将无任何效果
  65. * @author JPH
  66. * @date 2015-4-14 下午2:21:07
  67. */
  68. public void pause() {
  69. speechSynthesizer.pause();
  70. }
  71. /**
  72. * 继续文本朗读,如果没有调用speak(String)方法或者合成器初始化失败,该方法将无任何效果
  73. * @author JPH
  74. * @date 2015-4-14 下午2:21:29
  75. */
  76. public void resume() {
  77. speechSynthesizer.resume();
  78. }
  79. /**
  80. * 为语音合成器设置相关参数
  81. * @author JPH
  82. * @date 2015-4-14 下午1:45:11
  83. */
  84. private void setParams() {
  85. speechSynthesizer.setParam(SpeechSynthesizer.PARAM_SPEAKER, "0");//发音人,目前支持女声(0)和男声(1)
  86. speechSynthesizer.setParam(SpeechSynthesizer.PARAM_VOLUME, "9");//音量,取值范围[0, 9],数值越大,音量越大
  87. speechSynthesizer.setParam(SpeechSynthesizer.PARAM_SPEED, "5");//朗读语速,取值范围[0, 9],数值越大,语速越快
  88. speechSynthesizer.setParam(SpeechSynthesizer.PARAM_PITCH, "5");//音调,取值范围[0, 9],数值越大,音量越高
  89. speechSynthesizer.setParam(SpeechSynthesizer.PARAM_AUDIO_ENCODE,
  90. SpeechSynthesizer.AUDIO_ENCODE_AMR);//音频格式,支持bv/amr/opus/mp3,取值详见随后常量声明
  91. speechSynthesizer.setParam(SpeechSynthesizer.PARAM_AUDIO_RATE,
  92. SpeechSynthesizer.AUDIO_BITRATE_AMR_15K85);//音频比特率,各音频格式支持的比特率详见随后常量声明
  93. }
  94. @Override
  95. public void onStartWorking(SpeechSynthesizer synthesizer) {
  96. Log.i("msg", "开始工作,请等待数据...");
  97. }
  98. @Override
  99. public void onSpeechStart(SpeechSynthesizer synthesizer) {
  100. Log.i("msg", "朗读开始");
  101. }
  102. @Override
  103. public void onSpeechResume(SpeechSynthesizer synthesizer) {
  104. Log.i("msg", "朗读继续");
  105. }
  106. @Override
  107. public void onSpeechProgressChanged(SpeechSynthesizer synthesizer,
  108. int progress) {
  109. // TODO Auto-generated method stub
  110. }
  111. @Override
  112. public void onSpeechPause(SpeechSynthesizer synthesizer) {
  113. Log.i("msg", "朗读已暂停");
  114. }
  115. @Override
  116. public void onSpeechFinish(SpeechSynthesizer synthesizer) {
  117. Log.i("msg", "朗读已停止");
  118. }
  119. @Override
  120. public void onNewDataArrive(SpeechSynthesizer synthesizer,
  121. byte[] audioData, boolean isLastData) {
  122. Log.i("msg", "新的音频数据:" + audioData.length
  123. + (isLastData ? "(end)" : ""));
  124. }
  125. @Override
  126. public void onError(SpeechSynthesizer synthesizer, SpeechError error) {
  127. Log.i("msg", "发生错误:" + error.errorDescription + "(" + error.errorCode
  128. + ")");
  129. }
  130. @Override
  131. public void onCancel(SpeechSynthesizer synthesizer) {
  132. Log.i("msg", "已取消");
  133. }
  134. @Override
  135. public void onBufferProgressChanged(SpeechSynthesizer synthesizer,
  136. int progress) {
  137. // TODO Auto-generated method stub
  138. }
  139. }

使用方法: 

  1. package com.jph.tts;
  2. import android.app.Activity;
  3. import android.os.Bundle;
  4. import android.text.method.ScrollingMovementMethod;
  5. import android.view.View;
  6. import android.view.View.OnClickListener;
  7. import android.widget.Button;
  8. import android.widget.EditText;
  9. import android.widget.TextView;
  10. import com.baidu.tts.sample.R;
  11. public class HomeActivity extends Activity implements OnClickListener {
  12. protected static final int UI_LOG_TO_VIEW = 0;
  13. private TextView logView;
  14. private EditText inputTextView;
  15. private Button startButton;
  16. private SpeechUtil speechUtil;
  17. @Override
  18. protected void onCreate(Bundle savedInstanceState) {
  19. super.onCreate(savedInstanceState);
  20. setContentView(R.layout.activity_home);
  21. logView = (TextView) findViewById(R.id.logView);
  22. logView.setMovementMethod(new ScrollingMovementMethod());
  23. inputTextView = (EditText) findViewById(R.id.inputTextView);
  24. speechUtil = new SpeechUtil(this);
  25. }
  26. @Override
  27. public void onClick(View v) {
  28. switch (v.getId()) {
  29. case R.id.btnStart:
  30. speechUtil.speak(inputTextView.getText().toString());
  31. break;
  32. case R.id.btnPause:
  33. speechUtil.pause();
  34. break;
  35. case R.id.btnResume:
  36. speechUtil.resume();
  37. break;
  38. case R.id.btnStop:
  39. speechUtil.cancle();
  40. break;
  41. default:
  42. break;
  43. }
  44. }
  45. }

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

  1. <uses-permission android:name="android.permission.INTERNET"></uses-permission>
  2. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
  3. <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
推荐阅读:

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


 

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

闽ICP备14008679号