Android apps 拍立知-功能實現(百度tts語音合成使用)

上回分解,拍立知其中一個功能就是利用文字轉成語音再播放出來,這期寫一下如何使用。

(在開始之前,強烈建議仔細閱讀 百度語音-語音合成-SDK開發文檔  能減少90%開發時候遇到的問題。  

結合官方demo閱讀效果更佳  

首先,從百度ai上download下百度tts的sdk包(http://ai.baidu.com/sdk)。

下載解壓後是個完整的工程,裏面已經有幾個完整的demo了,而且介紹也是十分的詳細,操作之前可以都嘗試一下有什麼效果。

SynthActivity: 合成demo。含在線和離線,沒有純離線功能。 根據網絡狀況優先走在線,在線時訪問服務器失敗後轉爲離線。
MiniActivity:精簡版合成。
SaveFileActivity :保存合成後的音頻。

接下來先看一下我的項目文件,control、listener、util三個文件夾可以在 百度tts語音合成示例中找到,移植過來這邊,還有一個MainHandlerConstant文件。(根據你們的實際要求適當增減,這個是以我的示例爲例)


三個Activity就是主要的工程文件,MainActivity是進入界面後的處理,startActivity是進入的旋轉頁面,ViewActiviy作爲主界面的跳轉。

 

接下來介紹MainActivity裏面實現功能,首先從頁面看起,頁面佈局如下:

百度tts語音合成用武之地就在語音播放這裏。

我們看一下百度tts語音合成MainActivity位於的設計:

一、首先定義必要的調用信息:

protected String appId = "你的百度appId";
protected String appKey = "你的百度appKey ";
protected String secretKey = "你的百度secretKey";
private TtsMode ttsMode = TtsMode.ONLINE;//設置TTS模式,這是僅在線

protected SpeechSynthesizer mSpeechSynthesizer;//初始化SpeechSynthesizer 
String Speck_TEXT="尚未有識別項目,請識別後點擊。";//這個是保存Text顯示的內容

private Button mSpeak;//這些控件可以自行定義,還有一些就不全部展示
private Button mStop;
private TextView mShowText;

 二、精簡其函數(這裏我只用了在線的模式,所以大部分代碼可以裁剪)

這個初始化的initTTs函數(在onCreate裏面初始化一下),好像音量(男/女)、聲音、語速這些,在https://ai.baidu.com/docs#/TTS-Android-SDK/top下有詳細的變量解釋。

private void initTTs() {
        LoggerProxy.printable(true);
        SpeechSynthesizerListener listener = new UiMessageListener(mainHandler);
        // 1. 獲取實例
        mSpeechSynthesizer = SpeechSynthesizer.getInstance();
        mSpeechSynthesizer.setContext(this);
        // 2. 設置listener
        mSpeechSynthesizer.setSpeechSynthesizerListener(listener);
        // 3. 設置appId,appKey.secretKey
        int result = mSpeechSynthesizer.setAppId(appId);
        checkResult(result, "setAppId");
        result = mSpeechSynthesizer.setApiKey(appKey, secretKey);
        checkResult(result, "setApiKey");

        mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_SPEAKER, "3");
        // 設置合成的音量,0-9 ,默認 5
        mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_VOLUME, "9");
        // 設置合成的語速,0-9 ,默認 5
        mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_SPEED, "3");
        // 設置合成的語調,0-9 ,默認 5
        mSpeechSynthesizer.setParam(SpeechSynthesizer.PARAM_PITCH, "5");

        mSpeechSynthesizer.setAudioStreamType(AudioManager.MODE_IN_CALL);
        Map<String, String> params = new HashMap<>();
        InitConfig initConfig =  new InitConfig(appId, appKey, secretKey, ttsMode, params, listener);

        result = mSpeechSynthesizer.initTts(ttsMode);
        checkResult(result, "initTts");
    }

  一個speak(),一個stop()定義事件。


    private void speak() {
        if (mSpeechSynthesizer == null) {
            print("[ERROR], 初始化失敗");
            return;
        }
        mShowText.setText("");
        mShowText.setText(Speck_TEXT);
        Toast.makeText(getApplicationContext(),"正在連接播放...請稍等",Toast.LENGTH_LONG).show();
        int result = mSpeechSynthesizer.speak("播放開始"+Speck_TEXT+"語音播放播放完成");//speak 在這
        checkResult(result, "speak");//獲取錯誤代碼
    }
    private void stop() {
        print("停止播放!");//停止合成引擎
        int result = mSpeechSynthesizer.stop();
        checkResult(result, "stop");
    }
    

