Android音声認識(ローカル+サードパーティ)

32642 ワード

音声認識の主な機能は,ユーザが入力しにくいときに代替入力の選択を探すことである.
1.ローカル音声認識
次のコードは、まずSpeechRecognizerオブジェクトを作成し、コールバック関数リスナーを設定します.クリックリスナーでdoSpeechRecognition()メソッドを呼び出すと、言語パラメータと処理中に結果の一部を配布することを示すフラグパラメータを使用して音声認識が初期化されます.
public class MainActivity extends Activity implements View.OnClickListener{
    private Button speechBut;
    private TextView result;
    private SpeechRecognizer mSpeechRecognizer;
    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.speechBut:
                doSpeechRecognition(v);
                break;
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        this.speechBut=(Button)findViewById(R.id.speechBut);
        this.speechBut.setOnClickListener(this);
        this.result=(TextView)findViewById(R.id.result);
        this.mSpeechRecognizer=SpeechRecognizer.createSpeechRecognizer(this);
        this.mSpeechRecognizer.setRecognitionListener(new MyRecognitionListener());
    }

    public void doSpeechRecognition(View view){
        view.setEnabled(false);
        Intent recognitionIntent=new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
        recognitionIntent.putExtra(RecognizerIntent.EXTRA_PARTIAL_RESULTS,true);
        recognitionIntent.putExtra(RecognizerIntent.EXTRA_LANGUAGE,"zh-CN");
        this.mSpeechRecognizer.startListening(recognitionIntent);
    }

    private class MyRecognitionListener implements RecognitionListener{
        @Override
        public void onReadyForSpeech(Bundle params) {

        }

        @Override
        public void onBeginningOfSpeech() {
            Log.i("llllllllllllllllllll","onBeginningOfSpeech");
            result.setText("");
        }

        @Override
        public void onRmsChanged(float rmsdB) {

        }

        @Override
        public void onBufferReceived(byte[] buffer) {

        }

        @Override
        public void onEndOfSpeech() {
            Log.i("llllllllllllllllllll","onEndOfSpeech");
            speechBut.setEnabled(true);
        }

        @Override
        public void onError(int error) {
            Log.i("llllllllllllllllllll","onError");
            speechBut.setEnabled(true);
        }

        @Override
        public void onResults(Bundle results) {
            Log.i("llllllllllllllllllll","onResults");
            ArrayList partialResults=results.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
            if(partialResults!=null && partialResults.size()>0){
                String bestResult=partialResults.get(0);
                result.setText(bestResult+".");
            }
        }

        @Override
        public void onPartialResults(Bundle bundle) {
            Log.i("llllllllllllllllllll","onPartialResults");
            ArrayList partialResults=bundle.getStringArrayList(SpeechRecognizer.RESULTS_RECOGNITION);
            if(partialResults!=null && partialResults.size()>0){
                String bestResult=partialResults.get(0);
                result.setText(bestResult);
            }
        }

        @Override
        public void onEvent(int eventType, Bundle params) {

        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        this.mSpeechRecognizer.destroy();
    }
}

リスナーは、各メソッドの呼び出しを順番に受け入れます.この例ではonPartialResult()メソッドでonResult()メソッドで最終的な結果が得られるまで、部分的に識別された結果を示します.
さらに高度なアプリケーションでは、単語をブロックし、特定のコマンドをリスニングすることもできます.これにより、アプリケーションは、ユーザが停止を明確に伝えるまで、音声認識を継続することができる---例えば、1つの聞き書きアプリケーションは、ユーザが「停止」単語を話し、一時停止した後、文間に句点を追加することを許可する.
2.サードパーティ音声認識(アイフライを例に)
一般的にAndroid携帯電話は中国語の音声認識をサポートしていないことはよく知られています.私たちは文字の音声変換さえ第三者の文字の音声変換(TTS)APIをダウンロードしなければならないことがあります.まして音声の文字変換はなおさらです.そのため、一般的にはサードパーティが提供するSDKを利用して、私たちのアプリケーション機能を豊かにしなければなりません.
現在の国内にとって、音声の面で一番いいのは通信音声です.次の開発は訊飛を例に挙げます.
まず、私たちは訊飛開放プラットフォームを手に入れました.http://www.xfyun.cn/アカウントを登録します.
次に、上の図のように新しいアプリケーションを作成し、アプリケーションを作成すると、図のようなAppidが得られます.
その後、関連するSDKパッケージをダウンロードして指定された場所に配置し、Android Studioを例に挙げます.
以下、開発段階に入ることができ、まず、本例の音声認識はネットワークを借りなければならないので、本例に必要な権限は以下の通りである.

android:name="android.permission.INTERNET" />

android:name="android.permission.RECORD_AUDIO" />

android:name="android.permission.ACCESS_NETWORK_STATE" />

android:name="android.permission.ACCESS_WIFI_STATE" />

