✍️作者简介:小北编程(专注于HarmonyOS、Android、Java、Web、TCP/IP等技术方向)
🐳博客主页: 开源中国、稀土掘金、51cto博客、博客园、知乎、简书、慕课网、CSDN
🔔如果文章对您有一定的帮助请👉关注✨、点赞👍、收藏📂、评论💬。
🔥如需转载请参考【转载须知】
在现代移动应用程序开发中,语音合成技术(TTS)扮演着越来越重要的角色。Android 平台提供了丰富的 TTS API,使开发者能够轻松地将文本转换为自然流畅的语音。本文将介绍 Android TTS 技术的基本概念、使用方法以及一些最佳实践。
什么是 Android TTS?
Android TTS 是指 Android 文本到语音(Text-to-Speech)技术,它允许开发者通过编程方式将文本转换为语音。这项技术对于构建无障碍应用、语音助手、语音导航以及其他语音交互应用至关重要。
使用 Android TTS API
Android TTS API 提供了一套丰富的方法和回调,用于控制语音合成的各个方面。以下是一个简单的示例,演示了如何在 Android 应用中使用 TTS API:
Android TTS(Text-to-Speech)提供了一系列方法,用于控制文本到语音的转换过程。以下是 Android TTS 中常用的方法:
TextToSpeech(Context context, TextToSpeech.OnInitListener listener):构造方法,用于初始化 TTS 引擎。
setLanguage(Locale loc):设置 TTS 引擎的语言。
speak(String text, int queueMode, HashMap<String, String> params):将指定的文本转换为语音并播放。
stop():停止当前的语音合成。
shutdown():释放 TTS 引擎的资源。
setPitch(float pitch):设置语音的音调。
setSpeechRate(float speechRate):设置语音的语速。
isSpeaking():检查当前是否正在进行语音合成。
这些方法可以让开发者控制 TTS 引擎的各个方面,包括语言设置、文本合成、语音参数调整等。通过合理使用这些方法,开发者可以实现自定义的语音合成功能,满足不同应用场景的需求。
如果我们要使用首先,请确保你的应用程序有适当的权限。在 AndroidManifest.xml 文件中添加以下权限:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
最简单的实例:
TextToSpeech tts = new TextToSpeech(context, new TextToSpeech.OnInitListener() {
@Override
public void onInit(int status) {
if (status == TextToSpeech.SUCCESS) {
tts.setLanguage(Locale.US);
tts.speak("Hello, welcome to the TTS demo.", TextToSpeech.QUEUE_FLUSH, null, null);
} else {
Log.e("TTS", "Initialization failed");
}
}
});
// 在 Activity 销毁时释放 TTS 资源
@Override
protected void onDestroy() {
if (tts != null) {
tts.stop();
tts.shutdown();
}
super.onDestroy();
}
下面是自己封装的工具类想用的可以直接使用
/**
* Copyright (C) 2023-2024 Author
*
* TTS语音播报工具类
*
* @author xiaolu
* @date 2023/11/10
* @version 1.0.0
*/
public class TTSUtil {
private TextToSpeech textToSpeech;
private Context context;
private boolean initialized = false;
private float defaultSpeechRate = 1.0f; // 默认语速
private float defaultPitch = 1.0f; // 默认音调
private Locale defaultLocale = Locale.CHINESE; // 默认语言
private String utteranceId = "utteranceId"; // 唯一标识符
public interface TTSListener {
void onInitSuccess();
void onInitFailure();
void onSpeechStart();
void onSpeechDone();
void onSpeechError(String errorMessage);
}
public TTSUtil(Context context, final TTSListener listener) {
this.context = context;
textToSpeech = new TextToSpeech(context, new TextToSpeech.OnInitListener() {
@Override
public void onInit(int status) {
if (status == TextToSpeech.SUCCESS) {
initialized = true;
if (listener != null) {
listener.onInitSuccess();
}
} else {
if (listener != null) {
listener.onInitFailure();
}
}
}
});
}
// 设置默认语速
public void setDefaultSpeechRate(float speechRate) {
defaultSpeechRate = speechRate;
}
// 设置默认音调
public void setDefaultPitch(float pitch) {
defaultPitch = pitch;
}
// 设置默认语言
public void setDefaultLocale(Locale locale) {
defaultLocale = locale;
}
// 文本转语音
public void speak(String text) {
speak(text, utteranceId);
}
public void speak(String text, String utteranceId) {
speak(text, utteranceId, defaultLocale, defaultSpeechRate, defaultPitch);
}
public void speak(String text, String utteranceId, Locale locale, float speechRate, float pitch) {
if (initialized) {
textToSpeech.setLanguage(locale);
textToSpeech.setSpeechRate(speechRate);
textToSpeech.setPitch(pitch);
HashMap<String, String> params = new HashMap<>();
params.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, utteranceId);
textToSpeech.speak(text, TextToSpeech.QUEUE_FLUSH, params);
textToSpeech.setOnUtteranceProgressListener(new UtteranceProgressListener() {
@Override
public void onStart(String utteranceId) {
Logger.d("TTS TTSUtil onStart: " + utteranceId);
}
@Override
public void onDone(String utteranceId) {
Logger.d("TTS TTSUtil onDone: " + utteranceId);
}
@Override
public void onError(String utteranceId) {
Logger.d("TTS TTSUtil onError: " + utteranceId);
}
});
}
}
// 释放资源
public void release() {
if (textToSpeech != null) {
textToSpeech.stop();
textToSpeech.shutdown();
}
}
}
布局:
<?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"
tools:ignore="MissingDefaultResource,Orientation">
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="20dp"
android:textSize="20dp"
android:text="无论面对多大的挑战,你都有足够的力量去克服。每一步的努力,都是通向成功的道路上的一部分。不要忘记,你的梦想和目标值得追求,而你所做的每一个努力都是迈向成功的关键一步。坚持、努力、相信自己,你一定能够创造出美好的明天。你是独一无二的,你的能力是无限的。相信自己,你可以超越自己的期望,创造出令人惊叹的成就。在每一个困难面前,都蕴藏着机会和成长。保持积极的态度,勇往直前,你将发现自己能够达到意想不到的高度。愿你在人生的旅途中,勇敢前行,敢于梦想,勇于追求,你的未来会因此变得更加辉煌。"/>
<Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="30dp"
android:layout_marginRight="30dp"
android:text="点击测试TTS语音"/>
</LinearLayout>
实例:
private TTSUtil ttsUtil;
// 创建TTSUtil实例并传入Context和TTSListener
ttsUtil = new TTSUtil(this, new TTSUtil.TTSListener() {
@Override
public void onInitSuccess() {
// TTS引擎初始化成功
// 这里可以进行语音合成操作
String text = "初始化语音成功";
ttsUtil.speak(text);
Logger.e("TTS TTSUtil onInitSuccess 初始化语音成功");
}
@Override
public void onInitFailure() {
Logger.e("TTS TTSUtil onInitFailure TTS引擎初始化失败");
}
@Override
public void onSpeechStart() {
Logger.e("TTS TTSUtil onSpeechStart 语音合成开始");
}
@Override
public void onSpeechDone() {
Logger.e("TTS TTSUtil onSpeechDone 语音合成完成");
}
@Override
public void onSpeechError(String errorMessage) {
Logger.e("TTS TTSUtil onSpeechError 语音合成出错 " + errorMessage);
}
});
binding.button.setOnClickListener(v -> {
ttsUtil.speak(binding.textView.getText().toString().trim());
});
Android TTS 技术为开发者提供了强大的工具,用于构建各种语音交互应用。通过合理地使用 TTS API,并遵循最佳实践,开发者可以为用户提供更加智能、便捷的应用体验。随着 TTS 技术的不断发展,相信在未来,它将在更多领域展现出其强大的潜力。
TextToSpeech手机兼容性问题
系统自带TextToSpeech API使用很方便,但是有些不支持中文引擎的手机就很头疼,而且市面上哪些手机支持哪些手机不支持我们没有底,所以线上跑了一波以后拿到了目前市面手机TextToSpeech中文引擎的支持情况。收集了694款手机,有90款不支持的手机。具体型号如下:
+--------------------------------------+
| Xiaomi MI+9+Transparent+Edition |
| Xiaomi MI+8 |
| OnePlus GM1900 |
| OnePlus GM1910 |
| Redmi M2006C3LC |
| OnePlus IN2020 |
| meizu 16T |
| Xiaomi MI+MAX+3 |
| OnePlus ONEPLUS+A6010 |
| OnePlus ONEPLUS+A5010 |
| meizu meizu+17 |
| Redmi Redmi+K30 |
| OnePlus KB2000 |
| OnePlus HD1900 |
| OnePlus ONEPLUS+A6000 |
| meizu 16s |
| Xiaomi M2102K1C |
| Xiaomi M2002J9E |
| Redmi M2007J17C |
| OnePlus IN2010 |
| meizu meizu+17+Pro |
| nubia NX659J |
| meizu 16s+Pro |
| meizu meizu+16Xs |
| Xiaomi Mi+10 |
| Lenovo Lenovo+L78051 |
| meizu MEIZU+18 |
| OnePlus HD1910 |
| Hisense HLTE226T |
| xiaomi Redmi+Note+8 |
| Redmi Redmi+K30i+5G |
| Redmi M2007J3SC |
| Redmi M2004J19C |
| Redmi Redmi+Note+8+Pro |
| Redmi M2104K10AC |
| xiaomi Redmi+Note+7 |
| Redmi M2003J15SC |
| Xiaomi MIX+2S |
| Redmi Redmi+K30+Pro |
| nubia NX627J |
| Xiaomi MI+CC9+Pro |
| Redmi Redmi+K30+5G |
| meizu MEIZU+18+Pro |
| Xiaomi MI+9 |
| Xiaomi M2102K1AC |
| Xiaomi MI+8+UD |
| blackshark AWM-A0 |
| Xiaomi M2011K2C |
| Xiaomi MI+8+Lite |
| Sony XQ-AT72 |
| Xiaomi Mi+10+Pro |
| Xiaomi M2102J2SC |
| OnePlus ONEPLUS+A5000 |
| Xiaomi M2101K9C |
| Redmi M2103K19C |
| xiaomi Redmi+Note+7+Pro |
| nubia NX616J |
| Redmi M2012K10C |
| Xiaomi MIX+3 |
| Redmi M2004J7AC |
| Xiaomi MI+CC9+Pro+Premium+Edition |
| nubia NX619J |
| Xiaomi M2007J1SC |
| koobee X60+Pro |
| Xiaomi Redmi+K20+Pro |
| SMARTISAN DT1901A |
| Redmi M2004J7BC |
| asus ASUS_I001DA |
| HONOR HLK-AL00a |
| Redmi M2006J10C |
| Redmi M2012K11AC |
| blackshark SHARK+PRS-A0 |
| HONOR BKL-AL20 |
| SMARTISAN DT1902A |
| ZTE ZTE+A2322 |
| Redmi M2007J22C |
| blackshark SKW-A0 |
| Nokia Nokia+X7 |
| Redmi M2012K11C |
| HUAWEI MAR-AL00 |
| Redmi Redmi+K30+Pro+Zoom+Edition |
| nubia NX669J |
| Meizu 16+X |
| Xiaomi Redmi+K20+Pro+Premium+Edition |
| asus ASUS_I005DA |
| blackshark SHARK+KLE-A0 |
| Xiaomi MI+6 |
| motorola XT2125-4 |
| GIONEE 20190619G |
| HUAWEI ART-AL00m |
+--------------------------------------+
因为大部分手机使用了手机系统TTS服务,对于少量不支持的手机我们可以通过走云端TTS合成,因为已经在我们的成本访问。也可以牺牲包体积和音质,通过拼接合成的方式在不支持的手机上提供TTS服务。
有些支持比较好的,如华为,可以在设置中选择发音音色。在系统设置---辅助功能---无障碍---文本转语音路径下可以选择引擎,调节语速音调:
无论是哪个阶段,坚持努力都是成功的关键。不要停下脚步,继续前行,即使前路崎岖,也请保持乐观和勇气。相信自己的能力,你所追求的目标定会在不久的将来实现。加油!
本文使用 文章同步助手 同步