Voice Recognizer 語音辨認

December 23, 2012   ·   0 Comments

device-2012-12-23-145459

device-2012-12-23-145538device-2012-12-23-145459device-2012-12-23-145511

自從Apple 的Siri 出現之後,很多人也在期待Android 是否也類似的功能,現在我們就要介紹語音辨識的功能,

可以讓打字慢的用戶,可以用說話就可以輸入資料,也可以方便用戶在很多情況下,不方便用手的話,可以用語音來處理一些相關事物。

範例程式

Android的 的範例程式其路徑爲: Tutorial_Input_VoiceToText

其中各個文件目錄爲:

AndroidManifest.xml:各個應用描述文件

asset/:資産文件

res/:資源檔案目錄

res/layout/activity_main.xml畫面設定資源代碼

MainActivity.java 主程式

概念性描述

語音辨認可以方便用戶

只要用說的,就可以輸入文字資料。

畫面設定資源

範例的畫面activity_main.xml

1.

6.

7.

14.

15.

畫面的呈現,我們是透過

一個文字輸入元件

TextView

和一個按鈕

Button

來達到畫面的呈現,希望

當用戶按下按鈕後,就開始執行語言辨識的功能,

然後辨識完畢後,

把用戶所說的話,顯示在文字 TextView上面

這是activity_main.xml呈現出的效果。

程式範例

Android 原始檔案MainActivity.java的代碼片段如下所示:

1. package com.example.tutorial_input_voicetotext;

2.

3. import java.util.ArrayList;

4.

5. import android.app.Activity;

6. import android.content.ActivityNotFoundException;

7. import android.content.Intent;

8. import android.os.Bundle;

9. import android.speech.RecognizerIntent;

10. import android.view.Menu;

11. import android.view.View;

12. import android.widget.Button;

13. import android.widget.TextView;

14. import android.widget.Toast;

15.

16. public class MainActivity extends Activity {

17. private TextView textView1;

18. private Button button1;

19.

20. protected static final int RESULT_SPEECH = 1;

21.

22. @Override

23. protected void onCreate(Bundle savedInstanceState) {

24. super.onCreate(savedInstanceState);

25. setContentView(R.layout.activity_main);

26.

27.

28. textView1 = (TextView) findViewById(R.id.textView1);

29.

30. button1 = (Button) findViewById(R.id.button1);

31.

32. button1.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. /*

41. intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,

42. 2);

43. //”en-US”);

44. */

45.

46. intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,

47. RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);

48. intent.putExtra(RecognizerIntent.EXTRA_PROMPT, “Speech recognition demo”);

49.

50.

51. try {

52. startActivityForResult(intent, RESULT_SPEECH);

53. textView1.setText(“”);

54. } catch (ActivityNotFoundException a) {

55. Toast t = Toast.makeText(getApplicationContext(),

56. “Sorry, Your device doesn’t support Speech to Text”,

57. Toast.LENGTH_SHORT);

58. t.show();

59. }

60. }

61. });

62. }

63.

64. @Override

65. public boolean onCreateOptionsMenu(Menu menu) {

66. // Inflate the menu; this adds items to the action bar if it is present.

67. getMenuInflater().inflate(R.menu.activity_main, menu);

68. return true;

69. }

70.

71.

72. @Override

73. protected void onActivityResult(int requestCode, int resultCode, Intent data) {

74. super.onActivityResult(requestCode, resultCode, data);

75.

76. switch (requestCode) {

77. case RESULT_SPEECH: {

78. if (resultCode == RESULT_OK && null != data) {

79.

80. ArrayList text = data

81. .getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);

82.

83. textView1.setText(text.get(0));

84. }

85. break;

86. }

87.

88. }

89. }

90.

91. }

一開始,透過

setContentView(R.layout.activity_main);

來顯示畫面,

並取的

textView1 = (TextView) findViewById(R.id.textView1);

button1 = (Button) findViewById(R.id.button1);

的元件變數,

並設定用戶按下按鍵的反應。

button1.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

}

});

接下來本章的重點來了。

Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);

intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,

RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);

intent.putExtra(RecognizerIntent.EXTRA_PROMPT, “Speech recognition “);

startActivityForResult(intent, RESULT_SPEECH);

這樣就可以打開android語音辨識的功能了,

再次體醒一下,startActivityForResult的功能我們主要是用在切換頁面和呼叫起其他的APP,並且等再那一個被呼叫的APP,回傳資料。 如果想知道更詳細的話,可以回頭看換頁篇。

因為等待呼叫另一個程式,所以當結果救回主動呼叫onActivityResult這一個 protocol 了。

protected void onActivityResult(int requestCode, int resultCode, Intent data) {…}

首先我們先確認一下,是我們呼叫出去的Activity嗎? 那可以用

switch (requestCode) {

case RESULT_SPEECH: {

}

}

就可以了,那如何得到辨識之後的文字資料?

只要透過onActivityResult 所傳回的參數,轉換文字就可以了。

ArrayList text = data

.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);

textView1.setText(text.get(0));

這樣我們就完成了。

語音辨識中

辨識完成。

補充資料

在辨識語言的部分,你也可以指定特殊的語言來做辨識判斷

只要把

intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,

RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);

改成

intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,

“en-US”);

就可以只辨識英文。

shareShare on FacebookShare on Google+Share on LinkedInEmail this to someonePrint this pageBuffer this pageDigg thisFlattr the authorShare on RedditPin on PinterestShare on StumbleUponShare on TumblrTweet about this on Twitter

By


Readers Comments (0)


You must be logged in to post a comment.

PowenKo’s Online Store

powenko_arduinoBook
Android7

Amazon

adsbygoogle

Recent Posts

Categories

Amazon