生活随笔
收集整理的這篇文章主要介紹了
【从零之三(更)】自定义类中调用讯飞语音包错误解决办法
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
原文:http://blog.csdn.net/monkeyduck/article/details/24302655
在科大訊飛語音包的Mscdemo中它的方法都是寫在Activity中的,這樣其實并不是很好,因為Activity只是負(fù)責(zé)UI交互的,如果項目很簡單自然可以,但是一旦比較復(fù)雜肯定要自己定義很多包很多類,但是寫在Activity中的方法就不能被自己定義的類調(diào)用了,咋辦尼,那就把方法寫在自己的類里就行了。
準(zhǔn)備工作:把Msc.jar包和libmsc.so拷貝到自己工程的libs目錄下,這樣才能用它的方法和類。libmsc.so一定要用自己Id下載的包,因為這個包和你的那個appid是綁定的,拷貝別人的是不行的,會有用戶校驗失敗的錯誤,我就困擾了很久很久。。。
以語音合成方法為例,我在自己的應(yīng)用程序中需要調(diào)用它的合成函數(shù),所以在自己的類里調(diào)用了它的synthetizeInSilence()方法。如下
?
[java]?view plaincopy
private?void?synthetizeInSilence()?{??????if?(null?==?mSpeechSynthesizer)?{??????????????????????????mSpeechSynthesizer?=?SpeechSynthesizer.createSynthesizer(this);??????????}??????????????????String?role?=?mSharedPreferences.getString(??????????????????getString(R.string.preference_key_tts_role),??????????????????getString(R.string.preference_default_tts_role));????????????????????????????mSpeechSynthesizer.setParameter(SpeechConstant.VOICE_NAME,?role);??????????????????int?speed?=?mSharedPreferences.getInt(??????????????????getString(R.string.preference_key_tts_speed),??????????????????50);??????????????????mSpeechSynthesizer.setParameter(SpeechConstant.SPEED,?""+speed);??????????????????int?volume?=?mSharedPreferences.getInt(??????????????????getString(R.string.preference_key_tts_volume),??????????????????50);??????????????????mSpeechSynthesizer.setParameter(SpeechConstant.VOLUME,?""+volume);??????????????????int?pitch?=?mSharedPreferences.getInt(??????????????????getString(R.string.preference_key_tts_pitch),??????????????????50);??????????????????mSpeechSynthesizer.setParameter(SpeechConstant.PITCH,?""+pitch);??????????????????Editable?editable?=?mSourceText.getText();??????????String?source?=?null;??????????if?(null?!=?editable)?{??????????????source?=?editable.toString();??????????}??????????????????mSpeechSynthesizer.startSpeaking(source,?this);??????????showTip(String.format(getString(R.string.tts_toast_format),0?,0));??????}??
這里會遇到幾個問題,一個是SpeechSynthesizer.createSynthesizer(this)方法中的this源程序是指Activity對象,因為這個參數(shù)要求是Context,即上下文對象,在Activity里可以寫this,在自己類里寫this就成指代類對象,自然報錯了。解決辦法是將自己的類繼承Application,可以用getApplicationContext()方法獲取Context對象。第二個錯誤就是mSharedPreferences,這里是定義很多參數(shù),可有可無,不定義就用默認(rèn)值,想定義就直接調(diào)用setParameter就可以了,在這偷個懶就用其默認(rèn)值了,修改后的類書寫如下。
?
?
[java]?view plaincopy
package?dmcore.outputs;??import?android.app.Application;??import?android.content.Context;????import?com.iflytek.cloud.speech.SpeechError;??import?com.iflytek.cloud.speech.SpeechSynthesizer;??import?com.iflytek.cloud.speech.SynthesizerListener;????public?class?MyOutput?extends?Application?implements?SynthesizerListener{??????????????????private?SpeechSynthesizer?mSpeechSynthesizer;??????private?static?Context?context;?????????public?void?onCreate()?{??????????super.onCreate();??????????MyOutput.context?=?getApplicationContext();??????}????????public?static?Context?getAppContext()?{??????????return?MyOutput.context;??????}????????????????????????public?MyOutput(){????????????????}??????public?void?SetParameter(){??????????if?(mSpeechSynthesizer?==?null)?{??????????????????????????mSpeechSynthesizer?=?SpeechSynthesizer.createSynthesizer(context);??????????}??????????????}??????????public?void?synthetizeInSilence(String?SourceText)?{??????????????????mSpeechSynthesizer.startSpeaking(SourceText,?this);??????}????????????@Override??????public?void?onBufferProgress(int?arg0,?int?arg1,?int?arg2,?String?arg3)?{????????????????????????}??????@Override??????public?void?onCompleted(SpeechError?arg0)?{????????????????????????}??????@Override??????public?void?onSpeakBegin()?{????????????????????????}??????@Override??????public?void?onSpeakPaused()?{????????????????????????}??????@Override??????public?void?onSpeakProgress(int?arg0,?int?arg1,?int?arg2)?{????????????????????????}??????@Override??????public?void?onSpeakResumed()?{????????????????????????}??}??
注意!!!還沒完,要到Manifest.xml文件的application標(biāo)簽里加上你的類的位置,我的是android:name="dmcore.outputs.MyOutput",當(dāng)然還要加上那些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"/>
主函數(shù)中先創(chuàng)建MyOutput對象,再調(diào)用SetParameter方法,再調(diào)用synthetizeInSilence()方法,參數(shù)傳入你想輸出的話,大功告成!!!
轉(zhuǎn)載于:https://www.cnblogs.com/tc310/p/3995972.html
總結(jié)
以上是生活随笔為你收集整理的【从零之三(更)】自定义类中调用讯飞语音包错误解决办法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。