1. 程式人生 > >整合訊飛語音播報、語音合成;

整合訊飛語音播報、語音合成;

整合訊飛語音播報:

地圖導航沒有語音播報,只給出了語音的文字,所以需要自己整合一個語音播報的功能,把導航返回的文字給說出來;

語音這方面選擇了科大訊飛,https://www.xfyun.cn/,註冊使用者、新建專案,下載SDK;訊飛會把你需要的服務生成一個sdk,下載就行了;建立完成後會給你一個APPID,初始化語音時會使用到;

按照指示新增so和jar:

在build.gradle中Android{}中新增:

    sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
        }
    }

1、先初始化,最好放在AppLocation中吧;APPID就是建立專案時給的;

SpeechUtility.createUtility(mC.getApplicationContext(), SpeechConstant.APPID +"=12345678");

2、在使用的類中初始化合成物件和設定引數:

    private void initTts() {
        if (mTts == null){
        mTts = SpeechSynthesizer.createSynthesizer(mC, new InitListener() {
            @Override
            public void onInit(int i) {
                if (  i != ErrorCode.SUCCESS){
                    Log.i("TTS", "語音初始化失敗,錯誤碼:"+i);
                }
            }
        });}
        //設定發音人
        mTts.setParameter(SpeechConstant.VOICE_NAME, "xiaoqi");
        //設定語速,值範圍:[0, 100],預設值:50
        mTts.setParameter(SpeechConstant.SPEED, "49");
        //設定音量
        mTts.setParameter(SpeechConstant.VOLUME, "tts_volume");
        //設定語調
        mTts.setParameter(SpeechConstant.PITCH, "tts_pitch");
    }

3、開始合成語音、語音播報;

mTts.startSpeaking("你好",null); //第一個引數是需要播報的文字,第二個引數是回撥;

好了這樣就完成了;可以先試一下效果;

整合在導航中:

我在使用模擬導航時,語音播報會特別快;有時第一句話還沒有說完再呼叫startSpeaking方法,就把第一句停掉開始說第二句了;於是做了一些處理;把傳過來的文字放在List集合中,逐條去播放;

public class TtsUtils {
    private Context mC;
    //初始化
    public TtsUtils(Context mC){
        this.mC = mC;
    }
    private SpeechSynthesizer mTts;

    public TtsUtils init(){
        SpeechUtility.createUtility(mC.getApplicationContext(), SpeechConstant.APPID +"=5bc6d436");
        initTts();
        return this;
    }
    private void initTts() {
        if (mTts == null){
        mTts = SpeechSynthesizer.createSynthesizer(mC, new InitListener() {
            @Override
            public void onInit(int i) {
                if (  i != ErrorCode.SUCCESS){
                    Log.i("TTS", "語音初始化失敗,錯誤碼:"+i);
                }
            }
        });}
        //設定發音人
        mTts.setParameter(SpeechConstant.VOICE_NAME, "xiaoqi");
        //設定語速,值範圍:[0, 100],預設值:50
        mTts.setParameter(SpeechConstant.SPEED, "49");
        //設定音量
        mTts.setParameter(SpeechConstant.VOLUME, "tts_volume");
        //設定語調
        mTts.setParameter(SpeechConstant.PITCH, "tts_pitch");
    }

    private int position = 0;
    private boolean isSpeak = false;
    private ArrayList<String> mTtsDatas = new ArrayList();
    public void startSpeakingOrAddText(String s){
        Log.i("TTS", "Tts: "+s+",第幾條 = "+(++position));
        //如果傳過來的文字 不是空 就加入到列表中
        if (!TextUtils.isEmpty(s)){
            mTtsDatas.add(s);
        }
        //如果不是正在說話,並且文字列表大於0,就去說話;
        if (!isSpeak && mTtsDatas.size() > 0){
            mTts.startSpeaking(mTtsDatas.get(0),c);
            //說完後把當前這條刪除了
            mTtsDatas.remove(0);
        }
    }

    private SynthesizerListener c  = new SynthesizerListener() {
        @Override
        public void onSpeakBegin() {
            //開始說了;
            isSpeak = true;
        }

        @Override
        public void onBufferProgress(int i, int i1, int i2, String s) {

        }

        @Override
        public void onSpeakPaused() {
            isSpeak = true;
        }

        @Override
        public void onSpeakResumed() {
            isSpeak = true;
        }

        @Override
        public void onSpeakProgress(int i, int i1, int i2) {

        }

        @Override
        public void onCompleted(SpeechError speechError) {
            //說完了
            isSpeak = false;
            new Thread(new Runnable() {
                @Override
                public void run() {
                    SystemClock.sleep(200); //延遲0.2秒
                    startSpeakingOrAddText(null); //傳遞null,讓語音繼續輪播播報下一條;
                }
            }).start();
        }

        @Override
        public void onEvent(int i, int i1, int i2, Bundle bundle) {

        }
    };

    public void destroy(){
        mTtsDatas = null;
        if( null != mTts ){
            mTts.stopSpeaking();
            // 退出時釋放連線
            mTts.destroy();
        }
    }
}

使用:

  @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        et = (EditText) findViewById(R.id.et);
        mC = this;
        mTts = new TtsUtils(mC).init();
    }


    public void click(View view) {
        mTts.startSpeakingOrAddText(et.getText().toString());
    }

OK!