android用訊飛實現TTS語音合成 實現中文版

Android系統從1.6版本開始就支持TTS(Text-To-Speech),即語音合成。可是android系統默認的TTS引擎:Pic TTS不支持中文。因此咱們得安裝本身的TTS引擎和語音包。html

 

在項目中,一開始用的是手說TTS,免費版的,感受聲音很不僵硬,不天然,不連貫。付費版的還要錢激活,若是不激活,限制每次只能度5個字,並且比免費版也好不了多少。最後採用了訊飛語音TTS1.0,發音連貫天然,我的感受很不錯了,之後就用它。java

介紹下使用方法:android

1.首先下載訊飛的語音包apk,以及語音引擎apk,安裝在手機上。api

  連接:http://pan.baidu.com/s/1mgL7elU  提取碼:oelh微信

2.進入系統設置-->語音輸入輸出設置-->勾選「訊飛語音合成" , 默認引擎「訊飛語音合成」, 語言「中文"。app

        

調用android自帶的TTS api,就可實現中文版語音合成。ide

package com.example.testxunfeitts;

import java.util.Locale;

import android.app.Activity;
import android.os.Bundle;
import android.speech.tts.TextToSpeech;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity {
    
      private EditText mEditText = null; 
      private Button readButton = null; 
      private Button saveButton = null; 
      private CheckBox mCheckBox = null; 
      private TextToSpeech mTextToSpeech=null;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        
        mEditText = (EditText)this.findViewById(R.id.edittext); 
        readButton = (Button)this.findViewById(R.id.rbutton); 
        saveButton = (Button)this.findViewById(R.id.sbutton); 
        mCheckBox = (CheckBox)this.findViewById(R.id.checkbox); 
        
        //實例並初始化TTS對象
        mTextToSpeech=new TextToSpeech(this, new TextToSpeech.OnInitListener() {
            
            @Override
            public void onInit(int status) {
                if (status==TextToSpeech.SUCCESS) {
                    //設置朗讀語言
                    int supported=mTextToSpeech.setLanguage(Locale.US);
                    if ((supported!=TextToSpeech.LANG_AVAILABLE)&&(supported!=TextToSpeech.LANG_COUNTRY_AVAILABLE)) {
                        Toast.makeText(MainActivity.this, "不支持當前語言!", 1).show();
                    }
                }
                
            }
        });
        
        //朗讀監聽按鈕
        readButton.setOnClickListener(new View.OnClickListener() {
            
            @Override
            public void onClick(View arg0) {
                //朗讀EditText裏的內容
                mTextToSpeech.speak(mEditText.getText().toString(), TextToSpeech.QUEUE_FLUSH, null); 
            }
        });
        
        //保存按鈕監聽
        saveButton.setOnClickListener(new View.OnClickListener() {
            
            @Override
            public void onClick(View arg0) {
                //將EditText裏的內容保存爲語音文件
                int r = mTextToSpeech.synthesizeToFile(mEditText.getText().toString(), null, "/mnt/sdcard/speak.wav"); 
                if (r==TextToSpeech.SUCCESS) {
                    Toast.makeText(MainActivity.this, "保存成功!", 1).show();
                }
            }
        });
        
      //EditText內容變化監聽
      mEditText.addTextChangedListener(mTextWatcher); 
    }
    
    @Override
    protected void onDestroy() {
        super.onDestroy();
        
        if (mTextToSpeech!=null) {
            mTextToSpeech.shutdown();//關閉TTS
        }
    }
    
    private TextWatcher mTextWatcher = new TextWatcher(){

        @Override
        public void afterTextChanged(Editable s) {
             //若是是邊寫邊讀 
            if(mCheckBox.isChecked()&&(s.length()!=0)){
              //得到EditText的全部內容 
              String t = s.toString();         
              mTextToSpeech.speak(t.substring(s.length()-1), TextToSpeech.QUEUE_FLUSH, null); 
            }
        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int before,
                int count) {
            // TODO Auto-generated method stub
            
        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before,
                int count) {
            // TODO Auto-generated method stub
            
        }        
    };    
}

中文語音合成(TTS)能夠分爲兩類:this

1.跟系統接口吻合的spa

跟系統接口吻合的,都是把TTS引擎跟語音包數據分開。像系統默認的Pico TTS,SVOX,科大訊飛等就是這樣的。code

優勢:能夠經過系統提供的接口去使用TTS功能,以便於作多國語言的擴展。

缺點:設置語音朗讀的角色和設置語速的快慢就得經過系統的接口去設置。

2.不與系統接口吻合的

不與系統接口吻合的,都是會把引擎和語音包打包成一個apk,而後安裝完以後,經過指定的接口去調用其所提供的中文語音合成功能。

除了這兩類方法以外,還有一些是直接把TTS功能作成共享庫so文件,而後經過NDK去調用TTS的功能。這一種就比較好,由於不須要額外的再安裝TTS引擎跟語音包,而且能夠直接在應用裏面設置朗讀人是男聲仍是女聲,語速等。想舊版的科大訊飛就是以這種形式出現的,比較有表明的應用是「據說」或者"vBook"。

 

分析下市面上有名的中文語音合成TTS各自的差別:

1、跟系統接口吻合的。

1.訊飛語音TTS1.0

這個原來訊飛是沒有這個與系統接口吻合的TTS的,原來是以動態庫的形式的,最近才以這種apk的形式華麗登場,合成的效果清晰流暢,不生硬,英文也讀得挺好的,聽起來很舒服。

2.SVOX

這個也作得很強大,N多的語言支持,中文不只支持普通話,還支持廣東話!不過有一些感受吐字不是很清晰,聽感不是很好,不過還好,由於大部分是能夠聽得懂的,下載地址:http://www.coolapk.com/apk-4192-com.svox.classic.langpack.cmn_chn_fem/

3.三星TTS

支持韓文,中文跟英文,每一字吐字還比較清晰,可是連起來的時候,不是很順暢。

安裝apk,而後把SMT文件夾整個拷貝到SD卡的根目錄

下載地址是:http://115.com/file/e7z2iliv

2、是以獨立的apk形式存在的主要在下面的兩種

1.捷通華聲

捷通華聲也是中文語音作得比較好的,跟科大訊飛有得一拼。它的調用方法是使用java的反射機制來使用已經安裝的TTS類。

捷通華聲TTS語音包下載地址:http://www.yingyong.so/app/3/1917.htm

2.手說TTS

手說也是獨立安裝的一個TTS引擎,目前好像只支持中文語言。它接口公開,語音質量還行。本人作過手說TTS的,感受聲音很不僵硬,不天然,連貫。

它的使用方法在例程裏面有很詳細的介紹,手說的主頁:http://shoushuo.com/index.html

 

對於第一種做爲切合系統接口的TTS中文引擎,安裝以後,須要安裝語言包,而後還得簡單的設置一下才可使用,方法以下:

設置-》語音輸入與輸出-》文字轉語音設置,把對應的TTS引擎後面的勾,勾上,再在「默認引擎」裏面設置你所須要的TTS,而後就能夠聆聽示例了。

而對於第二種,通常都會帶有一個activity能夠聆聽示例的。

 

推薦使用科大訊飛的中文TTS,跟捷通華聲的音色都比較天然,應該是目前全部的中文TTS裏面最好的了。

 

若是此文對您有幫助,微信打賞我一下吧~

相關文章
相關標籤/搜索