訊飛文字轉語音

官方文檔:https://doc.xfyun.cn/msc_android/index.htmlhtml

Demo:java

1.建立應用,獲取AppIdandroid

2.下載SDK,集成json

3.11數組

4.代碼實現session

  1. import android.app.Activity ;
  2.  
    import android.os.Bundle ;
  3.  
    import android.util.Log ;
  4.  
    import android.view.View ;
  5.  
    import android.widget.Button ;
  6.  
    import android.widget.EditText ;
  7.  
    import android.widget.Toast ;
  8.  
     
  9.  
    import com.iflytek.cloud.ErrorCode ;
  10.  
    import com.iflytek.cloud.InitListener ;
  11.  
    import com.iflytek.cloud.RecognizerListener ;
  12.  
    import com.iflytek.cloud.RecognizerResult ;
  13.  
    import com.iflytek.cloud.SpeechConstant ;
  14.  
    import com.iflytek.cloud.SpeechError ;
  15.  
    import com.iflytek.cloud.SpeechRecognizer ;
  16.  
    import com.iflytek.cloud.SpeechSynthesizer ;
  17.  
    import com.iflytek.cloud.SpeechUtility ;
  18.  
    import com.iflytek.cloud.SynthesizerListener ;
  19.  
    import com.iflytek.cloud.ui.RecognizerDialog ;
  20.  
    import com.iflytek.cloud.ui.RecognizerDialogListener ;
  21.  
     
  22.  
    import org.json.JSONException ;
  23.  
    import org.json.JSONObject ;
  24.  
     
  25.  
    import java.util.HashMap ;
  26.  
    import java.util.LinkedHashMap ;
  27.  
     
  28.  
    public class MainActivity extends Activity implements View.OnClickListener {
  29.  
     
  30.  
    private static final String TAG = MainActivity.class .getSimpleName();
  31.  
    private EditText et_input;
  32.  
    private Button btn_startspeech, btn_startspeektext ;
  33.  
     
  34.  
    // 用HashMap存儲聽寫結果
  35.  
    private HashMap<String, String> mIatResults = new LinkedHashMap<String , String>();
  36.  
     
  37.  
    @Override
  38.  
    protected void onCreate(Bundle savedInstanceState) {
  39.  
    super .onCreate(savedInstanceState) ;
  40.  
    initView() ;
  41.  
    initSpeech() ;
  42.  
    }
  43.  
     
  44.  
    private void initView() {
  45.  
    setContentView(R.layout.activity_main) ;
  46.  
    et_input = (EditText) findViewById(R.id.et_input );
  47.  
    btn_startspeech = (Button) findViewById(R.id.btn_startspeech );
  48.  
    btn_startspeektext = (Button) findViewById(R.id.btn_startspeektext );
  49.  
    btn_startspeech .setOnClickListener(this) ;
  50.  
    btn_startspeektext .setOnClickListener(this) ;
  51.  
    }
  52.  
     
  53.  
    private void initSpeech() {
  54.  
    // 將「12345678」替換成您申請的 APPID,申請地址: http://www.xfyun.cn
  55.  
    // 請勿在 「 =」與 appid 之間添加任務空字符或者轉義符
  56.  
    SpeechUtility. createUtility( this, SpeechConstant. APPID + "=56ffe0ae" );
  57.  
    }
  58.  
     
  59.  
    @Override
  60.  
    public void onClick(View v) {
  61.  
    switch (v.getId()) {
  62.  
    case R.id.btn_startspeech: //語音識別(把聲音轉文字)
  63.  
    startSpeechDialog();
  64.  
    break;
  65.  
    case R.id. btn_startspeektext:// 語音合成(把文字轉聲音)
  66.  
    speekText();
  67.  
    break;
  68.  
    }
  69.  
     
  70.  
    }
  71.  
     
  72.  
    private void speekText() {
  73.  
    //1. 建立 SpeechSynthesizer 對象 , 第二個參數: 本地合成時傳 InitListener
  74.  
    SpeechSynthesizer mTts = SpeechSynthesizer.createSynthesizer( this, null);
  75.  
    //2.合成參數設置,詳見《 MSC Reference Manual》 SpeechSynthesizer 類
  76.  
    //設置發音人(更多在線發音人,用戶可參見 附錄 13.2
  77.  
    mTts.setParameter(SpeechConstant. VOICE_NAME, "vixyun" ); // 設置發音人
  78.  
    mTts.setParameter(SpeechConstant. SPEED, "50" );// 設置語速
  79.  
    mTts.setParameter(SpeechConstant. VOLUME, "80" );// 設置音量,範圍 0~100
  80.  
    mTts.setParameter(SpeechConstant. ENGINE_TYPE, SpeechConstant. TYPE_CLOUD); //設置雲端
  81.  
    //設置合成音頻保存位置(可自定義保存位置),保存在 「./sdcard/iflytek.pcm」
  82.  
    //保存在 SD 卡須要在 AndroidManifest.xml 添加寫 SD 卡權限
  83.  
    //僅支持保存爲 pcm 和 wav 格式, 若是不須要保存合成音頻,註釋該行代碼
  84.  
    mTts.setParameter(SpeechConstant. TTS_AUDIO_PATH, "./sdcard/iflytek.pcm" );
  85.  
    //3.開始合成
  86.  
    mTts.startSpeaking( et_input.getText().toString(), new MySynthesizerListener()) ;
  87.  
     
  88.  
    }
  89.  
     
  90.  
    class MySynthesizerListener implements SynthesizerListener {
  91.  
     
  92.  
    @Override
  93.  
    public void onSpeakBegin() {
  94.  
    showTip(" 開始播放 ");
  95.  
    }
  96.  
     
  97.  
    @Override
  98.  
    public void onSpeakPaused() {
  99.  
    showTip(" 暫停播放 ");
  100.  
    }
  101.  
     
  102.  
    @Override
  103.  
    public void onSpeakResumed() {
  104.  
    showTip(" 繼續播放 ");
  105.  
    }
  106.  
     
  107.  
    @Override
  108.  
    public void onBufferProgress(int percent, int beginPos, int endPos ,
  109.  
    String info) {
  110.  
    // 合成進度
  111.  
    }
  112.  
     
  113.  
    @Override
  114.  
    public void onSpeakProgress(int percent, int beginPos, int endPos) {
  115.  
    // 播放進度
  116.  
    }
  117.  
     
  118.  
    @Override
  119.  
    public void onCompleted(SpeechError error) {
  120.  
    if (error == null) {
  121.  
    showTip("播放完成 ");
  122.  
    else if (error != null ) {
  123.  
    showTip(error.getPlainDescription( true));
  124.  
    }
  125.  
    }
  126.  
     
  127.  
    @Override
  128.  
    public void onEvent(int eventType, int arg1 , int arg2, Bundle obj) {
  129.  
    // 如下代碼用於獲取與雲端的會話 id,當業務出錯時將會話 id提供給技術支持人員,可用於查詢會話日誌,定位出錯緣由
  130.  
    // 若使用本地能力,會話 id爲null
  131.  
    //if (SpeechEvent.EVENT_SESSION_ID == eventType) {
  132.  
    // String sid = obj.getString(SpeechEvent.KEY_EVENT_SESSION_ID);
  133.  
    // Log.d(TAG, "session id =" + sid);
  134.  
    //}
  135.  
    }
  136.  
    }
  137.  
     
  138.  
    private void startSpeechDialog() {
  139.  
    //1. 建立RecognizerDialog對象
  140.  
    RecognizerDialog mDialog = new RecognizerDialog(this, new MyInitListener()) ;
  141.  
    //2. 設置accent、 language等參數
  142.  
    mDialog.setParameter(SpeechConstant. LANGUAGE, "zh_cn" );// 設置中文
  143.  
    mDialog.setParameter(SpeechConstant. ACCENT, "mandarin" );
  144.  
    // 若要將UI控件用於語義理解,必須添加如下參數設置,設置以後 onResult回調返回將是語義理解
  145.  
    // 結果
  146.  
    // mDialog.setParameter("asr_sch", "1");
  147.  
    // mDialog.setParameter("nlp_version", "2.0");
  148.  
    //3.設置回調接口
  149.  
    mDialog.setListener( new MyRecognizerDialogListener()) ;
  150.  
    //4. 顯示dialog,接收語音輸入
  151.  
    mDialog.show() ;
  152.  
    }
  153.  
     
  154.  
    class MyRecognizerDialogListener implements RecognizerDialogListener {
  155.  
     
  156.  
    /**
  157.  
    * @param results
  158.  
    * @param isLast 是否說完了
  159.  
    */
  160.  
    @Override
  161.  
    public void onResult(RecognizerResult results, boolean isLast) {
  162.  
    String result = results.getResultString(); //爲解析的
  163.  
    showTip(result) ;
  164.  
    System. out.println(" 沒有解析的 :" + result);
  165.  
     
  166.  
    String text = JsonParser.parseIatResult(result) ;//解析事後的
  167.  
    System. out.println(" 解析後的 :" + text);
  168.  
     
  169.  
    String sn = null;
  170.  
    // 讀取json結果中的 sn字段
  171.  
    try {
  172.  
    JSONObject resultJson = new JSONObject(results.getResultString()) ;
  173.  
    sn = resultJson.optString("sn" );
  174.  
    catch (JSONException e) {
  175.  
    e.printStackTrace();
  176.  
    }
  177.  
     
  178.  
    mIatResults .put(sn, text) ;//沒有獲得一句,添加到
  179.  
     
  180.  
    StringBuffer resultBuffer = new StringBuffer();
  181.  
    for (String key : mIatResults.keySet()) {
  182.  
    resultBuffer.append(mIatResults .get(key));
  183.  
    }
  184.  
     
  185.  
    et_input.setText(resultBuffer.toString());// 設置輸入框的文本
  186.  
    et_input .setSelection(et_input.length()) ;//把光標定位末尾
  187.  
    }
  188.  
     
  189.  
    @Override
  190.  
    public void onError(SpeechError speechError) {
  191.  
     
  192.  
    }
  193.  
    }
  194.  
     
  195.  
    class MyInitListener implements InitListener {
  196.  
     
  197.  
    @Override
  198.  
    public void onInit(int code) {
  199.  
    if (code != ErrorCode.SUCCESS) {
  200.  
    showTip("初始化失敗 ");
  201.  
    }
  202.  
     
  203.  
    }
  204.  
    }
  205.  
     
  206.  
    /**
  207.  
    * 語音識別
  208.  
    */
  209.  
    private void startSpeech() {
  210.  
    //1. 建立SpeechRecognizer對象,第二個參數: 本地識別時傳 InitListener
  211.  
    SpeechRecognizer mIat = SpeechRecognizer.createRecognizer( this, null); //語音識別器
  212.  
    //2. 設置聽寫參數,詳見《 MSC Reference Manual》 SpeechConstant類
  213.  
    mIat.setParameter(SpeechConstant. DOMAIN, "iat" );// 短信和平常用語: iat (默認)
  214.  
    mIat.setParameter(SpeechConstant. LANGUAGE, "zh_cn" );// 設置中文
  215.  
    mIat.setParameter(SpeechConstant. ACCENT, "mandarin" );// 設置普通話
  216.  
    //3. 開始聽寫
  217.  
    mIat.startListening( mRecoListener);
  218.  
    }
  219.  
     
  220.  
     
  221.  
    // 聽寫監聽器
  222.  
    private RecognizerListener mRecoListener = new RecognizerListener() {
  223.  
    // 聽寫結果回調接口 (返回Json 格式結果,用戶可參見附錄 13.1);
  224.  
    //通常狀況下會經過onResults接口屢次返回結果,完整的識別內容是屢次結果的累加;
  225.  
    //關於解析Json的代碼可參見 Demo中JsonParser 類;
  226.  
    //isLast等於true 時會話結束。
  227.  
    public void onResult(RecognizerResult results, boolean isLast) {
  228.  
    Log.e (TAG, results.getResultString());
  229.  
    System.out.println(results.getResultString()) ;
  230.  
    showTip(results.getResultString()) ;
  231.  
    }
  232.  
     
  233.  
    // 會話發生錯誤回調接口
  234.  
    public void onError(SpeechError error) {
  235.  
    showTip(error.getPlainDescription(true)) ;
  236.  
    // 獲取錯誤碼描述
  237.  
    Log. e(TAG, "error.getPlainDescription(true)==" + error.getPlainDescription(true ));
  238.  
    }
  239.  
     
  240.  
    // 開始錄音
  241.  
    public void onBeginOfSpeech() {
  242.  
    showTip(" 開始錄音 ");
  243.  
    }
  244.  
     
  245.  
    //volume 音量值0~30, data音頻數據
  246.  
    public void onVolumeChanged(int volume, byte[] data) {
  247.  
    showTip(" 聲音改變了 ");
  248.  
    }
  249.  
     
  250.  
    // 結束錄音
  251.  
    public void onEndOfSpeech() {
  252.  
    showTip(" 結束錄音 ");
  253.  
    }
  254.  
     
  255.  
    // 擴展用接口
  256.  
    public void onEvent(int eventType, int arg1 , int arg2, Bundle obj) {
  257.  
    }
  258.  
    };
  259.  
     
  260.  
    private void showTip (String data) {
  261.  
    Toast.makeText( this, data, Toast.LENGTH_SHORT).show() ;
  262.  
    }
     
    7.Json實體類

      1. import org.json.JSONArray ;
      2.  
        import org.json.JSONObject ;
      3.  
        import org.json.JSONTokener ;
      4.  
         
      5.  
        /**
      6.  
        * Json結果解析類
      7.  
        */
      8.  
        public class JsonParser {
      9.  
         
      10.  
        public static String parseIatResult(String json) {
      11.  
        StringBuffer ret = new StringBuffer() ;
      12.  
        try {
      13.  
        JSONTokener tokener = new JSONTokener(json) ;
      14.  
        JSONObject joResult = new JSONObject(tokener) ;
      15.  
         
      16.  
        JSONArray words = joResult.getJSONArray("ws" );
      17.  
        for (int i = 0; i < words.length(); i++) {
      18.  
        // 轉寫結果詞,默認使用第一個結果
      19.  
        JSONArray items = words.getJSONObject(i).getJSONArray("cw" );
      20.  
        JSONObject obj = items.getJSONObject(0 );
      21.  
        ret.append(obj.getString("w" ));
      22.  
        // 若是須要多候選結果,解析數組其餘字段
      23.  
        // for(int j = 0; j < items.length(); j++)
      24.  
        // {
      25.  
        // JSONObject obj = items.getJSONObject(j);
      26.  
        // ret.append(obj.getString("w"));
      27.  
        // }
      28.  
        }
      29.  
        } catch (Exception e) {
      30.  
        e.printStackTrace();
      31.  
        }
      32.  
        return ret.toString();
      33.  
        }
      34.  
         
      35.  
        public static String parseGrammarResult(String json) {
      36.  
        StringBuffer ret = new StringBuffer() ;
      37.  
        try {
      38.  
        JSONTokener tokener = new JSONTokener(json) ;
      39.  
        JSONObject joResult = new JSONObject(tokener) ;
      40.  
         
      41.  
        JSONArray words = joResult.getJSONArray("ws" );
      42.  
        for (int i = 0; i < words.length(); i++) {
      43.  
        JSONArray items = words.getJSONObject(i).getJSONArray("cw" );
      44.  
        for (int j = 0; j < items.length() ; j++)
      45.  
        {
      46.  
        JSONObject obj = items.getJSONObject(j);
      47.  
        if (obj.getString("w").contains( "nomatch"))
      48.  
        {
      49.  
        ret.append( "沒有匹配結果.") ;
      50.  
        return ret.toString();
      51.  
        }
      52.  
        ret.append( "【結果】" + obj.getString("w" ));
      53.  
        ret.append("【置信度】 " + obj.getInt("sc" ));
      54.  
        ret.append("\n ");
      55.  
        }
      56.  
        }
      57.  
        } catch (Exception e) {
      58.  
        e.printStackTrace();
      59.  
        ret.append(" 沒有匹配結果 .");
      60.  
        }
      61.  
        return ret.toString();
      62.  
        }
      63.  
         
      64.  
        public static String parseLocalGrammarResult(String json) {
      65.  
        StringBuffer ret = new StringBuffer() ;
      66.  
        try {
      67.  
        JSONTokener tokener = new JSONTokener(json) ;
      68.  
        JSONObject joResult = new JSONObject(tokener) ;
      69.  
         
      70.  
        JSONArray words = joResult.getJSONArray("ws" );
      71.  
        for (int i = 0; i < words.length(); i++) {
      72.  
        JSONArray items = words.getJSONObject(i).getJSONArray("cw" );
      73.  
        for (int j = 0; j < items.length() ; j++)
      74.  
        {
      75.  
        JSONObject obj = items.getJSONObject(j);
      76.  
        if (obj.getString("w").contains( "nomatch"))
      77.  
        {
      78.  
        ret.append( "沒有匹配結果.") ;
      79.  
        return ret.toString();
      80.  
        }
      81.  
        ret.append( "【結果】" + obj.getString("w" ));
      82.  
        ret.append("\n ");
      83.  
        }
      84.  
        }
      85.  
        ret.append("【置信度】 " + joResult.optInt("sc" ));
      86.  
         
      87.  
        } catch (Exception e) {
      88.  
        e.printStackTrace();
      89.  
        ret.append(" 沒有匹配結果 .");
      90.  
        }
      91.  
        return ret.toString();
      92.  
        }
相關文章
相關標籤/搜索