原文:http://blog.csdn.net/monkeyduck/article/details/24302655

在科大讯飞语音包的Mscdemo中它的方法都是写在Activity中的,这样其实并不是很好,因为Activity只是负责UI交互的,如果项目很简单自然可以,但是一旦比较复杂肯定要自己定义很多包很多类,但是写在Activity中的方法就不能被自己定义的类调用了,咋办尼,那就把方法写在自己的类里就行了。
准备工作:把Msc.jar包和libmsc.so拷贝到自己工程的libs目录下,这样才能用它的方法和类。libmsc.so一定要用自己Id下载的包,因为这个包和你的那个appid是绑定的,拷贝别人的是不行的,会有用户校验失败的错误,我就困扰了很久很久。。。

以语音合成方法为例,我在自己的应用程序中需要调用它的合成函数,所以在自己的类里调用了它的synthetizeInSilence()方法。如下

[java] view plaincopy
  1. /**
  2. * 使用SpeechSynthesizer合成语音,不弹出合成Dialog.
  3. * @param
  4. */
  5. private void synthetizeInSilence() {
  6. if (null == mSpeechSynthesizer) {
  7. //创建合成对象.
  8. mSpeechSynthesizer = SpeechSynthesizer.createSynthesizer(this);
  9. }
  10. //设置合成发音人.
  11. String role = mSharedPreferences.getString(
  12. getString(R.string.preference_key_tts_role),
  13. getString(R.string.preference_default_tts_role));
  14. //设置发音人
  15. mSpeechSynthesizer.setParameter(SpeechConstant.VOICE_NAME, role);
  16. //获取语速
  17. int speed = mSharedPreferences.getInt(
  18. getString(R.string.preference_key_tts_speed),
  19. 50);
  20. //设置语速
  21. mSpeechSynthesizer.setParameter(SpeechConstant.SPEED, ""+speed);
  22. //获取音量.
  23. int volume = mSharedPreferences.getInt(
  24. getString(R.string.preference_key_tts_volume),
  25. 50);
  26. //设置音量
  27. mSpeechSynthesizer.setParameter(SpeechConstant.VOLUME, ""+volume);
  28. //获取语调
  29. int pitch = mSharedPreferences.getInt(
  30. getString(R.string.preference_key_tts_pitch),
  31. 50);
  32. //设置语调
  33. mSpeechSynthesizer.setParameter(SpeechConstant.PITCH, ""+pitch);
  34. //获取合成文本.
  35. Editable editable = mSourceText.getText();
  36. String source = null;
  37. if (null != editable) {
  38. source = editable.toString();
  39. }
  40. //进行语音合成.
  41. mSpeechSynthesizer.startSpeaking(source, this);
  42. showTip(String.format(getString(R.string.tts_toast_format),0 ,0));
  43. }

这里会遇到几个问题,一个是SpeechSynthesizer.createSynthesizer(this)方法中的this源程序是指Activity对象,因为这个参数要求是Context,即上下文对象,在Activity里可以写this,在自己类里写this就成指代类对象,自然报错了。解决办法是将自己的类继承Application,可以用getApplicationContext()方法获取Context对象。第二个错误就是mSharedPreferences,这里是定义很多参数,可有可无,不定义就用默认值,想定义就直接调用setParameter就可以了,在这偷个懒就用其默认值了,修改后的类书写如下。

