首页 > 其他分享 >Android TTS学习——继续爱的表白(转)

Android TTS学习——继续爱的表白(转)

时间:2023-08-09 11:02:35浏览次数:35  
标签:片段 TextToSpeech String 表白 TTS 语音 lastUtterance Android

一. 简单介绍

在上一篇里


 

我们讲到了TTS 最主要的一个API

public int speak ( String   text, int queueMode,   HashMap < String ,   String > params)

其中我们介绍了前两个参数,第三个参数设置了null

而且我们在介绍Android TTS 提供的功能时,说到TTS 提供了两个接口,第一个初始化接口OnInitListener 我们已经使用过了,而第二个接口OnUtteranceCompletedListener 我们还没有使用到。

首先我们就来简单介绍一下这个接口的使用方式。TTS 引擎进行语音合成的每个语音片段叫做"utterance ", 而且在送给speak 函数进行语音合成时,可以为这次的语音片段"utterance "设置一个ID 。OnUtteranceCompletedListener 这个接口里定义了一个回调函数,当设置了ID 的语音片段"utterance " 语音合成结束后就会调用这个回调函数。然后我们就可以在这回调函数里进行我们需要的操作,比如在某个特定ID

Demo

 

二. 实例分析

我们希望做的效果如下:

 

图1 实现效果图

 

在界面上体现不出这个Demo 的特点,除了一长串英文的爱的表白外,还有一个Speak 按钮。但当点击了Speak

创建一个Android 工程,工程名为AndroidTTSDemoThird, 其中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.                   
20. </LinearLayout>

 

 

Java

这次要实现 OnInitListener 和 OnUtteranceCompletedListener 两个接口

 



[java]  view plain copy


1. public class AndroidTTSDemoThird extends Activity implements OnInitListener, OnUtteranceCompletedListener{  
2. /** Called when the activity is first created. */  
3. @Override  
4. public void onCreate(Bundle savedInstanceState) {  
5. super.onCreate(savedInstanceState);  
6.         setContentView(R.layout.main);  
7.     }  
8.       
9. @Override  
10. public void onInit(int status) {  
11. // TODO Auto-generated method stub  
12. //TTS Engine初始化完成  
13.           
14.     }  
15. @Override  
16. public void onUtteranceCompleted(String utteranceId) {  
17. // TODO Auto-generated method stub  
18. //一个语音片段结束后的回调函数  
19.           
20.     }  
21. }

 

 

接着定义好下面要用到的几个变量:

 



[java]  view plain copy


1. //定义变量  
2. private EditText inputText = null;  
3. private Button speakBtn = null;  
4. private TextToSpeech mTts;  
5. private static final String TAG = "TTS Demo";  
6. private static final String STORE_NAME = "preferenceFile";  
7. private static final String loveConfession = "You complete me. You had me at hello, you had me at hello. To the world you maybe one person, but to one person you maybe the world. Please believe me, I was prepared for everything,except you. I love that you are the last person I want to talk to before I go to sleep at night. Love means never having to say you're sorry. So choose me. Marry me. Let me make you happy. ";  
8. private String[] loveArray;   
9. private int lastUtterance = -1;  
10. private HashMap<String, String> params = new HashMap<String, String>();

 

因为通过前面的两个 Demo ,我们知道已经安装了 TTS 需要的数据,因此这里我们可以在onCreate 函数中直接创建一个 TextToSpeech

 



[java]  view plain copy


1. //创建TextToSpeech实例,初始化完成后会调用OnInitListener(第二个参数)的回调函数  
2. mTts = new TextToSpeech(this,  
3. this  // TextToSpeech.OnInitListener  
4.         );

 

 

成功创建一个 TextToSpeech 后,就会调用接口 OnInitListener

 



[java]  view plain copy

1. @Override  
2. public void onInit(int status) {  
3. // TODO Auto-generated method stub  
4. //TTS Engine初始化完成  
5. if(status == TextToSpeech.SUCCESS)  
6.     {  
7. int result = mTts.setLanguage(Locale.US);  
8. //设置发音语言  
9. if(result == TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED)  
10. //判断语言是否可用  
11.         {  
12. "Language is not available");  
13. false);  
14.         }  
15. else  
16.         {  
17. true);  
18. //设置一个语音片段结束后的回调函数  
19. this);  
20.         }  
21.     }     
22. }

 

 

