开发环境
- 目标设备:Android 13无自带tts引擎
- 开发环境:JDK1.8、Gradle7.5、Android Studio 2024.3.1
- TTS引擎:Sherpa Onnx(下载地址:https://k2-fsa.github.io/sherpa/onnx/tts/apk-engine-cn.html)
经过我摸索,下载sherpa-onnx-{version}-{arch}-zh-tts-engine
开头的就是中文的tts引擎,后面的就是模型,大家按需下载就好了。
先贴代码
这个代码网上一大堆,我就直接贴过来了,主要就是MainActivity
引入TTS监听,然后在OnCreate
中初始化就好了。
public class MainActivity extends AppCompatActivity implements TextToSpeech.OnInitListener {
private TextToSpeech mTextToSpeech;
private static final String LOG_TAG = MainActivity.class.getSimpleName();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 初始化TextToSpeech引擎
mTextToSpeech = new TextToSpeech(this, this);
}
@Override
public void onInit(int status) {
if (status == TextToSpeech.SUCCESS) {
// 设置语言为中文
int result = mTextToSpeech.setLanguage(Locale.CHINA);
if (result == TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED) {
Toast.makeText(this, "不支持中文", Toast.LENGTH_SHORT).show();
} else {
// 引擎初始化成功
Toast.makeText(this, "TTS引擎初始化成功", Toast.LENGTH_SHORT).show();
}
} else {
Toast.makeText(this, "TTS引擎初始化失败", Toast.LENGTH_SHORT).show();
}
}
}
问题出现
但是呢,运行的时候,直接就提示“TTS引擎初始化失败”,我首先考虑的是不是没有tts引擎的问题,于是便找了一个开源免费的TTS引擎,地址我贴在上面了,下载安装好,在设置里面设置一下默认引擎就行了,但是还是初始化失败。
但是TextToSpeech
类只有SUCCESS
和ERROR
的属性,也不会报错看到具体的原因,这就很难受了。只能上网上去找解决方案了,看到一个方案是因为Android 11
需要额外的权限,然后他贴了一个代码,需要增加一个权限,之后在申请。但是试了没用…代码我贴在下面了,你们可以也试试。
<!-- 亲测权限报警告,提示没有这个权限,改成BIND_ACCESSIBILITY_SERVICE也不行 -->
<uses-permission android:name="android.permission.ACCESSIBILITY_SERVICE" />
// 检查是否有这个权限
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
if (!isAccessibilityServiceEnabled(context)) {
Intent intent = new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS);
startActivity(intent);
}
}
private TextToSpeech tts;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 初始化TTS
tts = new TextToSpeech(this, new TextToSpeech.OnInitListener() {
@Override
public void onInit(int status) {
if (status == TextToSpeech.SUCCESS) {
tts.setLanguage(Locale.US);
} else {
Toast.makeText(MainActivity.this, "TTS初始化失败", Toast.LENGTH_SHORT).show();
}
}
});
}
解决方案
上文提到已经确定是缺少权限的原因,只要顺着这个思路,肯定就是没问题的,于是我又找到了一个可以解决这个问题的办法。
<queries>
<intent>
<action android:name="android.intent.action.TTS_SERVICE" />
</intent>
</queries>
亲测加上这个就能用了,虽然抽象,但是也没什么大问题。