Android自带的TTS功能
在Android1.6之后添加了TextToSpeech,也叫TTS,把相应的文字转化成语音播报,增强了用户体验。可以根据语言播报
界面上的控件如下:
可以选择的语言
但有的语言不支持,比如中文就不支持
代码也比较简单,能简单介绍TTS的用法
MainActivity.java
package com.example.tts;
- import java.util.ArrayList;
- import java.util.List;
- import java.util.Locale;
- import android.app.Activity;
- import android.os.Bundle;
- import android.speech.tts.TextToSpeech;
- import android.speech.tts.TextToSpeech.OnInitListener;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.AdapterView;
- import android.widget.ArrayAdapter;
- import android.widget.Button;
- import android.widget.EditText;
- import android.widget.Spinner;
- import android.widget.Toast;
- /**
- * 根据选择的语言播报TTS
- *
- * @author Administrator
- *
- */
- public class MainActivity extends Activity {
- private TextToSpeech mSpeech = null;
- private Spinner langSpinner = null;
- private EditText edit = null;
- private Button btn = null;
- private String[] langs;
- private String curLang;
- private List<String> langList = new ArrayList<String>();
- private ArrayAdapter<String> langAdapter;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- langs = getResources().getStringArray(R.array.languages); // 得到语言数组
- langSpinner = (Spinner) findViewById(R.id.spinner);
- edit = (EditText) findViewById(R.id.edit);
- btn = (Button) findViewById(R.id.btn);
- btn.setOnClickListener(new BtnListener());
- for (int i = 0; i < langs.length; i++) {
- langList.add(langs[i]);
- }
- // 设置下拉框的适配器和样式
- langAdapter = new ArrayAdapter<String>(MainActivity.this,
- android.R.layout.simple_spinner_item, langList);
- langAdapter
- .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
- langSpinner.setAdapter(langAdapter);
- // 下拉框监听器
- langSpinner
- .setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
- @Override
- public void onItemSelected(AdapterView<?> adapter,
- View view, int position, long id) {
- // TODO Auto-generated method stub
- curLang = (String) langSpinner.getAdapter().getItem(
- (int) id);
- if(mSpeech != null)
- {
- mSpeech.stop();
- mSpeech.shutdown();
- mSpeech = null;
- }
- // 创建TTS对象
- mSpeech = new TextToSpeech(MainActivity.this, new TTSListener());
- Toast.makeText(MainActivity.this, "select = " + curLang, Toast.LENGTH_SHORT).show();
- }
- @Override
- public void onNothingSelected(AdapterView<?> arg0) {
- // TODO Auto-generated method stub
- }
- });
- }
- private int SetLanguage(String lang) {
- int result = 0;
- if (lang.equals("CANADA")) {
- result = mSpeech.setLanguage(Locale.CANADA);
- } else if (lang.equals("CANADA_FRENCH")) {
- result = mSpeech.setLanguage(Locale.CANADA_FRENCH);
- } else if (lang.equals("CHINA")) {
- result = mSpeech.setLanguage(Locale.CHINA);
- } else if (lang.equals("CHINESE")) {
- result = mSpeech.setLanguage(Locale.CHINESE);
- } else if (lang.equals("ENGLISH")) {
- result = mSpeech.setLanguage(Locale.ENGLISH);
- } else if (lang.equals("FRANCE")) {
- result = mSpeech.setLanguage(Locale.FRANCE);
- } else if (lang.equals("FRENCH")) {
- result = mSpeech.setLanguage(Locale.FRENCH);
- } else if (lang.equals("GERMAN")) {
- result = mSpeech.setLanguage(Locale.GERMAN);
- } else if (lang.equals("GERMANY")) {
- result = mSpeech.setLanguage(Locale.GERMANY);
- } else if (lang.equals("ITALIAN")) {
- result = mSpeech.setLanguage(Locale.ITALIAN);
- } else if (lang.equals("ITALY")) {
- result = mSpeech.setLanguage(Locale.ITALY);
- } else if (lang.equals("JAPAN")) {
- result = mSpeech.setLanguage(Locale.JAPAN);
- } else if (lang.equals("JAPANESE")) {
- result = mSpeech.setLanguage(Locale.JAPANESE);
- } else if (lang.equals("KOREA")) {
- result = mSpeech.setLanguage(Locale.KOREA);
- } else if (lang.equals("KOREAN")) {
- result = mSpeech.setLanguage(Locale.KOREAN);
- } else if (lang.equals("PRC")) {
- result = mSpeech.setLanguage(Locale.PRC);
- } else if (lang.equals("ROOT")) {
- result = mSpeech.setLanguage(Locale.ROOT);
- } else if (lang.equals("SIMPLIFIED_CHINESE")) {
- result = mSpeech.setLanguage(Locale.SIMPLIFIED_CHINESE);
- } else if (lang.equals("TAIWAN")) {
- result = mSpeech.setLanguage(Locale.TAIWAN);
- } else if (lang.equals("TRADITIONAL_CHINESE")) {
- result = mSpeech.setLanguage(Locale.TRADITIONAL_CHINESE);
- } else if (lang.equals("UK")) {
- result = mSpeech.setLanguage(Locale.UK);
- } else if (lang.equals("US")) {
- result = mSpeech.setLanguage(Locale.US);
- }
- return result;
- }
- private class TTSListener implements OnInitListener {
- @Override
- public void onInit(int status) {
- // TODO Auto-generated method stub
- if (status == TextToSpeech.SUCCESS) {
- //int result = mSpeech.setLanguage(Locale.ENGLISH);
- int result = SetLanguage(curLang);
- //如果打印为-2,说明不支持这种语言
- Toast.makeText(MainActivity.this, "-------------result = " + result, Toast.LENGTH_LONG).show();
- if (result == TextToSpeech.LANG_MISSING_DATA
- || result == TextToSpeech.LANG_NOT_SUPPORTED) {
- System.out.println("-------------not use");
- } else {
- mSpeech.speak("i love you", TextToSpeech.QUEUE_FLUSH, null);
- }
- }
- }
- }
- private class BtnListener implements OnClickListener {
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- mSpeech.speak(edit.getText().toString(), TextToSpeech.QUEUE_FLUSH,
- null);
- }
- }
- @Override
- protected void onDestroy() {
- // TODO Auto-generated method stub
- if (mSpeech != null) {
- mSpeech.stop();
- mSpeech.shutdown();
- mSpeech = null;
- }
- super.onDestroy();
- }
- }
布局文件
- <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- tools:context=".MainActivity" >
- <TextView
- android:id="@+id/text"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="@string/hello_world" />
- <TextView
- android:id="@+id/label"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_below="@id/text"
- android:text="@string/select_language" />
- <Spinner
- android:id="@+id/spinner"
- android:layout_width="150dip"
- android:layout_height="wrap_content"
- android:layout_below="@id/label"
- android:drawSelectorOnTop="false" />
- <TextView
- android:id="@+id/label2"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_below="@id/spinner"
- android:text="@string/text" />
- <EditText
- android:id="@+id/edit"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_below="@id/label2"
- android:text="@string/example"
- android:inputType="text"
- />
- <Button
- android:id="@+id/btn"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_below="@id/edit"
- android:text="@string/btn"
- />
- </RelativeLayout>
代码下载:http://files.cnblogs.com/android100/TTS.zip
Android自带的TTS功能的更多相关文章
- Android自带的分享功能案例
MainActivity的代码 package com.hpsvse.weiboshare; import java.io.File; import android.net.Uri; import a ...
- 调用Android自带日历功能(日历列表单、添加一个日历事件)
调用Android自带日历功能 觉得这篇文章不错,转载过来. 转载:http://blog.csdn.net/djy1992/article/details/9948393 Android手机配备有 ...
- 调用Android自带日历功能
Android手机配备有一个内置的日历应用程序.第三方应用程序可以利用日历内容提供商接口读取用户的日历信息和安排在日历新的事件.这个日历可以直接同步用户的谷歌日历. 不幸的是,没有文档和Android ...
- 记一次使用 android 自带 WebView 做富文本编辑器之API、机型的兼容及各种奇葩bug的解决
转载请声明出处(http://www.cnblogs.com/linguanh/) 目录 1,测试设备介绍 2,开源项目richeditor及CrossWalk的选择 3,遇到的bug及其解决方法 4 ...
- 采用busybox 代替android 自带的shell
折腾了几天,被Android那点儿少得可怜的shell命令折磨的死去活来,终于下定了革命的决心.看一下怎么把渺小的toolbox替换成伟大的busybox吧.先大致描述一下Android系统中的she ...
- Android自带语音播报+讯飞语音播报封装(直接用)
一.Android自带的语音播报 1.查看是否支持中文,在测试的设备中打开‘设置’ -->找到 '语言和输入法'-->查看语音选项,是否支持中文,默认仅支持英文. 使用如下: public ...
- Android自己定义截屏功能,相似QQ截屏
由于公司业务需求 须要对一个屏幕进行截屏.但自带的截屏功能是远远不够项目的功能需求 ,我们是做一个画板软件 .须要的像QQ那样截屏之后 ,能够看到我们自己定义的工具.有画笔,button等等 .and ...
- 【Android】13.1 用Android自带的API访问SQLite数据库
分类:C#.Android.VS2015: 创建日期:2016-02-26 一.简介 这一节我们先来看看如何直接用Android自带的API创建和访问SQLite数据库. 1.创建SQLite数据库 ...
- 假设做一个精美的Login界面(攻克了一EditText自带clear的功能,相似iphone的UITextField)
先上图: XML为: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" ...
随机推荐
- C#中将DLL文件打包到EXE文件
1:在工程目录增加dll目录,然后将dll文件复制到此目录,例如: 2:增加引用,定位到工程的dll目录,选中要增加的dll文件 3:修改dll文件夹下面的dll文件属性 选中嵌入式资源,不复制. 4 ...
- webbrowser载入地图网页出现脚本错误解决
对于这个问题.我整整花了一上午的时间来解决,网上关于此问题的解决差点儿找不到,于是我就尽能够能的从网上相关问题的答案中获取些灵感.功夫不负有心人.最终通过这些灵感的积累我最终攻克了此问题. 首先让我们 ...
- VB 中 copymemory的有关问题
dim a() as long dim b() as bytecopymemory b(0),byval "1234",4 copymemory byval varptr(a(0) ...
- java中经常使用的快捷键
Eclipse(MyEclipse) 经常使用快捷键Eclipse 的编辑功能很强大.掌握了 Eclipse 快捷键功能,能够大大提高开发效率. Eclipse中有例如以下一些和编辑相关的快捷键.1. ...
- .NET 工具生成引擎概述
Mark Michaelis 微软中国MSDN 过去几年大家一直都在使用 .NET Core(有这么久吗?)并且都知道“生成系统”经历了重大改变,不论是终止对 Gulp 的内置支持,还是放弃 Proj ...
- 饭后来份TempData,瞅瞅有啥料
原本打算写一篇关于.NET下的分布式缓存的随笔,但是为了举一个实际的运用,就想把控制器(是ASP.NET MVC的)中的Session替换成使用分布式缓存来实现.如果你的网站最后是需要负载均衡的话,这 ...
- PHP视频学习一 mysql
设置mysql.exe文件目录到环境变量Path中去,可能在cmd下面使用mysql,wind7试了一下好像要重启以后才生效 什么是数据库 数据库就是存储数据的地方,是保存在计算机(硬盘/内存)中的数 ...
- Java Web自定义MVC框架详解 (转)
转自:http://blog.csdn.net/jackfrued/article/details/42774459 最近给学生讲Java Web,希望他们能够在学完这部分内容后自己实现一个MVC框架 ...
- 使用MSTSC远程登录时提示证书无效的解决方法
On your local machine Open Windows command prompt type: gpedit.msc -> Press Enter -> a new win ...
- RHEL7 光盘修复
光盘修复#rm -rf /boot/*#dd if=/dev/zero of=/dev/sda bs=446 count=1#systemctl rebootTroubleshooting(排错模式) ...