在网上找了一篇关于Android语音识别的文章,自己慢慢研究。
Android中主要通过RecognizerIntent来实现语音识别,其实代码比较简单,但是如果找不到设置,就会抛出异常
ActivityNotFoundException,所以我们需要捕捉这个异常。而且语音识别在模拟器上是无法测试的,因为语音识别是访问google
云端数据,所以如果手机的网络没有开启,就无法实现识别声音的!一定要开启手机的网络,如果手机不存在语音识别功能的话,也是无法启用识别!
RecognizerIntent的一些常量:
我们只需要通过Intent来传递一个动作以及一些属性,然后通过startActivityForResult来开始语音,代码如下:
Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); "开始语音"); startActivityForResult(intent, VOICE_RECOGNITION_REQUEST_CODE);
下面是RecognizerIntentActivity中的代码:
01 public class RecognizerIntentActivity extends Activity {
02
03 private Button btnReconizer;
04 private static final int VOICE_RECOGNITION_REQUEST_CODE = 1234;
05 @Override
06 protected void onCreate(Bundle savedInstanceState) {
07 // TODO Auto-generated method stub
08 super.onCreate(savedInstanceState);
09 setContentView(R.layout.reconizer);
10
11 btnReconizer=(Button) this.findViewById(R.id.btnRecognizer);
12 btnReconizer.setOnClickListener(new OnClickListener() {
13
14 @Override
15 public void onClick(View v) {
16 // TODO Auto-generated method stub
17 try{
18 //通过Intent传递语音识别的模式,开启语音
19 Intent intent=new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
20 //语言模式和自由模式的语音识别
21 intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
22 //提示语音开始
23 intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "开始语音");
24 //开始语音识别
25 startActivityForResult(intent, VOICE_RECOGNITION_REQUEST_CODE);
26 }catch (Exception e) {
27 // TODO: handle exception
28 e.printStackTrace();
29 Toast.makeText(getApplicationContext(), "找不到语音设备", 1).show();
30 }
31 }
32 });
33
34 }
35
36 @Override
37 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
38 // TODO Auto-generated method stub
39 //回调获取从谷歌得到的数据
40 if(requestCode==VOICE_RECOGNITION_REQUEST_CODE && resultCode==RESULT_OK){
41 //取得语音的字符
42 ArrayList<String> results=data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
43
44 String resultString="";
45 for(int i=0;i<results.size();i++){
46 resultString+=results.get(i);
47 }
48 Toast.makeText(this, resultString, 1).show();
49 }
50 super.onActivityResult(requestCode, resultCode, data);
51 }
52 }
其主要原理就是将语音发送到google云端,然后云端处理,匹配相应的数据,发送到客户端。
最后不要忘记,在manifest中加入网络访问权限:
<uses-permission
android:name="android.permission.INTERNET" />
运行后效果:
另一个代码:
public class Activity01 extends Activity
{
private static final int VOICE_RECOGNITION_REQUEST_CODE = 4321;
private ListView mList;
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mList = (ListView) findViewById(R.id.ListView01);
Button button = (Button) findViewById(R.id.Button01);
button.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
try
{
//通过Intent传递语音识别的模式,开启语音
Intent intent = new Intent
(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
//语言模式和自由形式的语音识别
intent.putExtra(RecognizerIntent.EXTRA_
LANGUAGE_MODEL,RecognizerIntent.
LANGUAGE_MODEL_FREE_FORM);
//提示语音开始
intent.putExtra(RecognizerIntent.EXTRA_
PROMPT,"开始语音");
//开始执行我们的Intent、语音识别
startActivityForResult(intent,
VOICE_RECOGNITION_REQUEST_CODE);
}
catch (ActivityNotFoundException e)
{
//找不到语音设备装置
Toast.makeText(Activity01.this,
"ActivityNotFoundException",
Toast.LENGTH_LONG).show();
}
}
});
}
//当语音结束时的回调函数onActivityResult
@Override
protected void onActivityResult(int requestCode,int resultCode,Intent data)
{
// 判断是否是我们执行的语音识别
if(requestCode==VOICE_RECOGNITION_REQUEST_CODE&&resultCode==RESULT_OK)
{
// 取得语音的字符
ArrayList<String> results = data.getStringArrayListExtra
RecognizerIntent.EXTRA_RESULTS);
//设置视图更新
//mList.setAdapter(new ArrayAdapter<String>(this,android.
R.layout.simple_list_item_1,results));
String resultsString = "";
for (int i = 0; i < results.size(); i++)
{
resultsString += results.get(i);
}
Toast.makeText(this,resultsString,Toast.LENGTH_LONG).show();
super.onActivityResult(requestCode, resultCode, data);
}
}
}