0
点赞
收藏
分享

微信扫一扫

Android TTS学习——保存对你的喜欢(转)


一. 简单介绍

在上一篇里


我们介绍了TTS提供的接口 OnUtteranceCompletedListener 的使用,这个接口的作用是监听语音片段的朗读,并在语音片段朗读结束后调用其定义的回调函数,在回调函数里可以进行需要的操作。

在这一篇里我们介绍一下TTS提供的另一个有用的功能,把合成的语音以音频文件的形式保存在系统里,然后就可以直接用播放音频文件的方式来播放。

这个功能调用的函数为:

public int  synthesizeToFile ( String  text,  HashMap < String ,  String > params, String  filename)

第一个参数为要进行语音合成的文本;第二个参数我们在上一个Demo中有所介绍,是一个键值对形式的HashMap类型变量,可以设置语音片段的ID等;第三个参数为保存到系统中的文件名。

当你想和朋友分享一份精彩的文本合成语音后的效果时,你可以使用这个功能把它保存为音频文件发送给朋友,这样即使朋友的手机不具备TTS功能,也可以用播放音频的方式分享到;当你要对同一段较长的文本多次进行语音合成时,你可以把这段文本的语音保存为音频文件,然后使用时播放,这样会更省资源,运行速度更快,因为使用TTS是比较费资源的一个过程。因此我们会在某些场合用到这个功能。

下面我们就用这个功能完成一个Demo例子,当你害羞当面向她表白你对她的喜欢时,让Android帮你语音合成你想说的话,然后你就可以向她发送保存了对她喜欢的这个音频文件。

二. 实例开发

 

我们希望做的效果如下:

 

图1 实现效果图

 

第一个文本框里可以输入需要语音合成的文本,第二个文本框里输入要保存成的音频文件的文件名,点击第一个Speak 按钮你可以预听一下TTS 语音合成的效果,点击第二个Record 按钮,就会以音频文件的形式保存,然后就可以点击第三个Play

创建一个Android 工程,工程名为AndroidTTSDemoFourth ,其中SDK 版本需选择1.6

其中Main.xml

 