和前面的 Demo 相比,这里多了一句 mTts .setOnUtteranceCompletedListener( this);

就是设置语音片段结束后的回调函数。

 

接着在 onCreate 函数中设置 EditText和 Button

 



[java]  view plain copy


1.       //设置控件  
2.       inputText = (EditText)findViewById(R.id.inputText);  
3.       speakBtn = (Button)findViewById(R.id.speakBtn);  
4.        
5.    inputText.setText(loveConfession);    
6. new OnClickListener() {         
7. public void onClick(View v) {  
8. // TODO Auto-generated method stub  
9. //处理输入框里的内容  
10. new StringTokenizer(inputText.getText().toString(),",.");  
11. int i = 0;  
12. new String[loveTokens.countTokens()];  
13. while(loveTokens.hasMoreTokens())  
14.         {  
15.             loveArray[i++] = loveTokens.nextToken();  
16.         }  
17. //朗读输入框里的内容  
18.         speakText();  
19.     }  
20. });

 

 

在 SpeakBtn 的 onClick 事件中,先把输入框中的内容按 ',' 和 '.' 分割成一个个短的部分并保存在字符串数组中,然后调用我们写的 speakText()

speakText()

 



[java]  view plain copy


1. private void speakText()  
2. {  
3.     lastUtterance++;  
4. if(lastUtterance >= loveArray.length)  
5.     {  
6. 0;  
7.     }  
8. "the begin utterance is " + lastUtterance);  
9. for(int i = lastUtterance; i < loveArray.length; i++)  
10.     {  
11. //为每个语音片段都设置一个标记  
12.         params.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, String.valueOf(i));  
13.         mTts.speak(loveArray[i], TextToSpeech.QUEUE_ADD, params);  
14.     }  
15. }


 

 

lastUtterance 变量保存上一个语音片段的 ID , params 是 HashMap<String, String> 类型,键值对形式的变量,在这里我们的键 name 为 TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID,是一个 UTTERANCE_ID ,值 value 为 String.valueOf(i) ,其实只要是任何字符串变量都行,为了方便我们设置的为有顺序的数字。然后把这个键值对变量添加给 speak 函数, TTS 引擎就会在这个语音片段朗读结束后通知我们,调用设置好的回调函数 onUtteranceCompleted(String utteranceId)

 



[java]  view plain copy


1. @Override  
2. public void onUtteranceCompleted(String utteranceId) {  
3. // TODO Auto-generated method stub  
4. //一个语音片段结束后的回调函数  
5. "Get completed message for the utteranceId " + utteranceId);  
6. //用lastUtterance记录当前结束的语音片段  
7.     lastUtterance = Integer.parseInt(utteranceId);  
8. }

 

很简单,主要就是把当前刚结束的这个语音片段 ID--utteranceId 保存到 lastUtterance

 



[java]  view plain copy


1. @Override  
2. protected void onDestroy() {  
3. // TODO Auto-generated method stub  
4. //释放TTS的资源  
5. if(mTts != null)  
6.     {  
7.         mTts.stop();  
8.         mTts.shutdown();  
9.     }  
10. //保存lastUtterance值  
11. 0);  
12.     SharedPreferences.Editor editor = settings.edit();  
13. "lastUtterance", lastUtterance);  
14.     editor.commit();  
15. "the stored lastUtterance is " + lastUtterance);  
16.       
17. super.onDestroy();  
18. }


 

 

首先是释放 TTS 资源,然后把 lastUtterance 变量的值以键值对的方式保存在系统中,这样下次启动程序时 lastUtterance 就可以从系统中读取上次退出时保存的值。在 onCreate 函数中添加获取保存的 lastUtterance

 



[java]  view plain copy

1. //获得保存的lastUtterance值  
2. SharedPreferences settings = getSharedPreferences(STORE_NAME, 0);  
3. lastUtterance = settings.getInt("lastUtterance", -1);  
4. Log.v(TAG, "the restored lastUtterance is " + lastUtterance);

 

 

至此,这个 Demo 完成了,运行后点击 Speak 按钮会朗读文本框中的经典的爱的表白,一小段一小段朗读,每朗读完一小段程序都会调用回调函数 onUtteranceCompleted 记录刚朗读完的那个小段的 ID ,当所有的表白没朗读完就按返回退出程序时,程序在 onDestroy() 里把记录着的片段 ID保存在系统中,这样下次再次打开程序时就可以接着上次继续这爱的表白。

 

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


