利用科大訊飛實現的文本轉語音,語音轉文本


工程目錄如下:

源碼下載本地語句的方法,下載了才能使用本地聽寫

/**
 * 選擇本地聽寫 判斷是否安裝語記,未安裝則跳轉到提示安裝頁面  源碼:
 */
if (!SpeechUtility.getUtility().checkServiceInstalled()) {
       mInstaller.install();// 語記安裝助手類
} else {
      String result = FucUtil.checkLocalResource();
      if (!TextUtils.isEmpty(result)) {
           showTip(result);
      }
}

1.語音轉文字,注意這里需要聯網,如果是本地聽寫需要下載... MainActivity.java: 

import java.util.List;
import android.app.Activity;
import android.graphics.drawable.AnimationDrawable;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.iflytek.cloud.InitListener;
import com.iflytek.cloud.RecognizerListener;
import com.iflytek.cloud.RecognizerResult;
import com.iflytek.cloud.SpeechConstant;
import com.iflytek.cloud.SpeechError;
import com.iflytek.cloud.SpeechRecognizer;
import com.iflytek.cloud.SpeechUtility;
import com.iflytek.cloud.ui.RecognizerDialog;
import com.iflytek.cloud.ui.RecognizerDialogListener;

public class MainActivity extends Activity {

    private RecognizerDialog iatDialog; //帶UI界面顯示的對話框
    private SpeechRecognizer mIat;//不帶UI界面的語音識別器
    private ImageView image;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //初始化
        SpeechUtility.createUtility(this, SpeechConstant.APPID +"=57e79517");
        image = (ImageView) findViewById(R.id.image);
    }

    public void btnClick(View view){
        switch (view.getId()) {
        case R.id.button1://使用訊飛自帶的語音傾聽的UI界面
            beUiVoice();
            break;
        case R.id.button2://使用自己的傾聽語音的UI界面(這里我使用的幀動畫)
            noUIVoice();
            break;
        }
    }
    
    /**
     * 使用訊飛自帶的UI傾聽界面
     */
    private void beUiVoice(){
        //初始化有交互動畫的語音識別器  
        iatDialog = new RecognizerDialog(MainActivity.this, new InitListener() {
            @Override
            public void onInit(int arg0) {
                Toast.makeText(MainActivity.this, "初始化失敗,錯誤碼:" + arg0, 0).show();  
            }
        });  
        //設置監聽,實現聽寫結果的回調  
        iatDialog.setListener(new RecognizerDialogListener() {  
            String resultJson = "[";//放置在外邊做類的變量則報錯,會造成json格式不對(?) 
            @Override  
            public void onResult(RecognizerResult recognizerResult, boolean isLast) {  
                if (!isLast) {  
                    resultJson += recognizerResult.getResultString() + ",";  
                } else {  
                    resultJson += recognizerResult.getResultString() + "]";  
                }  
                if (isLast) {  
                    //解析語音識別后返回的json格式的結果  
                    Gson gson = new Gson();  
                    List<DictationResult> resultList = gson.fromJson(resultJson,  
                            new TypeToken<List<DictationResult>>() {  
                            }.getType());  
                    String result = "";  
                    for (int i = 0; i < resultList.size() - 1; i++) {  
                        result += resultList.get(i).toString();  
                    }  
                    System.out.println("結果:"+result);
                    Toast.makeText(MainActivity.this, result, 1).show();
                }  
                System.out.println("調用onResult方法:"+recognizerResult.getResultString());
            }  

            @Override  
            public void onError(SpeechError speechError) {  
                //自動生成的方法存根  
                speechError.getPlainDescription(true);  
            }  
        });  
        //開始聽寫,需將sdk中的assets文件下的文件夾拷入項目的assets文件夾下(沒有的話自己新建)  
        iatDialog.show();   
    }
    
    /**
     * 使用自己的UI界面
     */
    private void noUIVoice(){
        //1.創建語音識別器對象,第二個參數:本地聽寫時傳InitListener    
        mIat= SpeechRecognizer.createRecognizer(MainActivity.this, null);    
        //2.設置聽寫參數,詳見《科大訊飛MSC API手冊(Android)》SpeechConstant類    
        mIat.setParameter(SpeechConstant.DOMAIN, "iat");//短信和日常用語的引擎
        mIat.setParameter(SpeechConstant.LANGUAGE, "zh_cn");//漢語 
        mIat.setParameter(SpeechConstant.ACCENT, "mandarin ");//設置為普通話
        // 設置語音前端點:靜音超時時間,即用戶多長時間不說話則當做超時處理
        mIat.setParameter(SpeechConstant.VAD_BOS, "4000");
                
        // 設置語音后端點:后端點靜音檢測時間,即用戶停止說話多長時間內即認為不再輸入, 自動停止錄音
        mIat.setParameter(SpeechConstant.VAD_EOS, "1000");
                
        // 設置標點符號,設置為"0"返回結果無標點,設置為"1"返回結果有標點
        mIat.setParameter(SpeechConstant.ASR_PTT, "1");
        
        //設置音頻保存路徑,保存音頻格式支持pcm、wav,設置路徑為sd卡請注意WRITE_EXTERNAL_STORAGE權限(有需要)
        //注:AUDIO_FORMAT參數語記需要更新版本才能生效
        //mIat.setParameter(SpeechConstant.AUDIO_FORMAT,"wav");
        //mIat.setParameter(SpeechConstant.ASR_AUDIO_PATH, Environment.getExternalStorageDirectory()+"/msc/iat.wav");
        
        //3.開始監聽聽寫   mIat.startListening(mRecoListener);    
        mIat.startListening(mRecoListener);
    }
    
    private RecognizerListener mRecoListener = new RecognizerListener() {
        String resultJson = "[";
        private AnimationDrawable ad;//自定義的傾聽UI界面動畫對象
        // 聽寫結果回調接口(返回Json格式結果,用戶可參見附錄12.1);
        // 一般情況下會通過onResults接口多次返回結果,完整的識別內容是多次結果的累加;
        // 關於解析Json的代碼可參見MscDemo中JsonParser類;
        // isLast等於true時會話結束。
        public void onResult(RecognizerResult results, boolean isLast) {
            if (!isLast) {  
                resultJson += results.getResultString() + ",";  
            } else {  
                resultJson += results.getResultString() + "]";  
            }  
            if (isLast) {  
                //解析語音識別后返回的json格式的結果  
                Gson gson = new Gson();  
                List<DictationResult> resultList = gson.fromJson(resultJson,  
                        new TypeToken<List<DictationResult>>() {  
                        }.getType());  
                String result = "";  
                for (int i = 0; i < resultList.size() - 1; i++) {  
                    result += resultList.get(i).toString();  
                }  
                System.out.println("結果:"+result);
                Toast.makeText(MainActivity.this, result, 1).show();//輸出結果
                //將光標定位到文字最后,以便修改  
                //etText.setSelection(result.length());
            }  
            System.out.println("調用onResult方法:"+results.getResultString());
        }

        // 會話發生錯誤回調接口
        public void onError(SpeechError error) {
            error.getPlainDescription(true); // 獲取錯誤碼描述
            ad.stop();
            image.setVisibility(View.GONE);//隱藏圖片
        }

        // 開始錄音
        public void onBeginOfSpeech() {
            // 此回調表示:sdk內部錄音機已經准備好了,用戶可以開始語音輸入
            image.setBackgroundResource(R.drawable.anim_iconset);//加載圖片xml文件
            ad=(AnimationDrawable) image.getBackground();//將圖片轉化成動畫
            image.setVisibility(View.VISIBLE);//顯示圖片
            ad.start();//開啟動畫
        }

        // 結束錄音
        public void onEndOfSpeech() {
            // 此回調表示:檢測到了語音的尾端點,已經進入識別過程,不再接受語音輸入
            ad.stop();
            image.setVisibility(View.GONE);//隱藏圖片
        }

        // 擴展用接口
        public void onEvent(int eventType, int arg1, int arg2, Bundle obj) {
        }

        // 音量值0~30
        @Override
        public void onVolumeChanged(int arg0, byte[] arg1) {
            //("當前正在說話,音量大小:" + arg0);
        }
    };
    
    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 退出時釋放連接
        mIat.cancel();
        mIat.destroy();
    }

}

