Android音声認識(ローカル+サードパーティ)
32642 ワード
音声認識の主な機能は,ユーザが入力しにくいときに代替入力の選択を探すことである.
1.ローカル音声認識
次のコードは、まずSpeechRecognizerオブジェクトを作成し、コールバック関数リスナーを設定します.クリックリスナーでdoSpeechRecognition()メソッドを呼び出すと、言語パラメータと処理中に結果の一部を配布することを示すフラグパラメータを使用して音声認識が初期化されます.
リスナーは、各メソッドの呼び出しを順番に受け入れます.この例ではonPartialResult()メソッドでonResult()メソッドで最終的な結果が得られるまで、部分的に識別された結果を示します.
さらに高度なアプリケーションでは、単語をブロックし、特定のコマンドをリスニングすることもできます.これにより、アプリケーションは、ユーザが停止を明確に伝えるまで、音声認識を継続することができる---例えば、1つの聞き書きアプリケーションは、ユーザが「停止」単語を話し、一時停止した後、文間に句点を追加することを許可する.
2.サードパーティ音声認識(アイフライを例に)
一般的にAndroid携帯電話は中国語の音声認識をサポートしていないことはよく知られています.私たちは文字の音声変換さえ第三者の文字の音声変換(TTS)APIをダウンロードしなければならないことがあります.まして音声の文字変換はなおさらです.そのため、一般的にはサードパーティが提供するSDKを利用して、私たちのアプリケーション機能を豊かにしなければなりません.
現在の国内にとって、音声の面で一番いいのは通信音声です.次の開発は訊飛を例に挙げます.
まず、私たちは訊飛開放プラットフォームを手に入れました.http://www.xfyun.cn/アカウントを登録します.
次に、上の図のように新しいアプリケーションを作成し、アプリケーションを作成すると、図のようなAppidが得られます.
その後、関連するSDKパッケージをダウンロードして指定された場所に配置し、Android Studioを例に挙げます.
以下、開発段階に入ることができ、まず、本例の音声認識はネットワークを借りなければならないので、本例に必要な権限は以下の通りである.
具体的なコードを説明したいと思っていたが、突然自分のコードが十分に詳しく説明されていると感じて、一言一言の説明は必要ありません.みんなが知っていると信じています.
もちろん中にはJSON解析があり、自分で書くこともできるし、SDKで包装されたJsonParser類を使うこともできます.
JSON解析はできませんので参考にしてくださいhttp://blog.csdn.net/liyuanjinglyj/article/details/45890825このサイト
最終運転結果を下図に示します.
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このサイト
最終運転結果を下図に示します.