简述Android语音播报TTS

✍️作者简介:沫小北/码农小北(专注于Android、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:

scss 复制代码
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 文件中添加以下权限:

ini 复制代码
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

最简单的实例:

java 复制代码
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();
}

下面是自己封装的工具类想用的可以直接使用

typescript 复制代码
/**
 * 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();
        }
    }
}

布局:

ini 复制代码
<?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>

实例:

typescript 复制代码
	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 技术的不断发展,相信在未来,它将在更多领域展现出其强大的潜力。

无论是哪个阶段,坚持努力都是成功的关键。不要停下脚步,继续前行,即使前路崎岖,也请保持乐观和勇气。相信自己的能力,你所追求的目标定会在不久的将来实现。加油!

本文使用 文章同步助手 同步

相关推荐
腾讯TNTWeb前端团队4 小时前
helux v5 发布了,像pinia一样优雅地管理你的react状态吧
前端·javascript·react.js
mghio6 小时前
Dubbo 中的集群容错
java·微服务·dubbo
范文杰8 小时前
AI 时代如何更高效开发前端组件?21st.dev 给了一种答案
前端·ai编程
拉不动的猪8 小时前
刷刷题50(常见的js数据通信与渲染问题)
前端·javascript·面试
拉不动的猪8 小时前
JS多线程Webworks中的几种实战场景演示
前端·javascript·面试
FreeCultureBoy9 小时前
macOS 命令行 原生挂载 webdav 方法
前端
uhakadotcom9 小时前
Astro 框架:快速构建内容驱动型网站的利器
前端·javascript·面试
uhakadotcom9 小时前
了解Nest.js和Next.js:如何选择合适的框架
前端·javascript·面试
uhakadotcom9 小时前
React与Next.js:基础知识及应用场景
前端·面试·github