用來接收轉換 語音聽寫結果的類

/** 
 * 解析 語音聽寫返回結果Json格式字符串 的模板類(多重嵌套Json) 
 * 
 * 語音識別結果Json數據格式(單條數據): 
 * {"sn":1,"ls":true,"bg":0,"ed":0,"ws":[ 
 * {"bg":0,"cw":[{"w":"今天","sc":0}]}, 
 * {"bg":0,"cw":[{"w":"的","sc":0}]}, 
 * {"bg":0,"cw":[{"w":"天氣","sc":0}]}, 
 * {"bg":0,"cw":[{"w":"怎么樣","sc":0}]}, 
 * {"bg":0,"cw":[{"w":"。","sc":0}]} 
 * ]} 
 * 
 * sn  number :第幾句 
 * ls   boolean: 是否最后一句 
 * bg  number :開始 
 * ed  number :結束 
 * ws  array :詞 
 * cw   array :中文分詞 
 * w  string :單字 
 * sc  number :分數 
 */  
public class DictationResult {  
    private String sn;  
    private String ls;  
    private String bg;  
    private String ed;  
  
    private List<Words> ws;  
  
    public static class Words {  
        private String bg;  
        private List<Cw> cw;  
  
        public static class Cw {  
            private String w;  
            private String sc;  
  
            public String getW() {  
                return w;  
            }  
  
            public void setW(String w) {  
                this.w = w;  
            }  
  
