转载

文本 To 音频

文本  To  音频

TextToSpeech介绍

TextToSpeech,简称 TTS,是Android 1.6版本中比较重要的新功能。将所指定的文本转成不同语言音频输出。它可以方便的嵌入到游戏或者应用程序中,增强用户体验。

TTS Engine,依托于当前Android Platform所支持的几种主要语言:English、French、German、Italian及Spanish五大语言(暂时没有直接中文)。TTS可以将文本随意的转换成以上任意五种语言的语音输出。

布局设计

界面中组件的设计很简单,分为四个部分:

1、内容编辑框,供用户输入需要转换成语音的文本;

2、音频播放按钮,点击后播放文本对应的音频;

3、语调编辑框,供用户调节朗读的语调,支持浮点型数据,默认值为1.0;

4、语速编辑框,供用户调节语速的语速,只能为整型数据,默认值为1;

代码如下:

 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  2     xmlns:tools="http://schemas.android.com/tools"  3     android:layout_width="match_parent"  4     android:layout_height="match_parent"  5     android:orientation="vertical"  6     android:gravity="center_vertical"   7     tools:context="com.texttospeechtest.MainActivity" >  8       9     <LinearLayout 10         android:layout_width="wrap_content" 11            android:layout_height="wrap_content" 12            android:orientation="horizontal" 13            android:layout_gravity="center_horizontal" 14            android:gravity="center_horizontal" > 15          16         <TextView  17             android:layout_width="wrap_content" 18             android:layout_height="wrap_content" 19             android:text="@string/speak_content" 20             android:textColor="#f00" />  21              22         <EditText android:id="@+id/input_something" 23             android:layout_width="wrap_content" 24             android:layout_height="wrap_content" 25             android:hint="@string/input_something" /> 26          27     </LinearLayout> 28      29     <Button android:id="@+id/to_speak" 30         android:layout_width="wrap_content" 31         android:layout_height="wrap_content" 32         android:layout_gravity="center_horizontal" 33         android:layout_marginTop="40dp" 34         android:text="@string/to_speak" /> 35      36     <Button android:id="@+id/save_wav" 37         android:layout_width="wrap_content" 38         android:layout_height="wrap_content" 39         android:layout_gravity="center_horizontal" 40         android:layout_marginTop="40dp" 41         android:text="@string/save_wav" /> 42      43     <LinearLayout 44         android:layout_width="wrap_content" 45         android:layout_height="wrap_content" 46         android:orientation="horizontal" 47         android:layout_gravity="center_horizontal" 48         android:gravity="center_horizontal" 49         android:layout_marginTop="40dp" > 50          51         <TextView  52             android:layout_width="wrap_content" 53             android:layout_height="wrap_content" 54             android:text="@string/pitch_level_name" 55             android:textColor="#f00" /> 56          57         <EditText android:id="@+id/pitch_level" 58             android:layout_width="wrap_content" 59             android:layout_height="wrap_content" 60             android:hint="@string/pitch_level" 61             android:text="@string/pitch_level" /> 62          63     </LinearLayout>     64      65     <LinearLayout 66         android:layout_width="wrap_content" 67            android:layout_height="wrap_content" 68            android:orientation="horizontal" 69            android:layout_gravity="center_horizontal" 70            android:gravity="center_horizontal" 71            android:layout_marginTop="40dp" > 72          73         <TextView  74             android:layout_width="wrap_content" 75             android:layout_height="wrap_content" 76             android:text="@string/speak_rate_name" 77             android:textColor="#f00" />     78              79         <EditText android:id="@+id/speak_rate" 80             android:layout_width="wrap_content" 81             android:layout_height="wrap_content" 82             android:hint="@string/speak_rate" 83             android:text="@string/speak_rate" /> 84          85     </LinearLayout> 86      87 </LinearLayout>

其中用到的字符串定义在values/strings.xml文件中:

 1 <?xml version="1.0" encoding="utf-8"?>  2 <resources>  3   4     <string name="app_name">TextToSpeechTest</string>  5     <string name="hello_world">Hello world!</string>  6     <string name="action_settings">Settings</string>  7     <string name="speak_content">Speak Content: </string>  8     <string name="input_something">Input Something</string>  9     <string name="to_speak">To Speak</string> 10     <string name="pitch_level_name">Pitch Level(float): </string> 11     <string name="pitch_level">1.0</string> 12     <string name="speak_rate_name">Speak Rate(int): </string> 13     <string name="speak_rate">1</string> 14  15 </resources>