分享到: 


上一篇: 基于Android的应用软件--地震及时通


一. 简单介绍

在上一篇里


 

我们讲到了TTS 最主要的一个API

public int speak ( String   text, int queueMode,   HashMap < String ,   String > params)

其中我们介绍了前两个参数,第三个参数设置了null

而且我们在介绍Android TTS 提供的功能时,说到TTS 提供了两个接口,第一个初始化接口OnInitListener 我们已经使用过了,而第二个接口OnUtteranceCompletedListener 我们还没有使用到。

首先我们就来简单介绍一下这个接口的使用方式。TTS 引擎进行语音合成的每个语音片段叫做"utterance ", 而且在送给speak 函数进行语音合成时,可以为这次的语音片段"utterance "设置一个ID 。OnUtteranceCompletedListener 这个接口里定义了一个回调函数,当设置了ID 的语音片段"utterance " 语音合成结束后就会调用这个回调函数。然后我们就可以在这回调函数里进行我们需要的操作,比如在某个特定ID

Demo

 

二. 实例分析

我们希望做的效果如下:

 

图1 实现效果图

 

在界面上体现不出这个Demo 的特点,除了一长串英文的爱的表白外,还有一个Speak 按钮。但当点击了Speak

创建一个Android 工程,工程名为AndroidTTSDemoThird, 其中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.                   
20. </LinearLayout>  
 
 
 
 
Java
这次要实现 OnInitListener 和 OnUtteranceCompletedListener 两个接口
 
 
 
 
    [java] 
    view plain
    copy 
    
 
  
1. public class AndroidTTSDemoThird extends Activity implements OnInitListener, OnUtteranceCompletedListener{  
2. /** Called when the activity is first created. */  
3. @Override  
4. public void onCreate(Bundle savedInstanceState) {  
5. super.onCreate(savedInstanceState);  
6.         setContentView(R.layout.main);  
7.     }  
8.       
9. @Override  
10. public void onInit(int status) {  
11. // TODO Auto-generated method stub  
12. //TTS Engine初始化完成  
13.           
14.     }  
15. @Override  
16. public void onUtteranceCompleted(String utteranceId) {  
17. // TODO Auto-generated method stub  
18. //一个语音片段结束后的回调函数  
19.           
20.     }  
21. }  
 
 
 
 
接着定义好下面要用到的几个变量:
 
 
 
 
    [java] 
    view plain
    copy 
    
 
  
1. //定义变量  
2. private EditText inputText = null;  
3. private Button speakBtn = null;  
4. private TextToSpeech mTts;  
5. private static final String TAG = "TTS Demo";  
6. private static final String STORE_NAME = "preferenceFile";  
7. private static final String loveConfession = "You complete me. You had me at hello, you had me at hello. To the world you maybe one person, but to one person you maybe the world. Please believe me, I was prepared for everything,except you. I love that you are the last person I want to talk to before I go to sleep at night. Love means never having to say you're sorry. So choose me. Marry me. Let me make you happy. ";  
8. private String[] loveArray;   
9. private int lastUtterance = -1;  
10. private HashMap<String, String> params = new HashMap<String, String>();

 

因为通过前面的两个 Demo ,我们知道已经安装了 TTS 需要的数据,因此这里我们可以在onCreate 函数中直接创建一个 TextToSpeech

 



[java]  view plain copy


1. //创建TextToSpeech实例,初始化完成后会调用OnInitListener(第二个参数)的回调函数  
2. mTts = new TextToSpeech(this,  
3. this  // TextToSpeech.OnInitListener  
4.         );

 

 

成功创建一个 TextToSpeech 后,就会调用接口 OnInitListener

 



[java]  view plain copy


1. @Override  
2. public void onInit(int status) {  
3. // TODO Auto-generated method stub  
4. //TTS Engine初始化完成  
5. if(status == TextToSpeech.SUCCESS)  
6.     {  
7. int result = mTts.setLanguage(Locale.US);  
8. //设置发音语言  
9. if(result == TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED)  
10. //判断语言是否可用  
11.         {  
12. "Language is not available");  
13. false);  
14.         }  
15. else  
16.         {  
17. true);  
18. //设置一个语音片段结束后的回调函数  
19. this);  
20.         }  
21.     }     
22. }


 

 

