Android实现TTS文字转语音功能

2,514 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

大家好,我是小黑,一个还没秃头的程序员~~~

这次给大家介绍一个Android自带的功能——TTS文字转语音,即将输入的文字以音频的形式朗读或存储成为文件。使用的是Android自带的TextToSpeech类,话不多说,正文开始 (一)初始化 TextToSpeech有两个主要的构造函数

  • TextToSpeech(Context context, OnInitListener listener)
  • TextToSpeech(Context context, OnInitListener listener, String engine)
TextToSpeech mTextToSpeech;
mTextToSpeech = new TextToSpeech(this, this, "com.iflytek.speechcloud")

参数说明
context上下文
listener初始化监听
context引擎的包名

上面的引擎中,如科大讯飞引擎的包名为com.iflytek.speechcloud,用于手机默认引擎非科大讯飞引擎时手动设置,但前提是手机已安装科大讯飞文字转语音引擎,否则无法设置

初始化的结果由TextToSpeech.OnInitListener返回,具体代码如下:

 @Override
    public void onInit(int status) {
        //设置朗读的语言是中文
        int language = mTextToSpeech.setLanguage(Locale.CHINA);
        if (language == TextToSpeech.LANG_MISSING_DATA || language == TextToSpeech.LANG_NOT_SUPPORTED) {
            Toast.makeText(this, "不支持中文或语言数据丢失", Toast.LENGTH_SHORT).show();
        }
    }

(二)添加朗读配置

朗读状态监听由UtteranceProgressListener返回,具体代码如下:

        mTextToSpeech.setOnUtteranceProgressListener(new UtteranceProgressListener() {
            @Override
            public void onStart(String utteranceId) {
               //朗读中
            }

            @Override
            public void onDone(String utteranceId) {
               //朗读结束
            }

            @Override
            public void onError(String utteranceId) {
               //朗读失败
            }
        });


设置其他配置

   // 设置音调,可模拟男女声
        mTextToSpeech.setPitch(1.0f);
        // 设置语速
        mTextToSpeech.setSpeechRate(1f);

(三)朗读或者保存为文件

朗读:

speak(final CharSequence text,
                     final int queueMode,
                     final Bundle params,
                     final String utteranceId)

参数说明
text要朗读的文本串。 长度不超过4000
queueMode使用的队列策略,QUEUE_ADD或QUEUE_FLUSH。
params请求的参数。 可以为空,可是携带如引擎包名、音量等参数
utteranceId此请求的唯一标识符

其他的函数

  • isSpeaking 是否在朗读
  • stop 中断当前的话语(无论是播放还是呈现到文件中),并丢弃队列中的其他话语。
  • shutdown 释放资源,可在onDestroy中进行

具体代码如下:

mTextToSpeech.speak(content, TextToSpeech.QUEUE_FLUSH, null, getClass().getName());

保存为文件:

synthesizeToFile(final CharSequence text, final Bundle params,
            final File file, final String utteranceId) 

参数说明
text要合成的文本串。 长度不超过4000
file生成的音频数据写入的文件
params请求的参数。 可以为空
utteranceId此请求的唯一标识符

具体代码如下:

int result = mTextToSpeech.synthesizeToFile(content, null, mMp3Path, this.getClass().getName());
                            if (result >= 0) {
                               //执行了合成逻辑,但此时不一定生成了文件
                            } else {
                               //该文本无法转成音频
                            }

注:朗读和合成文件都属于异步操作,调用API时就会返回结果,合成不一定完成甚至还未开始,所以要合理利用上面设置的状态监听进行后续操作

今天的介绍就到此为止,内容并没有什么难度,只是分享一个有趣的知识,后面还有学习到有趣的工具或者功能,我都会陆续和大家分享,谢谢大家的阅读!