[java] view plaincopy
  1. package dmcore.outputs;
  2. import android.app.Application;
  3. import android.content.Context;
  4. import com.iflytek.cloud.speech.SpeechError;
  5. import com.iflytek.cloud.speech.SpeechSynthesizer;
  6. import com.iflytek.cloud.speech.SynthesizerListener;
  7. public class MyOutput extends Application implements SynthesizerListener{
  8. //缓存对象.
  9. //private SharedPreferences mSharedPreferences;
  10. //合成对象.
  11. private SpeechSynthesizer mSpeechSynthesizer;
  12. private static Context context;
  13. public void onCreate() {
  14. super.onCreate();
  15. MyOutput.context = getApplicationContext();
  16. }
  17. public static Context getAppContext() {
  18. return MyOutput.context;
  19. }
  20. //-------------------------------------------------------------------------
  21. // Constructor
  22. //-------------------------------------------------------------------------
  23. public MyOutput(){
  24. }
  25. public void SetParameter(){
  26. if (mSpeechSynthesizer == null) {
  27. //创建合成对象.
  28. mSpeechSynthesizer = SpeechSynthesizer.createSynthesizer(context);
  29. }
  30. /*//设置合成发音人.
  31. String role = mSharedPreferences.getString(
  32. getString(R.string.preference_key_tts_role),
  33. getString(R.string.preference_default_tts_role));
  34. //设置发音人
  35. mSpeechSynthesizer.setParameter(SpeechConstant.VOICE_NAME, role);
  36. //获取语速
  37. int speed = mSharedPreferences.getInt(
  38. getString(R.string.preference_key_tts_speed),
  39. 50);
  40. //设置语速
  41. mSpeechSynthesizer.setParameter(SpeechConstant.SPEED, ""+speed);
  42. //获取音量.
  43. int volume = mSharedPreferences.getInt(
  44. getString(R.string.preference_key_tts_volume),
  45. 50);
  46. //设置音量
  47. mSpeechSynthesizer.setParameter(SpeechConstant.VOLUME, ""+volume);
  48. //获取语调
  49. int pitch = mSharedPreferences.getInt(
  50. getString(R.string.preference_key_tts_pitch),
  51. 50);
  52. //设置语调
  53. mSpeechSynthesizer.setParameter(SpeechConstant.PITCH, ""+pitch);*/
  54. }
  55. /**
  56. * 使用SpeechSynthesizer合成语音,不弹出合成Dialog.
  57. * @param
  58. */
  59. public void synthetizeInSilence(String SourceText) {
  60. //进行语音合成.
  61. mSpeechSynthesizer.startSpeaking(SourceText, this);
  62. }
  63. @Override
  64. public void onBufferProgress(int arg0, int arg1, int arg2, String arg3) {
  65. // TODO Auto-generated method stub
  66. }
  67. @Override
  68. public void onCompleted(SpeechError arg0) {
  69. // TODO Auto-generated method stub
  70. }
  71. @Override
  72. public void onSpeakBegin() {
  73. // TODO Auto-generated method stub
  74. }
  75. @Override
  76. public void onSpeakPaused() {
  77. // TODO Auto-generated method stub
  78. }
  79. @Override
  80. public void onSpeakProgress(int arg0, int arg1, int arg2) {
  81. // TODO Auto-generated method stub
  82. }
  83. @Override
  84. public void onSpeakResumed() {
  85. // TODO Auto-generated method stub
  86. }
  87. }

注意!!!还没完,要到Manifest.xml文件的application标签里加上你的类的位置,我的是android:name="dmcore.outputs.MyOutput",当然还要加上那些uses-permission,如下:
<uses-permission
android:name="android.permission.RECORD_AUDIO" />
<uses-permission
android:name="android.permission.INTERNET" />
<uses-permission
android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission
android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission
android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission
android:name="android.permission.READ_PHONE_STATE" />
<uses-permission 
android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission 
android:name="android.permission.READ_CONTACTS"/>

主函数中先创建MyOutput对象,再调用SetParameter方法,再调用synthetizeInSilence()方法,参数传入你想输出的话,大功告成!!!

转载于:https://www.cnblogs.com/tc310/p/3995972.html