和前面的 Demo 相比,这里多了一句 mTts .setOnUtteranceCompletedListener( this);

就是设置语音片段结束后的回调函数。

 

接着在 onCreate 函数中设置 EditText和 Button

 



[java]  view plain copy

1.       //设置控件  
2.       inputText = (EditText)findViewById(R.id.inputText);  
3.       speakBtn = (Button)findViewById(R.id.speakBtn);  
4.        
5.    inputText.setText(loveConfession);    
6. new OnClickListener() {         
7. public void onClick(View v) {  
8. // TODO Auto-generated method stub  
9. //处理输入框里的内容  
10. new StringTokenizer(inputText.getText().toString(),",.");  
11. int i = 0;  
12. new String[loveTokens.countTokens()];  
13. while(loveTokens.hasMoreTokens())  
14.         {  
15.             loveArray[i++] = loveTokens.nextToken();  
16.         }  
17. //朗读输入框里的内容  
18.         speakText();  
19.     }  
20. });


 

 

在 SpeakBtn 的 onClick 事件中,先把输入框中的内容按 ',' 和 '.' 分割成一个个短的部分并保存在字符串数组中,然后调用我们写的 speakText()

speakText()

 



[java]  view plain copy


1. private void speakText()  
2. {  
3.     lastUtterance++;  
4. if(lastUtterance >= loveArray.length)  
5.     {  
6. 0;  
7.     }  
8. "the begin utterance is " + lastUtterance);  
9. for(int i = lastUtterance; i < loveArray.length; i++)  
10.     {  
11. //为每个语音片段都设置一个标记  
12.         params.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, String.valueOf(i));  
13.         mTts.speak(loveArray[i], TextToSpeech.QUEUE_ADD, params);  
14.     }  
15. }

 

 

lastUtterance 变量保存上一个语音片段的 ID , params 是 HashMap<String, String> 类型,键值对形式的变量,在这里我们的键 name 为 TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID,是一个 UTTERANCE_ID ,值 value 为 String.valueOf(i) ,其实只要是任何字符串变量都行,为了方便我们设置的为有顺序的数字。然后把这个键值对变量添加给 speak 函数, TTS 引擎就会在这个语音片段朗读结束后通知我们,调用设置好的回调函数 onUtteranceCompleted(String utteranceId)

 



[java]  view plain copy


1. @Override  
2. public void onUtteranceCompleted(String utteranceId) {  
3. // TODO Auto-generated method stub  
4. //一个语音片段结束后的回调函数  
5. "Get completed message for the utteranceId " + utteranceId);  
6. //用lastUtterance记录当前结束的语音片段  
7.     lastUtterance = Integer.parseInt(utteranceId);  
8. }

 

很简单,主要就是把当前刚结束的这个语音片段 ID--utteranceId 保存到 lastUtterance

 



[java]  view plain copy


1. @Override  
2. protected void onDestroy() {  
3. // TODO Auto-generated method stub  
4. //释放TTS的资源  
5. if(mTts != null)  
6.     {  
7.         mTts.stop();  
8.         mTts.shutdown();  
9.     }  
10. //保存lastUtterance值  
11. 0);  
12.     SharedPreferences.Editor editor = settings.edit();  
13. "lastUtterance", lastUtterance);  
14.     editor.commit();  
15. "the stored lastUtterance is " + lastUtterance);  
16.       
17. super.onDestroy();  
18. }


 

 

首先是释放 TTS 资源,然后把 lastUtterance 变量的值以键值对的方式保存在系统中,这样下次启动程序时 lastUtterance 就可以从系统中读取上次退出时保存的值。在 onCreate 函数中添加获取保存的 lastUtterance

 



[java]  view plain copy


1. //获得保存的lastUtterance值  
2. SharedPreferences settings = getSharedPreferences(STORE_NAME, 0);  
3. lastUtterance = settings.getInt("lastUtterance", -1);  
4. Log.v(TAG, "the restored lastUtterance is " + lastUtterance);

 

 

至此,这个 Demo 完成了,运行后点击 Speak 按钮会朗读文本框中的经典的爱的表白,一小段一小段朗读,每朗读完一小段程序都会调用回调函数 onUtteranceCompleted 记录刚朗读完的那个小段的 ID ,当所有的表白没朗读完就按返回退出程序时,程序在 onDestroy() 里把记录着的片段 ID保存在系统中,这样下次再次打开程序时就可以接着上次继续这爱的表白。

 