[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. <TextView android:id="@+id/filenameLabel"  
20. android:text="Save as:"  
21. android:layout_width="fill_parent"   
22. android:layout_height="wrap_content"                  
23. ></TextView>     
24. <EditText android:id="@+id/filenameText"  
25. android:hint="Input the saving file name here!"  
26. android:layout_width="fill_parent"   
27. android:layout_height="wrap_content">                  
28. ></EditText>  
29. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
30. android:orientation="horizontal"  
31. android:layout_width="fill_parent"  
32. android:layout_height="fill_parent"  
33. android:gravity="center_horizontal"  
34. >  
35. <Button android:id="@+id/recordBtn"  
36. android:text="Record"  
37. android:layout_width="wrap_content"   
38. android:layout_height="wrap_content"  
39. ></Button>  
40. <Button android:id="@+id/playBtn"  
41. android:text="Play"  
42. android:layout_width="wrap_content"   
43. android:layout_height="wrap_content"  
44. android:enabled="false"  
45. ></Button>  
46. </LinearLayout>                             
47. </LinearLayout>

 

 

Java

有了前面这些Demo 的实例开发,这个Demo

 


[java] 
    view plain
    copy 
    
 
  
1. public class AndroidTTSDemoFourth extends Activity implements OnInitListener{  
2. //实现初始接口  
3. /** Called when the activity is first created. */  
4. //定义变量  
5. private EditText inputText = null;  
6. private Button speakBtn = null;  
7. private EditText filenameText = null;  
8. private Button recordBtn = null;  
9. private Button playBtn = null;  
10. private TextToSpeech mTts;  
11. private static final String TAG = "TTS Demo";  
12. private static final String loveConfession = "jia jia, I love you. ";  
13. private String loveFileName = null;  
14. private File loveFile = null;  
15. private MediaPlayer player = null;  
16.       
17. @Override  
18. public void onCreate(Bundle savedInstanceState) {  
19. super.onCreate(savedInstanceState);  
20.         setContentView(R.layout.main);  
21. //创建TextToSpeech实例,初始化完成后会调用OnInitListener(第二个参数)的回调函数  
22. new TextToSpeech(this,  
23. this  // TextToSpeech.OnInitListener  
24.                 );  
25. //设置控件  
26.         inputText = (EditText)findViewById(R.id.inputText);  
27.         speakBtn = (Button)findViewById(R.id.speakBtn);  
28.         filenameText = (EditText)findViewById(R.id.filenameText);  
29.         recordBtn = (Button)findViewById(R.id.recordBtn);  
30.         playBtn = (Button)findViewById(R.id.playBtn);  
31.                 
32.         inputText.setText(loveConfession);    
33. "/sdcard/love.wav");  
34. new OnClickListener() {       
35. public void onClick(View v) {  
36. // TODO Auto-generated method stub  
37. //朗读输入框里的内容  
38. null);  
39.             }  
40.         });  
41. new OnClickListener() {              
42. @Override  
43. public void onClick(View v) {  
44. // TODO Auto-generated method stub  
45. //把TTS语音合成的结果保存为音频文件  
46.                 loveFileName = filenameText.getText().toString();  
47. new File(loveFileName);  
48. if(loveFile.exists())  
49.                 {  
50.                     loveFile.delete();  
51.                 }  
52. //把语音合成的结果保存到文件中  
53. if(TextToSpeech.SUCCESS == mTts.synthesizeToFile(inputText.getText().toString(), null, loveFileName))  
54.                 {  
55. "sound file created!", Toast.LENGTH_SHORT).show();  
56. true);  
57.                 }  
58. else  
59.                 {  
60. "failed to create sound file!", Toast.LENGTH_SHORT).show();  
61.                 }  
62.             }  
63.         });  
64. new OnClickListener() {            
65. @Override  
66. public void onClick(View v) {  
67. // TODO Auto-generated method stub  
68. //播放保存着的音频文件  
69. try  
70.                 {  
71. new MediaPlayer();  
72.                     player.setDataSource(loveFileName);  
73.                     player.prepare();  
74.                     player.start();  
75.                 }  
76. catch (Exception e) {  
77. // TODO: handle exception  
78. "failed to play sound file!", Toast.LENGTH_SHORT).show();  
79.                     e.printStackTrace();  
80.                 }  
81.             }  
82.         });  
83.     }  
84.       
85. public void onInit(int status) {  
86. // TODO Auto-generated method stub  
87. //TTS Engine初始化完成  
88. if(status == TextToSpeech.SUCCESS)  
89.         {  
90. int result = mTts.setLanguage(Locale.US);  
91. //设置发音语言  
92. if(result == TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED)  
93. //判断语言是否可用  
94.             {  
95. "Language is not available");  
96. false);  
97.             }  
98. else  
99.             {  
100. true);  
101.             }  
102.         }  
103.     }  
104.       
105. @Override  
106. protected void onDestroy() {  
107. // TODO Auto-generated method stub  
108. //释放TTS的资源  
109. if(mTts != null)  
110.         {  
111.             mTts.stop();  
112.             mTts.shutdown();  
113.         }     
114. super.onDestroy();  
115.     }  
116. }

和TTS 相关的新的部分为recordBtn 的onClick 事件的处理,先根据指定的文件名创建一个File

mTts .synthesizeToFile( inputText .getText().toString(), null, loveFileName )

把文本框中的内容语音合成后保存到文件中。

另一个playBtn 的onClick 事件的处理,主要就是创建一个MediaPlayer

 

至此,这个Demo 就完成了,但是在运行前,需创建一个带SD 卡的AVD ,因为要往SD

图2 必须创建带SD 卡的AVD

 

同时还需在AndroidManifest.xml

< uses-permission android:name = "android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission >

接着就可以运行这个Demo 了,运行程序后在Eclipse 中切换到DDMS 视图,接着选择查看File Explorer ,我们看到在没有点击程序的Record 按钮进行语音合成到文件保存时,sdcard

 

图3 原始的SD

 

 

然后我们在程序中点击Record 按钮,让TTS 把语音合成到文件,合成成功的话会弹出“sound file created! ”的提示,并且Play 按钮变成可用。点击Play 按钮就会播放刚刚保存的音频文件,和点击第一个的Speak 按钮朗读的内容是一样的。这时,我们再来查看下SD 卡的目录,会发现多了一个文件:love.wav

 

图4 语音合成到文件后的SD

 

 

并且,我们还可以使用adb pull 命令把这个文件从SD 卡上提取出来,在CMD 窗口中运行adb pull ./sdcard/love.wav 就可以把SD

 

图5 提取SD

最后,也可以在电脑上播放记录了你对她的喜欢的这个音频文件了,或者也可以把这个文件发送给你喜欢的她。

 

注:文章参加“ 首届Google暑期大学生博客分享大赛——2010 Andriod篇”