initView()在於監聽是否有onClick, checkResult這個是回傳結果,如果有錯誤會回傳錯誤代碼。

//  下面是UI部分
    private void initView() {
        mSpeak = (Button) this.findViewById(R.id.start);
        mStop = (Button) this.findViewById(R.id.pause);
        mShowText = (TextView) this.findViewById(R.id.showText);
        View.OnClickListener listener = new View.OnClickListener() {
            public void onClick(View v) {
                int id = v.getId();
                switch (id) {
                    case R.id.start:
                        speak();
                        break;
                    case R.id.pause:
                        stop();
                        break;
                    default:
                        break;
                }
            }
        };
        mSpeak.setOnClickListener(listener);
        mStop.setOnClickListener(listener);
        mainHandler = new Handler() {

            // @param msg

            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                if (msg.obj != null) {
                    //print(msg.obj.toString());//調試作用
                }
            }

        };
    }
    private void print(String message) {
        Log.i(TAG, message);
        mShowText.append(message + "\n");
    }
    @Override
    protected void onDestroy() {
        if (mSpeechSynthesizer != null) {
            mSpeechSynthesizer.stop();
            mSpeechSynthesizer.release();
            mSpeechSynthesizer = null;
            print("釋放資源成功");
        }
        super.onDestroy();
    }
    private void checkResult(int result, String method) {
        if (result != 0) {
            print("error code :" + result + " method:" + method + ", 錯誤碼文檔:http://yuyin.baidu.com/docs/tts/122 ");
        }
        System.out.println("錯誤參數:"+result);
        if(result == -15 )
        {
            Toast.makeText(getApplicationContext(),"語音請求超時,請重新點擊播放或切換網絡環境。",Toast.LENGTH_LONG).show();
        }
    }

下面就是一個對於權限的獲取,後面調用相機應用也需要某些權限,所以這裏申請。

private void initPermission() {
        String[] permissions = {
                Manifest.permission.INTERNET,
                Manifest.permission.ACCESS_NETWORK_STATE,
                Manifest.permission.MODIFY_AUDIO_SETTINGS,
                Manifest.permission.WRITE_EXTERNAL_STORAGE,
                Manifest.permission.WRITE_SETTINGS,
                Manifest.permission.READ_PHONE_STATE,
                Manifest.permission.ACCESS_WIFI_STATE,
                Manifest.permission.CHANGE_WIFI_STATE
        };

        ArrayList<String> toApplyList = new ArrayList<String>();

        for (String perm : permissions) {
            if (PackageManager.PERMISSION_GRANTED != ContextCompat.checkSelfPermission(this, perm)) {
                toApplyList.add(perm);
                // 進入到這裏代表沒有權限.
            }
        }
        String[] tmpList = new String[toApplyList.size()];
        if (!toApplyList.isEmpty()) {
            ActivityCompat.requestPermissions(this, toApplyList.toArray(tmpList), 123);
        }
    }

對應的, AndroidManifest.xml也要做權限的註冊。

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-feature android:name="android.hardware.camera" />
    <uses-feature android:name="android.hardware.camera.autofocus" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.FLASHLIGHT" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />

 

 以上就是百度tts語音合成使用在MainActivity中的簡單調用,通過修改Speck_TEXT修改播放內容。

播放是函數speak()方法,做處理的是函數下這句

mSpeechSynthesizer.speak("播放開始"+Speck_TEXT+"語音播放播放完成")

 

下一節,介紹相機功能的調用和百度圖像識別功能的調用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章