Android TTS说中文

昨天在家看一本有关物联网开发的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
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值