一. 简单介绍

在上一篇里


我们介绍了TTS提供的接口 OnUtteranceCompletedListener 的使用,这个接口的作用是监听语音片段的朗读,并在语音片段朗读结束后调用其定义的回调函数,在回调函数里可以进行需要的操作。

在这一篇里我们介绍一下TTS提供的另一个有用的功能,把合成的语音以音频文件的形式保存在系统里,然后就可以直接用播放音频文件的方式来播放。

这个功能调用的函数为:

public int  synthesizeToFile ( String  text,  HashMap < String ,  String > params, String  filename)

第一个参数为要进行语音合成的文本;第二个参数我们在上一个Demo中有所介绍,是一个键值对形式的HashMap类型变量,可以设置语音片段的ID等;第三个参数为保存到系统中的文件名。

当你想和朋友分享一份精彩的文本合成语音后的效果时,你可以使用这个功能把它保存为音频文件发送给朋友,这样即使朋友的手机不具备TTS功能,也可以用播放音频的方式分享到;当你要对同一段较长的文本多次进行语音合成时,你可以把这段文本的语音保存为音频文件,然后使用时播放,这样会更省资源,运行速度更快,因为使用TTS是比较费资源的一个过程。因此我们会在某些场合用到这个功能。

下面我们就用这个功能完成一个Demo例子,当你害羞当面向她表白你对她的喜欢时,让Android帮你语音合成你想说的话,然后你就可以向她发送保存了对她喜欢的这个音频文件。

二. 实例开发

 

我们希望做的效果如下:

 

图1 实现效果图

 

第一个文本框里可以输入需要语音合成的文本,第二个文本框里输入要保存成的音频文件的文件名,点击第一个Speak 按钮你可以预听一下TTS 语音合成的效果,点击第二个Record 按钮,就会以音频文件的形式保存,然后就可以点击第三个Play

创建一个Android 工程,工程名为AndroidTTSDemoFourth ,其中SDK 版本需选择1.6

其中Main.xml

 


