最近因为一些特殊需求,公司希望使用离线TTS,不花钱的中文离线TTS,最好音色还要多一点,语速,语调都要可控;总之一句话,以不花钱的代价达到最好的效果。其实现在很多的开发者平台也都提供一两种音色的离线TTS开发SDK,比如科大,云知声等等,我之前也做过一个百度在线ASR与云知声离线TTS结合实现的一个复读机的小Demo,有兴趣的朋友可以点击看一下
配合最近我上传的github项目以及本篇(本篇github地址)的介绍,就可以实现TTS播报,暂停以及恢复等功能
因为了解过Android有原生的TTS功能,于是就简单使用了一下,Google的产品不支持中文也很容易理解,毕竟市场都不给别人,而且中文的处理相较于英文等处理起来也比较麻烦,所以,原生的TTS是不支持中文的。但是里面是有预留的常量中文普通话,台湾话等,但是是设置不了的。所以在具体使用的时候需要借助中文TTS引擎的帮助,所以就需要安装其他的软件或者服务,网上推荐比较多的是科大讯飞+这个APK,里面可以设置发音人,语速,语调等。我简单看了一下,里面支持五种普通话音色;但是我们从科大官网上看上面只提供两种离线的音色语音;所以使用这个APK可以丰富一下你的离线TTS音色;从另一个方面来说,不知道有没有考虑过,如果我们能找到一个开源框架可以实现加载这些离线语音包,然后想办法获取到这些离线语音包,那么我们就可以多使用其另外的三种离线语音包。但是这样的开源框架估计不好找。其他还有度秘语音引擎,google的文字转语音引擎;可以点击下载,感谢这位博主。说的好像有点多了,下面进入正题;今天主要介绍一下Android原生的TTS接口的基本使用。
1,主要使用步骤
(1)新建一个类(内部类也是可以的),实现OnInitListener接口,重写onInit()方法,通常是判断TTS引擎初始化的状态
private class TTSListener implements OnInitListener {
@Override
public void onInit(int status) {
// TODO Auto-generated method stub
if (status == TextToSpeech.SUCCESS) {
// int supported = mSpeech.setLanguage(Locale.US);
// if ((supported != TextToSpeech.LANG_AVAILABLE) && (supported != TextToSpeech.LANG_COUNTRY_AVAILABLE)) {
// Toast.makeText(MainActivity.this, "不支持当前语言!", Toast.LENGTH_SHORT).show();
// Log.i(TAG, "onInit: 支持当前选择语言");
// }else{
//
// }
Log.i(TAG, "onInit: TTS引擎初始化成功");
}
else{
Log.i(TAG, "onInit: TTS引擎初始化失败");
}
}
}
(2)获取TTS引擎
mSpeech = new TextToSpeech(MainActivity.this, new TTSListener());
(3)在使用的时候,如果有需要可以调整TTS引擎参数,包括上面说的语速,语调,语言等等(当然,当前不支持中文,使用的话,先下载上面提到的服务或者应用并安装,然后在“设置”--》“语音与输入”--》“文本转语音输出”--》选择你安装中文TTS就可以了)
mSpeech.setLanguage(SharedData.languageList.get(choosedLanguage));
mSpeech.setSpeechRate(SharedData.voice_speed);
mSpeech.setPitch(SharedData.voice_pitch);
2,示例代码:
示例代码很简单,我简单加了一点东西,也很好理解。
MainActivity.java代码:
package com.hfut.operationandroidtts;
import android.app.AlertDialog;
import android.speech.tts.TextToSpeech;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.speech.tts.TextToSpeech;
import android.speech.tts.TextToSpeech.OnInitListener;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.Toast;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Locale;
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";