Android TTS说中文

来源:互联网 发布:兰州拉面 知乎 编辑:程序博客网 时间:2024/06/04 01:24
昨天在家看一本有关物联网开发的Android书籍时,看到了用TTS说中文的小例子,觉得蛮好的,就写篇学习记录吧!Android虽然很早版本就开始支持TTS(Text To Speech) ,English 、 French 、 German 、 Italian 和 Spanish 五大语言,居然没有几千年历史的汉语。好在开源框架http://code.google.com/p/eyes-free/提供了中文TTS功能,所以我们用它来实现中文朗读。
//http://code.google.com/p/eyes-free///开始之前记录在项目中添加相关jar包:TTS_library_stub_3.0_market.jar,我也是在网上下载的。public class MainActivity extends Activity implements OnInitListener {    private EditText edt;    private Button speak;    private TextToSpeechBeta mTts;    private static final int CODE = 100;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        checkTTS();        initViewsAndEvents();    }    /**     * 初始化控件及监听事件     */    private void initViewsAndEvents() {        edt = (EditText) findViewById(R.id.edt);        speak = (Button) findViewById(R.id.speak);        speak.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                String edtStr = edt.getText().toString().trim();                if (!TextUtils.isEmpty(edtStr)) {                    // 朗读我们输入的文字                    mTts.speak(edtStr, TextToSpeechBeta.QUEUE_ADD, null);                }            }        });    }    /**     * 检查TTS是否可以使用     */    private void checkTTS() {        Intent in = new Intent();        in.setAction(TextToSpeechBeta.Engine.ACTION_CHECK_TTS_DATA);        startActivityForResult(in, CODE);    }    @Override    protected void onActivityResult(int requestCode, int resultCode, Intent data) {        super.onActivityResult(requestCode, resultCode, data);        if (requestCode == CODE) {            switch (resultCode) {            case TextToSpeechBeta.Engine.CHECK_VOICE_DATA_PASS:                Toast.makeText(this, "恭喜您,TTS可用", Toast.LENGTH_SHORT).show();                mTts = new TextToSpeechBeta(this, this);                break;            case TextToSpeechBeta.Engine.CHECK_VOICE_DATA_BAD_DATA:// 发音数据已经损坏            case TextToSpeechBeta.Engine.CHECK_VOICE_DATA_MISSING_DATA: // 需要的语音数据已丢失            case TextToSpeechBeta.Engine.CHECK_VOICE_DATA_MISSING_VOLUME: // 发音数据丢失                // 下载TTS对应的资源                Intent dataIntent = new Intent(                        TextToSpeechBeta.Engine.ACTION_INSTALL_TTS_DATA);                startActivity(dataIntent);                break;            case TextToSpeechBeta.Engine.CHECK_VOICE_DATA_FAIL:                // 发音失败                break;            }        }    }    @Override    public void onInit(int arg0, int arg1) {        if (arg1 == -1) {            // 提示安装所需要的数据            installTTS();        } else {            // 完成TTS的初始化            if (arg0 == TextToSpeechBeta.SUCCESS) {                // 设置TTS引擎,com.google.tts即eSpeak支持的语言包含中文                mTts.setEngineByPackageNameExtended("com.google.tts");                // 设置发音语言Locale.CHINA                int result = mTts.setLanguage(Locale.CHINA);                // 检查语言是否可用                if (result == TextToSpeechBeta.LANG_MISSING_DATA                        || result == TextToSpeechBeta.LANG_NOT_SUPPORTED) {                    speak.setEnabled(false);                    Toast.makeText(this, "语言功能不可用", Toast.LENGTH_SHORT).show();                } else {                    speak.setEnabled(true);                }            } else {                Toast.makeText(this, "TTS初始化失败", Toast.LENGTH_SHORT).show();            }        }    }    /**     * 安装语音相关资源包     */    private void installTTS() {        Builder alertInstall = new AlertDialog.Builder(this)                .setTitle("缺少语音包")                .setMessage("下载语音包")                .setPositiveButton("去下载",                        new DialogInterface.OnClickListener() {                            @Override                            public void onClick(DialogInterface dialog,                                    int which) {                                // 下载eyes-free的语音数据包                                String ttsDataUrl = "http://eyes-free.googlecode.com/files/tts_3.1_market.apk";                                Uri ttsDataUri = Uri.parse(ttsDataUrl);                                Intent ttsIntent = new Intent(                                        Intent.ACTION_VIEW, ttsDataUri);                                startActivity(ttsIntent);                            }                        })                .setNegativeButton("取消", new DialogInterface.OnClickListener() {                    @Override                    public void onClick(DialogInterface dialog, int which) {                        finish();                    }                });        alertInstall.create().show();    }}
//布局文件很简单<?xml version="1.0" encoding="utf-8"?><LinearLayout 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"    android:orientation="vertical" >    <EditText        android:id="@+id/edt"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:layout_margin="10dp"        android:gravity="left|center"        android:hint="请输入您想说的话!"        android:textSize="15sp" />    <Button        android:id="@+id/speak"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:layout_margin="10dp"        android:hint="开始讲话"        android:textSize="16sp" /></LinearLayout>
1 0