标签:片段,TextToSpeech,String,表白,TTS,语音,lastUtterance,Android
From: https://blog.51cto.com/u_16034393/7016837

相关文章

  • Android TTS学习——用五种外语说出“我爱你”(转)
    一. 简单介绍在上一篇里我们简单的介绍了Android里的TTS功能并实现了一个最简单的Demo例子--AndroidTTSDemoFirst,在这篇文章中我们将具体介绍用到的TTS API,并给上一个Demo增加语言选择功能,可以使用TTS引擎支持的 English、 French 、 German 、 Italian 和 Spanish 这 ......
  • Android TTS学习——保存对你的喜欢(转)
    一. 简单介绍在上一篇里我们介绍了TTS提供的接口 OnUtteranceCompletedListener 的使用,这个接口的作用是监听语音片段的朗读,并在语音片段朗读结束后调用其定义的回调函数,在回调函数里可以进行需要的操作。在这一篇里我们介绍一下TTS提供的另一个有用的功能,把合成的语音以音频文......
  • Android13冻结进程分析:如何提高设备性能和用户体验
    Android13冻结进程分析:如何提高设备性能和用户体验本文介绍了Android13中的冻结进程功能,它是一种重要的资源管理策略,可以提高系统性能和稳定性,同时最大限度地节省设备的资源和电池消耗。文章讨论了如何合理分配资源,包括CPU、内存等,以提高设备性能和用户体验。此外,文章还提到了......
  • Android平台GB28181设备接入端如何实现多视频通道接入?
    技术背景我们在设计Android平台GB28181设备接入模块的时候,有这样的场景诉求,一个设备可能需要多个通道,常见的场景,比如车载终端,一台设备,可能需要接入多个摄像头,那么这台车载终端设备可以作为主设备,然后,主设备下,配置多个通道,听起来是不是有点儿类似于DVR或NVR?技术实现这里,我们说下,我们......
  • AutoX——当Android中clickable属性显示为false,实际可点击的布局如何处理
    前言最近在写一个关于某音的脚本,包含刷视频/点赞/收藏/分享/评论等一些列功能,借助于AutoX来实现,虽然我老早就买了AutoJsPro但是最新版本阉割的有点厉害。。。内容思索很简单就是,找到布局后,获取坐标信息,使用click去触发;varbtn=className("android.widget.TextView").t......
  • Android build.gradle 基本规则
    Androidbuild.gradle基本规则一个完整示例://此乃本脚本执行所需依赖,以下分别对应maven库和插件buildscript{repositories{//从AndroidStudio3.0后新增了google()配置,可以引用google上的开源项目google()mavenCentral()//......
  • Android之Spinner用法,key/value模式
    参考:http://www.dedeyun.com/it/m/98498.htmlhttps://blog.csdn.net/myxiaoq/article/details/258696931.key、value类,需要重写toString()方法,返回text就是Spinner要显示的keypackagecom.jay.common;publicclassSpinnerData{privateStringvalue="";private......
  • Android开发 Jetpack compose LazyColumn 与 LazyRow、LazyVerticalGrid、LazyHorizon
    前言  此篇博客讲解LazyColumn与LazyRow、LazyVerticalGrid、LazyHorizontalGrid,在compose里LazyColumn与LazyRow与是用来延迟加载数据的,它对标原来xml里的ListView与RecyclerView。LazyColumn纵向列表效果图代码@ComposablefunAPage(){vallistData=remembe......
  • android 对话框AlertDialog。
    API:java.lang.Object ↳ android.app.AlertDialog.Builder使用AlertDialog.Builder创建对话框需要了解以下几个方法:setTitle:为对话框设置标题setIcon:为对话框设置图标setMessage:为对话框设置内容setView:给对话框设置自定义样式setItems:设置对话框要显示的一个list,一般用......
  • android 导出带数据库文件的APK
    http://www.ophonesdn.com/article/show/111技术文章基于OPhoneSDK1.5的英文电子词典的实现基于OPhoneSDK1.5的英文电子词典的实现OPhone平台开发,2009-12-0711:06:42标签:OPhoneSDK1.5英文词典英文词典是手机中经常使用的应用。因此,在本文将......