android:name="android.permission.CHANGE_NETWORK_STATE" />

android:name="android.permission.READ_PHONE_STATE" />

android:name="android.permission.READ_CONTACTS" />

具体的なコードを説明したいと思っていたが、突然自分のコードが十分に詳しく説明されていると感じて、一言一言の説明は必要ありません.みんなが知っていると信じています.
public class MainActivity extends Activity {
    private static String TAG = MainActivity.class.getSimpleName();
    private Toast mToast;
    private Button showDialogs;
    private Button stop;
    private Button cancel;
    private TextView content;
    //       
    private SpeechRecognizer mIat;
    //     UI
    private RecognizerDialog mIatDialog;
    //  HashMap      
    private HashMap, String> mIatResults = new LinkedHashMap, String>();
    //     
    private String mEngineType = SpeechConstant.TYPE_CLOUD;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        this.showDialogs = (Button) findViewById(R.id.showDialogs);
        this.stop = (Button) findViewById(R.id.stopL);
        this.cancel=(Button)findViewById(R.id.cancel);
        this.content = (TextView) findViewById(R.id.content);
        SpeechUtility.createUtility(this, SpeechConstant.APPID + "=5566a1f6");
        //       UI    
        //   SpeechRecognizer  ,            ;
        mIat = SpeechRecognizer.createRecognizer(this, mInitListener);
        //      Dialog,      UI    ,    SpeechRecognizer
        //   UI    ,   sdk      notice.txt,           
        mIatDialog = new RecognizerDialog(MainActivity.this, mInitListener);
        this.showDialogs.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                content.setText("");//       
                mIatResults.clear();
                myRecognize();
                //        
                mIatDialog.show();
                showTip(getString(R.string.text_begin));
            }
        });
        this.stop.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mIat.stopListening();
                showTip("    ");
            }
        });
        this.cancel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mIat.cancel();
                showTip("    ");
            }
        });
    }

    /**
     *       。
     */
    private InitListener mInitListener = new InitListener() {

        @Override
        public void onInit(int code) {
            Log.d(TAG, "SpeechRecognizer init() code = " + code);
            if (code != ErrorCode.SUCCESS) {
                showTip("     ,   :" + code);
            }
        }
    };
    
    private void showTip(final String str) {
       this.mToast.makeText(this,str,Toast.LENGTH_SHORT).show();
    }

    private void myRecognize() {
        //     
        mIat.setParameter(SpeechConstant.PARAMS, null);
        //       
        mIat.setParameter(SpeechConstant.ENGINE_TYPE, mEngineType);
        //         
        mIat.setParameter(SpeechConstant.RESULT_TYPE, "json");
        //       
        mIatDialog.setParameter(SpeechConstant.DOMAIN, "iat");
        //         
        mIatDialog.setParameter(SpeechConstant.LANGUAGE, "zh_cn");
        //        
        mIatDialog.setParameter(SpeechConstant.ACCENT, "mandarin");
        //        
        mIatDialog.setParameter(SpeechConstant.SAMPLE_RATE, "16000");
        //      
        mIatDialog.setListener(recognizerDialogListener);
        //        :      ,                 
        mIat.setParameter(SpeechConstant.VAD_BOS, "4000");
        //        :         ,                   ,       
        mIat.setParameter(SpeechConstant.VAD_EOS, "4000");
        //       ,   "0"       ,   "1"       
        mIat.setParameter(SpeechConstant.ASR_PTT, "1");
        //               , “1”                ,                
        //  :             
        mIat.setParameter(SpeechConstant.ASR_DWA, "0");
    }

    private RecognizerDialogListener recognizerDialogListener = new RecognizerDialogListener() {
        @Override
        public void onError(SpeechError error) {
            // TODO Auto-generated method stub
        }
        //      ,      ,JSON    result
        @Override
        public void onResult(RecognizerResult result, boolean isLast) {
            Log.d(TAG, result.getResultString());
            printResult(result);
        }
    };

    private void printResult(RecognizerResult results) {
        String text = JsonParser.parseIatResult(results.getResultString());
        String sn = null;
        //   json    sn  
        try {
            JSONObject resultJson = new JSONObject(results.getResultString());
            sn = resultJson.optString("sn");
        } catch (JSONException e) {
            e.printStackTrace();
        }
        mIatResults.put(sn, text);
        StringBuffer resultBuffer = new StringBuffer();
        for (String key : mIatResults.keySet()) {
            resultBuffer.append(mIatResults.get(key));
        }
        content.setText(resultBuffer.toString());
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        //        
        mIat.cancel();
        mIat.destroy();
    }
}

もちろん中にはJSON解析があり、自分で書くこともできるし、SDKで包装されたJsonParser類を使うこともできます.
JSON解析はできませんので参考にしてくださいhttp://blog.csdn.net/liyuanjinglyj/article/details/45890825このサイト
最終運転結果を下図に示します.