日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/10 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【从零之三(更)】自定义类中调用讯飞语音包错误解决办法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原文: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
  • /**?
  • ?*?使用SpeechSynthesizer合成語音,不彈出合成Dialog.?
  • *?@param?
  • */??
  • 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對象,因為這個參數要求是Context,即上下文對象,在Activity里可以寫this,在自己類里寫this就成指代類對象,自然報錯了。解決辦法是將自己的類繼承Application,可以用getApplicationContext()方法獲取Context對象。第二個錯誤就是mSharedPreferences,這里是定義很多參數,可有可無,不定義就用默認值,想定義就直接調用setParameter就可以了,在這偷個懶就用其默認值了,修改后的類書寫如下。

    ?

    ?

    [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?SharedPreferences?mSharedPreferences;??
  • ????//合成對象.??
  • ????private?SpeechSynthesizer?mSpeechSynthesizer;??
  • ????private?static?Context?context;???
  • ??
  • ????public?void?onCreate()?{??
  • ????????super.onCreate();??
  • ????????MyOutput.context?=?getApplicationContext();??
  • ????}??
  • ??
  • ????public?static?Context?getAppContext()?{??
  • ????????return?MyOutput.context;??
  • ????}??
  • ??????
  • ????//-------------------------------------------------------------------------??
  • ????//?Constructor??
  • ????//-------------------------------------------------------------------------??
  • ????public?MyOutput(){??
  • ??????????
  • ????}??
  • ????public?void?SetParameter(){??
  • ????????if?(mSpeechSynthesizer?==?null)?{??
  • ????????????//創建合成對象.??
  • ????????????mSpeechSynthesizer?=?SpeechSynthesizer.createSynthesizer(context);??
  • ????????}??
  • ????????/*//設置合成發音人.?
  • ????????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);*/??
  • ????}??
  • ????/**?
  • ?????*?使用SpeechSynthesizer合成語音,不彈出合成Dialog.?
  • ?????*?@param?
  • ?????*/??
  • ????public?void?synthetizeInSilence(String?SourceText)?{??
  • ????????//進行語音合成.??
  • ????????mSpeechSynthesizer.startSpeaking(SourceText,?this);??
  • ????}??
  • ??????
  • ????@Override??
  • ????public?void?onBufferProgress(int?arg0,?int?arg1,?int?arg2,?String?arg3)?{??
  • ????????//?TODO?Auto-generated?method?stub??
  • ??????????
  • ????}??
  • ????@Override??
  • ????public?void?onCompleted(SpeechError?arg0)?{??
  • ????????//?TODO?Auto-generated?method?stub??
  • ??????????
  • ????}??
  • ????@Override??
  • ????public?void?onSpeakBegin()?{??
  • ????????//?TODO?Auto-generated?method?stub??
  • ??????????
  • ????}??
  • ????@Override??
  • ????public?void?onSpeakPaused()?{??
  • ????????//?TODO?Auto-generated?method?stub??
  • ??????????
  • ????}??
  • ????@Override??
  • ????public?void?onSpeakProgress(int?arg0,?int?arg1,?int?arg2)?{??
  • ????????//?TODO?Auto-generated?method?stub??
  • ??????????
  • ????}??
  • ????@Override??
  • ????public?void?onSpeakResumed()?{??
  • ????????//?TODO?Auto-generated?method?stub??
  • ??????????
  • ????}??
  • }??

  • 注意!!!還沒完,要到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

    總結

    以上是生活随笔為你收集整理的【从零之三(更)】自定义类中调用讯飞语音包错误解决办法的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。