【从零之三(更)】自定义类中调用讯飞语音包错误解决办法相关推荐

  1. Spring MVC普通类或工具类中调用service报空空指针的解决办法(调用service报java.lang.NullPointerException)...

    当我们在非Controller类中应用service的方法是会报空指针,如图: 这是因为Spring MVC普通类或工具类中调用service报空null的解决办法(调用service报java.la ...

  2. Spring MVC普通类或工具类中调用service报空空指针的解决办法(调用service报java.lang.NullPointerException)

    当我们在非Controller类中应用service的方法是会报空指针,如图: 这是因为Spring MVC普通类或工具类中调用service报空null的解决办法(调用service报java.la ...

  3. uni-app 调用讯飞语音。

    uni-app 调用讯飞语音. // //讯飞语音输入接口voice() {var me = this;var options = {};options.engine = 'iFly';options ...

  4. Android中集成讯飞语音,语音转文字以及文字转语音操作

    讯飞语音 * 在讯飞语音开发者平台上http://www.xfyun.cn/doccenter/newer具体准备工作按照开发文档操作.注意的是创建一个项目,appid和adk是一一对应的* 在这里, ...

  5. 安装SQL Server出现在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke的错误解决办法...

    以下是错误报告: 标题: SQL Server 安装程序失败. ------------------------------ SQL Server 安装程序遇到以下错误: 在创建窗口句柄之前,不能在控 ...

  6. html调用讯飞语音文本朗读,(原创)讯飞输入法的妙用:语音翻译+智能OCR + 文本转语音播报...

    重点: 语音翻译在第二,第三页: OCR: 也就是图片直接转文本的功能介绍在第三,第四页: 把转出来的文本直接朗读,并且配上背景音乐的介绍在第八页 - 第十二页: 前几年有人问我手机上有没有那种可以读 ...

  7. ajax 调用服务器接口报403错误解决办法

    发现问题 在前端页面中远程调用服务器接口时报403错误,而直接在浏览器访问则不会报错. Ajax调用结果: 浏览器调用结果: 报403原因 经过分析发现是因为前端和服务器的域名不同而触发了防盗链机制. ...

  8. SpringBoot在自定义类中调用service层等Spring其他层

    解决方案: 1.上代码@Component public class ServerHandler extends IoHandlerAdapter {@Autowiredprotected Healt ...

  9. python调用讯飞语音听写(流式版)

    目录 一.引入所需要的包 二.定义相关常量 三.生成请求url 四.音频相关 1. 首先使用pyaudio获取音频流 2. 从音频流中获取音频并上传到接口 五.语音识别接口调用 六.返回结果处理 七. ...

最新文章

  1. 在AI领域每月投资一次,全面解析腾讯的人工智能奇招
  2. 当顶流厂商谈论智能手表,他们到底在谈论什么
  3. MATLAB-向量相关计算
  4. 快手小店电脑版_微信PC版更新!支持在小程序中使用微信支付 | 一周资讯
  5. 2017一季度JAVA面试题锦集
  6. Cacti设置流量阀值实现邮件报警
  7. html的div块float后宽度无效,行内元素(例如)设置float之后才能用width调整宽度...
  8. 使用弹出窗体修改数据,之后返回值
  9. 201671010139 徐楠 关于学习继承
  10. Google搜索网址
  11. 美团开放平台品牌商接口对接步骤(Java)
  12. 头条号项目玩法:中视频全方位教学
  13. day21_Lambda表达式、函数式接口
  14. 中国通信简史 (下)
  15. 由《樱桃小丸子》想到的……(未完成)
  16. 揭秘广告软文的五种写法
  17. B-树和B+树的区别
  18. 高级定时器实例-PWM互补输出与刹车功能
  19. android 开源项目(转)
  20. JavaScript工作面试常用知识点总结大全

热门文章

  1. 前端面试题node.js汇总
  2. React开发(223):详情页根据数组map处理返回值
  3. 前端学习(3199):jsx小练习
  4. 前端学习(3118):react-hello-react的解决类中方法的this
  5. [html] 说说如果a链接href=““(空)时点击时会有什么表现?
  6. [vue-cli]怎么使用vue-cli3创建一个项目?
  7. 前端学习(2117):为什么组件data必须是函数
  8. oracle之基本的sql_select语句之课后练习
  9. 前端学习(1):HTML和CSS导学
  10. Java面试题 20在面向对象编程里,经常使用is-a来说明对象之间的继承关系