TTS应用

1、在应用程序中实现TTS的TextToSpeech.OnInitListener监听器,测试案例针对onInit(int status)和onDestroy()两个方法进行了重载。代码如下:

 1 @Override  2 public void onInit(int status) {  3     // TODO Auto-generated method stub  4     if (status == TextToSpeech.SUCCESS) {  5         int result = tts.setLanguage(Locale.US);  6    7         if (result == TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED) {  8             Log.e("TTS", "This Language is not supported");  9             speak.setEnabled(false); 10         } else { 11             speak.setEnabled(true); 12         } 13     } else { 14         Log.e("TTS", "Initilization Failed!"); 15     } 16 }
1 @Override 2 public void onDestroy() { 3     // Don't forget to shutdown tts! 4     if (tts != null) { 5         tts.stop(); 6         tts.shutdown(); 7     } 8     super.onDestroy(); 9 }

2、对TTS、Button及EditText组件的对象进行初始化,是在主类MainActivity的重载方法onCreate(Bundle savedInstanceState) 中实现,代码如下:

 1 @Override  2 protected void onCreate(Bundle savedInstanceState) {  3     super.onCreate(savedInstanceState);  4     setContentView(R.layout.activity_main);  5       6     tts = new TextToSpeech(this, this);  7     content = (EditText)findViewById(R.id.input_something);  8     speak = (Button)findViewById(R.id.to_speak);  9     10     pitch = (EditText)findViewById(R.id.pitch_level); 11     rate = (EditText)findViewById(R.id.speak_rate); 12      13     speak.setOnClickListener(new OnClickListener(){ 14         @Override 15         public void onClick(View v) { 16             // TODO Auto-generated method stub 17             ToSpeak(); 18         } 19          20     });21 }

注意,在定义TTS对象tts时会对上面定义的onInit(int status)方法进行调用,这个过程非常关键。本案例中让其完成的事情包括:

A、判断初始化状态;

B、若成功,设置文本转换语言环境;

C、若语言环境存在并支持,则继续.....

3、点击音频播放按钮后,响应方法为ToSpeak(),其实现如下:

 1 public void ToSpeak(){  2     //to speak input content  3     String c = content.getText().toString();  4     if(c.equals("")){  5         Toast.makeText(this, "Please input something first.", Toast.LENGTH_SHORT).show();  6     }  7     else{  8         //set speak pitch  9         Float p = Float.valueOf(pitch.getText().toString()); 10         tts.setPitch(p); 11          12         //set speak rate 13         int r = Integer.valueOf(rate.getText().toString()); 14         tts.setSpeechRate(r); 15          16         tts.speak(c, TextToSpeech.QUEUE_FLUSH, null); 17     }     18 }

这里的代码就好理解了,主要是在获取用户输入的文本、语调及语速之后,进行音频的播放。注意:方法开头对文本编辑框中的内容进行了空字串(“” )判断,若为空则没有播放的必要。

结果图

虽然界面很简陋,还是附上几张图片把,毕竟是学习的成果。

输入不能为空的提示界面:

文本 To 音频

在US语言环境下,英文与中文输入(但只有英文能正常朗读):

文本 To 音频 文本 To 音频

总结

按照上述流程,英语(US)语言环境可以正常,其他四国语言未测试(按Google说明应该不成问题)。

资料显示TTS暂时不支持中文,但是在设置语言环境时,写入如下代码:

1 int result = tts.setLanguage(Locale.CHINA);

或:

1 int result = tts.setLanguage(Locale.CHINESE);

奇怪的是工程并没有报错,而且运行后按钮是使能状态,说明通过了语言存在与支持的判断环节。不过输入中文,点击之后是没有任何反应的,当然,此时输入什么都不会有反应。这是存在疑问的地方,希望知道的大神指点一二。

网上也提供了替代方案,比如利用第三方支持库SVox等。

正文到此结束
Loading...