Demo程序
这个程序很简单。他有一个Mic符号按钮。点击之后我们触发Android的Speech To Text意图(Intent)显示一个对话框来接收语音输入。输入的语音然后会被转换成文本并显示到一个text view中。
第一步:在Eclipse中创建基本的Android项目
在Eclipse中创建一个Hello World Android项目。打开 New > Project > Android Project,项目名填 SpeechToTextDemo,选择Android运行时2.1或sdk7。我给定了包名:net.viralpatel.android.speechtotextdemo
做完上面的步骤,你就有了一个基本的Android Hello World程序
第二步:更改布局
在我们的demo中布局很简单。只有一个图像按钮来触发Speech to Text API和一个TextView来显示从语音转换过来的文本。
打开layout/main.xml并替换为下面的内容:
File: res/layout/main.xml
01 | < LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android" |
02 | xmlns:tools = "http://schemas.android.com/tools" |
03 | android:layout_width = "fill_parent" |
04 | android:layout_height = "wrap_content" |
05 | android:layout_above = "@+id/textView1" |
06 | android:layout_toLeftOf = "@+id/textView1" |
07 | android:gravity = "center" |
08 | android:orientation = "vertical" > |
09 | |
10 | < ImageButton |
11 | android:id = "@+id/btnSpeak" |
12 | android:layout_width = "fill_parent" |
13 | android:layout_height = "wrap_content" |
14 | android:layout_margin = "10dp" |
15 | android:layout_marginRight = "10dp" |
16 | android:layout_marginTop = "10dp" |
17 | android:contentDescription = "@string/speak" |
18 | android:src = "<a href=" http://my.oschina.net/asia" class = "referer" target = "_blank" >@android</ a > :drawable/ic_btn_speak_now" /> |
19 | |
20 | < TextView |
21 | android:id = "@+id/txtText" |
22 | android:layout_width = "wrap_content" |
23 | android:layout_height = "wrap_content" |
24 | android:layout_marginLeft = "10dp" |
25 | android:layout_marginRight = "10dp" |
26 | android:layout_marginTop = "10dp" |
27 | android:textAppearance = "?android:attr/textAppearanceLarge" /> |
28 | |
29 | </ LinearLayout > |
第三步:触发Speech to Text API的Android Java代码
打开SpeechToTextDemoActivity 类并替换为下面的代码:
File: SpeechToTextDemoActivity.java
01 | package net.viralpatel.android.speechtotextdemo; |
02 | |
03 | import java.util.ArrayList; |
04 | |
05 | import android.app.Activity; |
06 | import android.content.ActivityNotFoundException; |
07 | import android.content.Intent; |
08 | import android.os.Bundle; |
09 | import android.speech.RecognizerIntent; |
10 | import android.view.Menu; |
11 | import android.view.View; |
12 | import android.widget.ImageButton; |
13 | import android.widget.TextView; |
14 | import android.widget.Toast; |
15 | |
16 | public class MainActivity extends Activity { |
17 | |
18 | protected static final int RESULT_SPEECH = 1 ; |
19 | |
20 | private ImageButton btnSpeak; |
21 | private TextView txtText; |
22 | |
23 | @Override |
24 | public void onCreate(Bundle savedInstanceState) { |
25 | super .onCreate(savedInstanceState); |
26 | setContentView(R.layout.activity_main); |
27 | |
28 | txtText = (TextView) findViewById(R.id.txtText); |
29 | |
30 | btnSpeak = (ImageButton) findViewById(R.id.btnSpeak); |
31 | |
32 | btnSpeak.setOnClickListener( new View.OnClickListener() { |
33 | |
34 | @Override |
35 | public void onClick(View v) { |
36 | |
37 | Intent intent = new Intent( |
38 | RecognizerIntent.ACTION_RECOGNIZE_SPEECH); |
39 | |
40 | intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, "en-US" ); |
41 | |
42 | try { |
43 | startActivityForResult(intent, RESULT_SPEECH); |
44 | txtText.setText( "" ); |
45 | } catch (ActivityNotFoundException a) { |
46 | Toast t = Toast.makeText(getApplicationContext(), |
47 | "Opps! Your device doesn\'t support Speech to Text" , |
48 | Toast.LENGTH_SHORT); |
49 | t.show(); |
50 | } |
51 | } |
52 | }); |
53 | |
54 | } |
55 | |
56 | @Override |
57 | public boolean onCreateOptionsMenu(Menu menu) { |
58 | getMenuInflater().inflate(R.menu.activity_main, menu); |
59 | return true ; |
60 | } |
61 | |
62 | @Override |
63 | protected void onActivityResult( int requestCode, int resultCode, Intent data) { |
64 | super .onActivityResult(requestCode, resultCode, data); |
65 | |
66 | switch (requestCode) { |
67 | case RESULT_SPEECH: { |
68 | if (resultCode == RESULT_OK && null != data) { |
69 | |
70 | ArrayList<String> text = data |
71 | .getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS); |
72 | |
73 | txtText.setText(text.get( 0 )); |
74 | } |
75 | break ; |
76 | } |
77 | |
78 | } |
79 | } |
80 | } |
Android Speech to text Android API的核心是包 android.speech和类android.speech.RecognizerIntent。我们触发一个意图(android.speech.RecognizerIntent)显示对话框来识别语音输入,这个Activity转换语音为文本并把结果传回我们正在调用的Activity。当我们调用android.speech.RecognizerIntent意图时,必须使用 startActivityForResult()来接听文本结果。
注意在上面的代码中我们是怎样创建并触发意图intent android.speech.RecognizerIntent的,同时使用.putExtra()方法添加了一个参数。调用RecognizerIntent时,必须提供RecognizerIntent.EXTRA_LANGUAGE_MODE,在这里我们设置为 en-US。
由于我们的RecognizerIntent通过startActivityForResult()触发,我们重写了 onActivityResult(int requestCode, int resultCode, Intent data)方法来处理结果数据。RecognizerIntent会把语音转换为文本并把结果通过键RecognizerIntent.EXTRA_RESULTS作为ArrayList传回来。只有RESULT_OK返回时才会出现。我们只需要使用 txtText.setText()把从结果中拿到的文本设置到text view texText中。
在这里值得注意的一件事是在不支持speech to text API的设备/Android版本中应该怎样处理。在这种情况下,当我们视图启动Activity时ActivityNotFoundException异常会被抛出。在上面的例子中,我们捕获了这个异常并使用Toast显示了一个提示信息“Opps! Your device doesn’t support Speech to Text”。
Android应用程序的屏幕截图
到这里就结束了! 在Android模拟器或真实设备上执行应用程序,将会看到下面的输出。