一. 简单介绍
在上一篇里
我们简单的介绍了Android里的TTS功能并实现了一个最简单的Demo例子--AndroidTTSDemoFirst,在这篇文章中我们将具体介绍用到的TTS API,并给上一个Demo增加语言选择功能,可以使用TTS引擎支持的 English、 French 、 German 、 Italian 和 Spanish 这 5大语言来进行相应的语音合成,并用这 5
二. 实例分析
我们希望做的效果如下:
图1 实现效果图
有了上一个例子做基础,这个Demo比较好实现,主要是增加了一个语言选择的控件Spinner,选择不同的语言,就会用对应的语言表达“我爱你”。
接下来就边实现这个Demo边讲解用到的TTS API。也是先创建一个Android工程,工程名为AndroidTTSDemoSecond,其中SDK必须选择1.6版本及以上。
其中Main.xml文件也还是很简单,在前一个AndroidTTSDemoFirst例子的基础上增加了一个Spinner控件, 如下所示:
[xhtml] view plain copy
1. <?xml version="1.0" encoding="utf-8"?>
2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3. android:orientation="vertical"
4. android:layout_width="fill_parent"
5. android:layout_height="fill_parent"
6. >
7. <EditText android:id="@+id/inputText"
8. android:hint="Input the text here!"
9. android:layout_width="fill_parent"
10. android:layout_height="wrap_content">
11. </EditText>
12. <Button android:text="Speak"
13. android:id="@+id/speakBtn"
14. android:layout_width="wrap_content"
15. android:layout_height="wrap_content"
16. android:layout_gravity="center_horizontal"
17. android:enabled="false"
18. ></Button>
19. <Spinner android:id="@+id/langSelect"
20. android:layout_width="wrap_content"
21. android:layout_height="wrap_content"
22. android:layout_gravity="center_horizontal">
23. </Spinner>
24. </LinearLayout>
Java文件的编写:
因为这个Demo例子只是在上一个AndroidTTSDemoFirst基础上的增加,因此可以使用上一个编写的java文件,只要把class名字改为AndroidTTSDemoSecond,如下所示:
[java] view plain copy
1. public class AndroidTTSDemoSecond extends Activity implements OnInitListener{
2. /** Called when the activity is first created. */
3. private EditText inputText = null;
4. private Button speakBtn = null;
5. private static final int REQ_TTS_STATUS_CHECK = 0;
6. private static final String TAG = "TTS Demo";
7. private TextToSpeech mTts;
8. @Override
9. public void onCreate(Bundle savedInstanceState) {
10. super.onCreate(savedInstanceState);
11. setContentView(R.layout.main);
12.
13. //检查TTS数据是否已经安装并且可用
14. new Intent();
15. checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
16. startActivityForResult(checkIntent, REQ_TTS_STATUS_CHECK);
17.
18. inputText = (EditText)findViewById(R.id.inputText);
19. speakBtn = (Button)findViewById(R.id.speakBtn);
20. "This is an example of speech synthesis.");
21. new OnClickListener() {
22.
23. public void onClick(View v) {
24. // TODO Auto-generated method stub
25. null);
26. //朗读输入框里的内容
27. }
28. });
29. }
30.
31. //实现TTS初始化接口
32. @Override
33. public void onInit(int status) {
34. // TODO Auto-generated method stub
35. //TTS Engine初始化完成
36. if(status == TextToSpeech.SUCCESS)
37. {
38. int result = mTts.setLanguage(Locale.US);
39. //设置发音语言
40. if(result == TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED)
41. //判断语言是否可用
42. {
43. "Language is not available");
44. false);
45. }
46. else
47. {
48. "This is an example of speech synthesis.", TextToSpeech.QUEUE_ADD, null);
49. true);
50. }
51. }
52.
53. }
54.
55. protected void onActivityResult(int requestCode, int resultCode, Intent data) {
56. if(requestCode == REQ_TTS_STATUS_CHECK)
57. {
58. switch (resultCode) {
59. case TextToSpeech.Engine.CHECK_VOICE_DATA_PASS:
60. //这个返回结果表明TTS Engine可以用
61. {
62. new TextToSpeech(this, this);
63. "TTS Engine is installed!");
64.
65. }
66.
67. break;
68. case TextToSpeech.Engine.CHECK_VOICE_DATA_BAD_DATA:
69. //需要的语音数据已损坏
70. case TextToSpeech.Engine.CHECK_VOICE_DATA_MISSING_DATA:
71. //缺少需要语言的语音数据
72. case TextToSpeech.Engine.CHECK_VOICE_DATA_MISSING_VOLUME:
73. //缺少需要语言的发音数据
74. {
75. //这三种情况都表明数据有错,重新下载安装需要的数据
76. "Need language stuff:"+resultCode);
77. new Intent();
78. dataIntent.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
79. startActivity(dataIntent);
80.
81. }
82. break;
83. case TextToSpeech.Engine.CHECK_VOICE_DATA_FAIL:
84. //检查失败
85. default:
86. "Got a failure. TTS apparently not available");
87. break;
88. }
89. }
90. else
91. {
92. //其他Intent返回的结果
93. }
94. }
95.
96. @Override
97. protected void onPause() {
98. // TODO Auto-generated method stub
99. super.onPause();
100. if(mTts != null)
101. //activity暂停时也停止TTS
102. {
103. mTts.stop();
104. }
105. }
106.
107. @Override
108. protected void onDestroy() {
109. // TODO Auto-generated method stub
110. super.onDestroy();
111. //释放TTS的资源
112. mTts.shutdown();
113. }
114. }
下面简单介绍下上面代码中和TTS相关的一些API使用。
首先是实现 OnInitListener 这个接口,这个接口中只有一个抽象函数 void onInit( int status),在 TextToSpeech 引擎初始化完成后调用,在这个函数里就可以根据状态 status(为TextToSpeech.SUCCESS 或者 TextToSpeech. Error )判断TTS
接着在使用TTS 时,会先启动一个 Activity 检查 TTS 引擎需要的 TTS 数据是否已经安装并且可用,checkIntent. setAction ( TextToSpeech .Engine. ACTION_CHECK_TTS_DATA );
这个 Activity会返回如下结果之一: CHECK_VOICE_DATA_PASS , CHECK_VOICE_DATA_FAIL , CHECK_VOICE_DATA_BAD_DATA , CHECK_VOICE_DATA_MISSING_DATA , 或者CHECK_VOICE_DATA_MISSING_VOLUME .
只有第一个结果 CHECK_VOICE_DATA_PASS 表明 TTS数据可用,其他都是数据不可用的结果,可以启动一个 Activity 去安装需要的 TTS
dataIntent.setAction(TextToSpeech.Engine. ACTION_INSTALL_TTS_DATA );
当数据可用时,就可以创建一个TextToSpeech
public TextToSpeech ( Context context, TextToSpeech.OnInitListener listener)
这里需要两个参数,一个是 TTS 实例运行的 Context;
另一个是初始化接口的实现,在实例的创建过程中,如果TTS 引擎没有运行的话,则会初始化 TTS 引擎,并且在初始化完成后调用其第二个参数 listener
有了 TextToSpeech实例,接下来就可以对文本进行语音合成并发音了,对应的 API为
public int speak ( String text, int queueMode, HashMap < String , String > params)
这里需要三个参数,第一个为要合成的文本;
第二个为使用 TTS队列的方式,因为使用TTS合成语音时需要时间,TTS引擎就会把还没有轮到的部分放在其队列中排队,后来的内容有两种使用队列的方式: QUEUE_ADD 或者 QUEUE_FLUSH, QUEUE_ADD 表示把当前需要合成的内容添加到 TTS队列的后面,等前面的都完成了后再轮到他,QUEUE_FLUSH 表示清除队列中原有的内容,直接使 TTS引擎对当前内容进行语音合成,一般来说适合比较紧急的情况使用,但因为在 Android 中可能不止你一个程序使用 TTS 引擎,因此为了不破坏其他人的数据,建议使用 QUEUE_ADD
第三个为键值对表示的一个参数,我们后面再来介绍,目前可以使其为 null
前半部分简单的介绍了前一个Demo 用到的 API ,下半部分添加这个 Demo
首先为 Spinner
[java] view plain copy
1. private Spinner langSelect = null;
2. private String languages[]={"English","French","German","Italian","Spanish"};
接着添加 Spinner
[java] view plain copy
1. langSelect = (Spinner)findViewById(R.id.langSelect);
2.
3. "I love you");
4.
5. new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, languages);
6. adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
7. langSelect.setAdapter(adapter);
8. 0);
和TTS 相关的部分是 Spinner
[java] view plain copy
1. langSelect.setOnItemSelectedListener(new OnItemSelectedListener() {
2. public void onItemSelected(AdapterView<?> parent, View view,
3. int position, long id) {
4. // TODO Auto-generated method stub
5. int pos = langSelect.getSelectedItemPosition();
6. int result = -1;
7. switch (pos) {
8. case 0:
9. {
10. "I love you");
11. result = mTts.setLanguage(Locale.US);
12. }
13.
14. break;
15. case 1:
16. {
17. "Je t'aime");
18. result = mTts.setLanguage(Locale.FRENCH);
19. }
20. break;
21. case 2:
22. {
23. "Ich liebe dich");
24. result = mTts.setLanguage(Locale.GERMAN);
25. }
26. break;
27. case 3:
28. {
29. "Ti amo");
30. result = mTts.setLanguage(Locale.ITALIAN);
31. }
32. break;
33. case 4:
34. {
35. "Te quiero");
36. new Locale("spa", "ESP"));
37. }
38. break;
39. default:
40. break;
41. }
42. //设置发音语言
43. if(result == TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED)
44. //判断语言是否可用
45. {
46. "Language is not available");
47. false);
48. }
49. else
50. {
51. true);
52. }
53. }
54. public void onNothingSelected(AdapterView<?> arg) {
55. // TODO Auto-generated method stub
56.
57. }
58. );
在选择不同的 item时,为 inputText
为TTS 引擎设置语言的 API
public int setLanguage ( Locale loc)
使用Locale 这个表示语言及国家区域的类来设置语言,目前支持 English、 French 、 German 、 Italian 和Spanish 这 5大语言, 返回的结果为
LANG_AVAILABLE , LANG_COUNTRY_AVAILABLE , LANG_COUNTRY_VAR_AVAILABLE , LANG_MISSING_DATA 和 LANG_NOT_SUPPORTED 。其中 LANG_MISSING_DATA 和LANG_NOT_SUPPORTED
Demo
图2
文章对应的完整代码例子可以在这里下载:
注:文章参加“ 首届Google暑期大学生博客分享大赛——2010 Andriod篇”
一. 简单介绍
在上一篇里
我们简单的介绍了Android里的TTS功能并实现了一个最简单的Demo例子--AndroidTTSDemoFirst,在这篇文章中我们将具体介绍用到的TTS API,并给上一个Demo增加语言选择功能,可以使用TTS引擎支持的 English、 French 、 German 、 Italian 和 Spanish 这 5大语言来进行相应的语音合成,并用这 5
二. 实例分析
我们希望做的效果如下:
图1 实现效果图
有了上一个例子做基础,这个Demo比较好实现,主要是增加了一个语言选择的控件Spinner,选择不同的语言,就会用对应的语言表达“我爱你”。
接下来就边实现这个Demo边讲解用到的TTS API。也是先创建一个Android工程,工程名为AndroidTTSDemoSecond,其中SDK必须选择1.6版本及以上。
其中Main.xml文件也还是很简单,在前一个AndroidTTSDemoFirst例子的基础上增加了一个Spinner控件, 如下所示:
[xhtml] view plain copy
1. <?xml version="1.0" encoding="utf-8"?>
2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3. android:orientation="vertical"
4. android:layout_width="fill_parent"
5. android:layout_height="fill_parent"
6. >
7. <EditText android:id="@+id/inputText"
8. android:hint="Input the text here!"
9. android:layout_width="fill_parent"
10. android:layout_height="wrap_content">
11. </EditText>
12. <Button android:text="Speak"
13. android:id="@+id/speakBtn"
14. android:layout_width="wrap_content"
15. android:layout_height="wrap_content"
16. android:layout_gravity="center_horizontal"
17. android:enabled="false"
18. ></Button>
19. <Spinner android:id="@+id/langSelect"
20. android:layout_width="wrap_content"
21. android:layout_height="wrap_content"
22. android:layout_gravity="center_horizontal">
23. </Spinner>
24. </LinearLayout>
Java文件的编写:
因为这个Demo例子只是在上一个AndroidTTSDemoFirst基础上的增加,因此可以使用上一个编写的java文件,只要把class名字改为AndroidTTSDemoSecond,如下所示:
[java] view plain copy
1. public class AndroidTTSDemoSecond extends Activity implements OnInitListener{
2. /** Called when the activity is first created. */
3. private EditText inputText = null;
4. private Button speakBtn = null;
5. private static final int REQ_TTS_STATUS_CHECK = 0;
6. private static final String TAG = "TTS Demo";
7. private TextToSpeech mTts;
8. @Override
9. public void onCreate(Bundle savedInstanceState) {
10. super.onCreate(savedInstanceState);
11. setContentView(R.layout.main);
12.
13. //检查TTS数据是否已经安装并且可用
14. new Intent();
15. checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
16. startActivityForResult(checkIntent, REQ_TTS_STATUS_CHECK);
17.
18. inputText = (EditText)findViewById(R.id.inputText);
19. speakBtn = (Button)findViewById(R.id.speakBtn);
20. "This is an example of speech synthesis.");
21. new OnClickListener() {
22.
23. public void onClick(View v) {
24. // TODO Auto-generated method stub
25. null);
26. //朗读输入框里的内容
27. }
28. });
29. }
30.
31. //实现TTS初始化接口
32. @Override
33. public void onInit(int status) {
34. // TODO Auto-generated method stub
35. //TTS Engine初始化完成
36. if(status == TextToSpeech.SUCCESS)
37. {
38. int result = mTts.setLanguage(Locale.US);
39. //设置发音语言
40. if(result == TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED)
41. //判断语言是否可用
42. {
43. "Language is not available");
44. false);
45. }
46. else
47. {
48. "This is an example of speech synthesis.", TextToSpeech.QUEUE_ADD, null);
49. true);
50. }
51. }
52.
53. }
54.
55. protected void onActivityResult(int requestCode, int resultCode, Intent data) {
56. if(requestCode == REQ_TTS_STATUS_CHECK)
57. {
58. switch (resultCode) {
59. case TextToSpeech.Engine.CHECK_VOICE_DATA_PASS:
60. //这个返回结果表明TTS Engine可以用
61. {
62. new TextToSpeech(this, this);
63. "TTS Engine is installed!");
64.
65. }
66.
67. break;
68. case TextToSpeech.Engine.CHECK_VOICE_DATA_BAD_DATA:
69. //需要的语音数据已损坏
70. case TextToSpeech.Engine.CHECK_VOICE_DATA_MISSING_DATA:
71. //缺少需要语言的语音数据
72. case TextToSpeech.Engine.CHECK_VOICE_DATA_MISSING_VOLUME:
73. //缺少需要语言的发音数据
74. {
75. //这三种情况都表明数据有错,重新下载安装需要的数据
76. "Need language stuff:"+resultCode);
77. new Intent();
78. dataIntent.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
79. startActivity(dataIntent);
80.
81. }
82. break;
83. case TextToSpeech.Engine.CHECK_VOICE_DATA_FAIL:
84. //检查失败
85. default:
86. "Got a failure. TTS apparently not available");
87. break;
88. }
89. }
90. else
91. {
92. //其他Intent返回的结果
93. }
94. }
95.
96. @Override
97. protected void onPause() {
98. // TODO Auto-generated method stub
99. super.onPause();
100. if(mTts != null)
101. //activity暂停时也停止TTS
102. {
103. mTts.stop();
104. }
105. }
106.
107. @Override
108. protected void onDestroy() {
109. // TODO Auto-generated method stub
110. super.onDestroy();
111. //释放TTS的资源
112. mTts.shutdown();
113. }
114. }
下面简单介绍下上面代码中和TTS相关的一些API使用。
首先是实现 OnInitListener 这个接口,这个接口中只有一个抽象函数 void onInit( int status),在 TextToSpeech 引擎初始化完成后调用,在这个函数里就可以根据状态 status(为TextToSpeech.SUCCESS 或者 TextToSpeech. Error )判断TTS
接着在使用TTS 时,会先启动一个 Activity 检查 TTS 引擎需要的 TTS 数据是否已经安装并且可用,checkIntent. setAction ( TextToSpeech .Engine. ACTION_CHECK_TTS_DATA );
这个 Activity会返回如下结果之一: CHECK_VOICE_DATA_PASS , CHECK_VOICE_DATA_FAIL , CHECK_VOICE_DATA_BAD_DATA , CHECK_VOICE_DATA_MISSING_DATA , 或者CHECK_VOICE_DATA_MISSING_VOLUME .
只有第一个结果 CHECK_VOICE_DATA_PASS 表明 TTS数据可用,其他都是数据不可用的结果,可以启动一个 Activity 去安装需要的 TTS
dataIntent.setAction(TextToSpeech.Engine. ACTION_INSTALL_TTS_DATA );
当数据可用时,就可以创建一个TextToSpeech
public TextToSpeech ( Context context, TextToSpeech.OnInitListener listener)
这里需要两个参数,一个是 TTS 实例运行的 Context;
另一个是初始化接口的实现,在实例的创建过程中,如果TTS 引擎没有运行的话,则会初始化 TTS 引擎,并且在初始化完成后调用其第二个参数 listener
有了 TextToSpeech实例,接下来就可以对文本进行语音合成并发音了,对应的 API为
public int speak ( String text, int queueMode, HashMap < String , String > params)
这里需要三个参数,第一个为要合成的文本;
第二个为使用 TTS队列的方式,因为使用TTS合成语音时需要时间,TTS引擎就会把还没有轮到的部分放在其队列中排队,后来的内容有两种使用队列的方式: QUEUE_ADD 或者 QUEUE_FLUSH, QUEUE_ADD 表示把当前需要合成的内容添加到 TTS队列的后面,等前面的都完成了后再轮到他,QUEUE_FLUSH 表示清除队列中原有的内容,直接使 TTS引擎对当前内容进行语音合成,一般来说适合比较紧急的情况使用,但因为在 Android 中可能不止你一个程序使用 TTS 引擎,因此为了不破坏其他人的数据,建议使用 QUEUE_ADD
第三个为键值对表示的一个参数,我们后面再来介绍,目前可以使其为 null
前半部分简单的介绍了前一个Demo 用到的 API ,下半部分添加这个 Demo
首先为 Spinner
[java] view plain copy
1. private Spinner langSelect = null;
2. private String languages[]={"English","French","German","Italian","Spanish"};
接着添加 Spinner
[java] view plain copy
1. langSelect = (Spinner)findViewById(R.id.langSelect);
2.
3. "I love you");
4.
5. new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, languages);
6. adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
7. langSelect.setAdapter(adapter);
8. 0);
和TTS 相关的部分是 Spinner
[java] view plain copy
1. langSelect.setOnItemSelectedListener(new OnItemSelectedListener() {
2. public void onItemSelected(AdapterView<?> parent, View view,
3. int position, long id) {
4. // TODO Auto-generated method stub
5. int pos = langSelect.getSelectedItemPosition();
6. int result = -1;
7. switch (pos) {
8. case 0:
9. {
10. "I love you");
11. result = mTts.setLanguage(Locale.US);
12. }
13.
14. break;
15. case 1:
16. {
17. "Je t'aime");
18. result = mTts.setLanguage(Locale.FRENCH);
19. }
20. break;
21. case 2:
22. {
23. "Ich liebe dich");
24. result = mTts.setLanguage(Locale.GERMAN);
25. }
26. break;
27. case 3:
28. {
29. "Ti amo");
30. result = mTts.setLanguage(Locale.ITALIAN);
31. }
32. break;
33. case 4:
34. {
35. "Te quiero");
36. new Locale("spa", "ESP"));
37. }
38. break;
39. default:
40. break;
41. }
42. //设置发音语言
43. if(result == TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED)
44. //判断语言是否可用
45. {
46. "Language is not available");
47. false);
48. }
49. else
50. {
51. true);
52. }
53. }
54. public void onNothingSelected(AdapterView<?> arg) {
55. // TODO Auto-generated method stub
56.
57. }
58. );
在选择不同的 item时,为 inputText
为TTS 引擎设置语言的 API
public int setLanguage ( Locale loc)
使用Locale 这个表示语言及国家区域的类来设置语言,目前支持 English、 French 、 German 、 Italian 和Spanish 这 5大语言, 返回的结果为
LANG_AVAILABLE , LANG_COUNTRY_AVAILABLE , LANG_COUNTRY_VAR_AVAILABLE , LANG_MISSING_DATA 和 LANG_NOT_SUPPORTED 。其中 LANG_MISSING_DATA 和LANG_NOT_SUPPORTED
Demo
图2
文章对应的完整代码例子可以在这里下载:
注:文章参加“ 首届Google暑期大学生博客分享大赛——2010 Andriod篇”
标签:Engine,TextToSpeech,我爱你,TTS,int,Android,DATA,CHECK From: https://blog.51cto.com/u_16034393/7016846