[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. <TextView android:id="@+id/filenameLabel"  
20. android:text="Save as:"  
21. android:layout_width="fill_parent"   
22. android:layout_height="wrap_content"                  
23. ></TextView>     
24. <EditText android:id="@+id/filenameText"  
25. android:hint="Input the saving file name here!"  
26. android:layout_width="fill_parent"   
27. android:layout_height="wrap_content">                  
28. ></EditText>  
29. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
30. android:orientation="horizontal"  
31. android:layout_width="fill_parent"  
32. android:layout_height="fill_parent"  
33. android:gravity="center_horizontal"  
34. >  
35. <Button android:id="@+id/recordBtn"  
36. android:text="Record"  
37. android:layout_width="wrap_content"   
38. android:layout_height="wrap_content"  
39. ></Button>  
40. <Button android:id="@+id/playBtn"  
41. android:text="Play"  
42. android:layout_width="wrap_content"   
43. android:layout_height="wrap_content"  
44. android:enabled="false"  
45. ></Button>  
46. </LinearLayout>                             
47. </LinearLayout>

 

 

Java

有了前面这些Demo 的实例开发,这个Demo

 


[java] 
    view plain
    copy 
    
 
  
1. public class AndroidTTSDemoFourth extends Activity implements OnInitListener{  
2. //实现初始接口  
3. /** Called when the activity is first created. */  
4. //定义变量  
5. private EditText inputText = null;  
6. private Button speakBtn = null;  
7. private EditText filenameText = null;  
8. private Button recordBtn = null;  
9. private Button playBtn = null;  
10. private TextToSpeech mTts;  
11. private static final String TAG = "TTS Demo";  
12. private static final String loveConfession = "jia jia, I love you. ";  
13. private String loveFileName = null;  
14. private File loveFile = null;  
15. private MediaPlayer player = null;  
16.       
17. @Override  
18. public void onCreate(Bundle savedInstanceState) {  
19. super.onCreate(savedInstanceState);  
20.         setContentView(R.layout.main);  
21. //创建TextToSpeech实例,初始化完成后会调用OnInitListener(第二个参数)的回调函数  
22. new TextToSpeech(this,  
23. this  // TextToSpeech.OnInitListener  
24.                 );  
25. //设置控件  
26.         inputText = (EditText)findViewById(R.id.inputText);  
27.         speakBtn = (Button)findViewById(R.id.speakBtn);  
28.         filenameText = (EditText)findViewById(R.id.filenameText);  
29.         recordBtn = (Button)findViewById(R.id.recordBtn);  
30.         playBtn = (Button)findViewById(R.id.playBtn);  
31.                 
32.         inputText.setText(loveConfession);    
33. "/sdcard/love.wav");  
34. new OnClickListener() {       
35. public void onClick(View v) {  
36. // TODO Auto-generated method stub  
37. //朗读输入框里的内容  
38. null);  
39.             }  
40.         });  
41. new OnClickListener() {              
42. @Override  
43. public void onClick(View v) {  
44. // TODO Auto-generated method stub  
45. //把TTS语音合成的结果保存为音频文件  
46.                 loveFileName = filenameText.getText().toString();  
47. new File(loveFileName);  
48. if(loveFile.exists())  
49.                 {  
50.                     loveFile.delete();  
51.                 }  
52. //把语音合成的结果保存到文件中  
53. if(TextToSpeech.SUCCESS == mTts.synthesizeToFile(inputText.getText().toString(), null, loveFileName))  
54.                 {  
55. "sound file created!", Toast.LENGTH_SHORT).show();  
56. true);  
57.                 }  
58. else  
59.                 {  
60. "failed to create sound file!", Toast.LENGTH_SHORT).show();  
61.                 }  
62.             }  
63.         });  
64. new OnClickListener() {            
65. @Override  
66. public void onClick(View v) {  
67. // TODO Auto-generated method stub  
68. //播放保存着的音频文件  
69. try  
70.                 {  
71. new MediaPlayer();  
72.                     player.setDataSource(loveFileName);  
73.                     player.prepare();  
74.                     player.start();  
75.                 }  
76. catch (Exception e) {  
77. // TODO: handle exception  
78. "failed to play sound file!", Toast.LENGTH_SHORT).show();  
79.                     e.printStackTrace();  
80.                 }  
81.             }  
82.         });  
83.     }  
84.       
85. public void onInit(int status) {  
86. // TODO Auto-generated method stub  
87. //TTS Engine初始化完成  
88. if(status == TextToSpeech.SUCCESS)  
89.         {  
90. int result = mTts.setLanguage(Locale.US);  
91. //设置发音语言  
92. if(result == TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED)  
93. //判断语言是否可用  
94.             {  
95. "Language is not available");  
96. false);  
97.             }  
98. else  
99.             {  
100. true);  
101.             }  
102.         }  
103.     }  
104.       
105. @Override  
106. protected void onDestroy() {  
107. // TODO Auto-generated method stub  
108. //释放TTS的资源  
109. if(mTts != null)  
110.         {  
111.             mTts.stop();  
112.             mTts.shutdown();  
113.         }     
114. super.onDestroy();  
115.     }  
116. }

 

和TTS 相关的新的部分为recordBtn 的onClick 事件的处理,先根据指定的文件名创建一个File

mTts .synthesizeToFile( inputText .getText().toString(), null, loveFileName )

把文本框中的内容语音合成后保存到文件中。

另一个playBtn 的onClick 事件的处理,主要就是创建一个MediaPlayer

 

至此,这个Demo 就完成了,但是在运行前,需创建一个带SD 卡的AVD ,因为要往SD

图2 必须创建带SD 卡的AVD

 

同时还需在AndroidManifest.xml

< uses-permission android:name = "android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission >

接着就可以运行这个Demo 了,运行程序后在Eclipse 中切换到DDMS 视图,接着选择查看File Explorer ,我们看到在没有点击程序的Record 按钮进行语音合成到文件保存时,sdcard

 

图3 原始的SD

 

 

然后我们在程序中点击Record 按钮,让TTS 把语音合成到文件,合成成功的话会弹出“sound file created! ”的提示,并且Play 按钮变成可用。点击Play 按钮就会播放刚刚保存的音频文件,和点击第一个的Speak 按钮朗读的内容是一样的。这时,我们再来查看下SD 卡的目录,会发现多了一个文件:love.wav

 

图4 语音合成到文件后的SD

 

 

并且,我们还可以使用adb pull 命令把这个文件从SD 卡上提取出来,在CMD 窗口中运行adb pull ./sdcard/love.wav 就可以把SD

 

图5 提取SD

最后,也可以在电脑上播放记录了你对她的喜欢的这个音频文件了,或者也可以把这个文件发送给你喜欢的她。

 

注:文章参加“ 首届Google暑期大学生博客分享大赛——2010 Andriod篇”

举报

相关推荐

0 条评论