            public String getSc() {  
                return sc;  
            }  
  
            public void setSc(String sc) {  
                this.sc = sc;  
            }  
  
            @Override  
            public String toString() {  
                return w;  
            }  
        }  
  
        public String getBg() {  
            return bg;  
        }  
  
        public void setBg(String bg) {  
            this.bg = bg;  
        }  
  
        public List<Cw> getCw() {  
            return cw;  
        }  
  
        public void setCw(List<Cw> cw) {  
            this.cw = cw;  
        }  
  
        @Override  
        public String toString() {  
            String result = "";  
            for (Cw cwTmp : cw) {  
                result += cwTmp.toString();  
            }  
            return result;  
        }  
    }  
  
    public String getSn() {  
        return sn;  
    }  
  
    public void setSn(String sn) {  
        this.sn = sn;  
    }  
  
    public String getLs() {  
        return ls;  
    }  
  
    public void setLs(String ls) {  
        this.ls = ls;  
    }  
  
    public String getBg() {  
        return bg;  
    }  
  
    public void setBg(String bg) {  
        this.bg = bg;  
    }  
  
    public String getEd() {  
        return ed;  
    }  
  
    public void setEd(String ed) {  
        this.ed = ed;  
    }  
  
    public List<Words> getWs() {  
        return ws;  
    }  
  
    public void setWs(List<Words> ws) {  
        this.ws = ws;  
    }  
  
    @Override  
    public String toString() {  
        String result = "";  
        for (Words wsTmp : ws) {  
            result += wsTmp.toString();  
        }  
        return result;  
    }  
} 

自定義的UI界面動畫:anim_iconset.xml

 

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" 
    android:oneshot="false">
    <!-- oneshot為false代表重復播放動畫       這里作為傾聽說話時的動畫-->
    <item android:drawable="@drawable/voice_empty" android:duration="500"/>
    <item android:drawable="@drawable/voice_full" android:duration="500"/>

</animation-list>

2.語音的合成:將文本轉換為語音:

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //初始化
        SpeechUtility.createUtility(this, SpeechConstant.APPID +"=57e79517");
        
        //1.創建SpeechSynthesizer對象, 第二個參數:本地合成時傳InitListener  
        SpeechSynthesizer mTts= SpeechSynthesizer.createSynthesizer(this, null);  
        //2.合成參數設置,詳見《科大訊飛MSC API手冊(Android)》SpeechSynthesizer 類  
        mTts.setParameter(SpeechConstant.VOICE_NAME, "xiaoyan");//設置發音人  
        mTts.setParameter(SpeechConstant.SPEED, "50");//設置語速  
        mTts.setParameter(SpeechConstant.VOLUME, "80");//設置音量,范圍0~100  
        mTts.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD); //設置雲端  
        //設置合成音頻保存位置(可自定義保存位置),保存在“./sdcard/iflytek.pcm”  
        //保存在SD卡需要在AndroidManifest.xml添加寫SD卡權限  
        //如果不需要保存合成音頻,注釋該行代碼  
        mTts.setParameter(SpeechConstant.TTS_AUDIO_PATH, "./sdcard/iflytek.pcm");  
        //3.開始合成  
        int code = mTts.startSpeaking("在這里放置需要進行合成的文本", mSynListener);  
        if (code != ErrorCode.SUCCESS) {  
            if (code == ErrorCode.ERROR_COMPONENT_NOT_INSTALLED) {  
                //上面的語音配置對象為初始化時:  
                Toast.makeText(MainActivity.this, "語音組件未安裝", Toast.LENGTH_LONG).show();  
            } else {  
                Toast.makeText(MainActivity.this, "語音合成失敗,錯誤碼: " + code, Toast.LENGTH_LONG).show();  
            }  
        }  
        
    }
    
    // 合成監聽器
    private SynthesizerListener mSynListener = new SynthesizerListener() {
        // 會話結束回調接口,沒有錯誤時,error為null
        public void onCompleted(SpeechError error) {
        }

        // 緩沖進度回調
        // percent為緩沖進度0~100,beginPos為緩沖音頻在文本中開始位置,endPos表示緩沖音頻在文本中結束位置,info為附加信息。
        public void onBufferProgress(int percent, int beginPos, int endPos,
                String info) {
        }

        // 開始播放,可以執行一些界面美化的操作
        public void onSpeakBegin() {
        }

        // 暫停播放
        public void onSpeakPaused() {
        }

        // 播放進度回調
        // percent為播放進度0~100,beginPos為播放音頻在文本中開始位置,endPos表示播放音頻在文本中結束位置.
        public void onSpeakProgress(int percent, int beginPos, int endPos) {
        }

        // 恢復播放回調接口
        public void onSpeakResumed() {
        }

        // 會話事件回調接口
        public void onEvent(int arg0, int arg1, int arg2, Bundle arg3) {
        }
    };

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM