zoukankan      html  css  js  c++  java
  • 【从零之三(更)】自定义类中调用讯飞语音包错误解决办法

    原文: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在CODE上查看代码片派生到我的代码片
     
    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.         //设置发音人  
    16.         mSpeechSynthesizer.setParameter(SpeechConstant.VOICE_NAME, role);  
    17.         //获取语速  
    18.         int speed = mSharedPreferences.getInt(  
    19.                 getString(R.string.preference_key_tts_speed),  
    20.                 50);  
    21.         //设置语速  
    22.         mSpeechSynthesizer.setParameter(SpeechConstant.SPEED, ""+speed);  
    23.         //获取音量.  
    24.         int volume = mSharedPreferences.getInt(  
    25.                 getString(R.string.preference_key_tts_volume),  
    26.                 50);  
    27.         //设置音量  
    28.         mSpeechSynthesizer.setParameter(SpeechConstant.VOLUME, ""+volume);  
    29.         //获取语调  
    30.         int pitch = mSharedPreferences.getInt(  
    31.                 getString(R.string.preference_key_tts_pitch),  
    32.                 50);  
    33.         //设置语调  
    34.         mSpeechSynthesizer.setParameter(SpeechConstant.PITCH, ""+pitch);  
    35.         //获取合成文本.  
    36.         Editable editable = mSourceText.getText();  
    37.         String source = null;  
    38.         if (null != editable) {  
    39.             source = editable.toString();  
    40.         }  
    41.         //进行语音合成.  
    42.         mSpeechSynthesizer.startSpeaking(source, this);  
    43.         showTip(String.format(getString(R.string.tts_toast_format),0 ,0));  
    44.     }  


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

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


    注意!!!还没完,要到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()方法,参数传入你想输出的话,大功告成!!!

  • 相关阅读:
    刷题柱 -- 暂封
    模板重搭建計劃
    思路与好题记录与小技巧
    错误记录
    随便记点东西……
    图床
    杂碎的小技巧
    hnsdfz -- 6.21 -- day7
    hsdf -- 6.21 -- day6
    hnsdfz -- 6.20 -- day5
  • 原文地址:https://www.cnblogs.com/tc310/p/3995972.html
Copyright © 2011-2022 走看看