TextToSpeech类学习和简单封装

news2024/11/16 18:04:45

TextToSpeech类简单学习封装

  • 前言
  • 一、TTS是什么?
  • 二、TextToSpeech简单使用
    • 1.官方介绍
    • 2.简单使用
  • 三、TextToSpeech简单封装
  • 总结


在这里插入图片描述

前言

业务涉及到对接TTS相关,所以简单学习下如何使用。


一、TTS是什么?

TextToSpeech简称为TTS,即从文本转语音,是人机对话的一部分,让机器能够说话。在内置芯片的支持之下,通过神经网络的设计,把文字智能地转化为自然语音流。TTS技术对文本文件进行实时转换,转换时间之短可以秒计算。在其特有智能语音控制器作用下,文本输出的语音音律流畅,使得听者在听取信息时感觉自然,毫无机器语音输出的冷漠与生涩感。
安卓的TextToSpeech是Android平台上一个重要的系统功能,它能够将文本转换成可听的语音,为用户提供更加方便的交互体验。同时,作为开发者,我们也可以基于TextToSpeech实现一些有趣的应用程序。比如市面上一些小说的听书功能,就是基于TTS播报开发的。

二、TextToSpeech简单使用

1.官方介绍

在这里插入图片描述
我们翻译一下:
从文本中合成语音,以便立即播放或创建声音文件。

TextToSpeech 实例只能在完成初始化后用于合成文本。实现 TextToSpeech.OnInitListener 以通知初始化完成。
当您使用完TextToSpeech实例时,请调用shutdown()方法以释放TextToSpeech引擎使用的本机资源。使用文本到语音的应用程序的目标Android 11应声明TextToSpeech。然后要在清单文件做以下申明。

 <queries>
   ...
  <intent>
      <action android:name="android.intent.action.TTS_SERVICE" />
  </intent>
 </queries>

什么意思呢,就是使用之前要用queries标签在清单文件中声明TTS_SERVICE这个action,告诉你的app你要对tts进行通信,不要拦截你的tts引擎与你的app进行通信,我自己试的时候没有申请这个action也能访问,但是为了保险咱们还是加上哈。

2.简单使用

上面官方把使用方法都告诉我们了,我们来简单试一试。
清单文件是这个样子的:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <application
        android:allowBackup="true"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="@xml/backup_rules"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.TEST"
        tools:targetApi="31">
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

    <queries>
        <intent>
            <action android:name="android.intent.action.TTS_SERVICE" />
        </intent>
    </queries>

</manifest>

布局文件是这个样子的:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    <EditText
        android:id="@+id/edit"
        android:text="我是要转为语音的文字"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"/>

    <Button
        android:id="@+id/test"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="将上面的文字转为语音"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/edit"/>



</androidx.constraintlayout.widget.ConstraintLayout>

布局预览就是这样的:
在这里插入图片描述
activity代码是这样的:

package com.example.test

import android.annotation.SuppressLint
import android.os.Bundle
import android.speech.tts.TextToSpeech
import android.util.Log
import android.widget.Button
import android.widget.EditText
import androidx.appcompat.app.AppCompatActivity
import java.util.Locale


class MainActivity : AppCompatActivity() {
    private  val TAG = "MainActivity"
    var button :Button ? = null
    var editText :EditText?=null
    private lateinit var tts :TextToSpeech


    @SuppressLint("MissingInflatedId")
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        button = findViewById(R.id.test)
        editText = findViewById(R.id.edit)
        tts = TextToSpeech(this@MainActivity
        ) { status ->
            if (status == TextToSpeech.SUCCESS) {
                Log.d(TAG, "onInit: ")
            }
        }
        tts.language = Locale.CHINA
        button?.setOnClickListener {
            tts.speak(editText?.text.toString(), TextToSpeech.QUEUE_ADD, null, "custom_pronunciation")
        }


    }



    override fun onDestroy() {
        super.onDestroy()
        tts.shutdown()

    }


}

这段代码是一个简单的Android应用程序,其主要功能是将用户在EditText中输入的文本转化为语音。以下是这段代码的详细解释:

首先,我们定义了一个名为 MainActivity 的类,它继承自 AppCompatActivity。在Android开发中,AppCompatActivity 是一个为兼容不同版本Android API设计的Activity类。

MainActivity 类中,我们定义了一些变量:

  • buttoneditText 是这个应用中的两个UI组件,分别是一个按钮和一个文本输入框。
  • tts 是一个 TextToSpeech 对象,它的作用是将文本转化为语音。

onCreate 方法中,首先调用了 super.onCreate(savedInstanceState) 来初始化Activity。然后,通过 findViewById 方法找到了 buttoneditText 这两个UI组件。之后,我们实例化了 tts,并在其初始化完成后(onInit)打印了一条日志。然后设置了 tts 的语言为中文。最后,设置了 button 的点击监听器,当用户点击按钮时,会将 editText 中的文本转化为语音。

onDestroy 方法中,我们调用了 tts.shutdown() 来释放 tts 对象占用的资源。这是很重要的,因为在Android中,如果一个Activity不再需要时(例如,当用户按下返回键,或者Activity已经完成了它的任务),系统会销毁这个Activity。在销毁Activity之前,我们需要手动关闭一些可能正在运行的后台任务,以释放资源并避免内存泄漏。

此外,代码中使用了 @SuppressLint("MissingInflatedId") 注解来抑制一些可能会在真实应用中出现的警告或错误。例如,可能出现的 “MissingInflatedId” 错误是因为在代码中直接使用视图ID,而在实际的XML布局文件中并没有定义这个ID。这个注解告诉Android编译器忽略这个错误或警告。

我是用的荣耀50进行调试,我在

设置 − > 辅助功能 − > 无障碍 − > 文本转语音 设置->辅助功能->无障碍->文本转语音 设置>辅助功能>无障碍>文本转语音

找到了tts相关设置,将其设置为了荣耀语音引擎
在这里插入图片描述

然后运行程序,成功播报!

三、TextToSpeech简单封装

虽然成功进行播报了,但是在实际使用的时候我们肯定不能就把代码直接贴进去,我们简单封装一下,新建一个TextToSpeechUntil的object

package com.example.test

import android.content.Context
import android.speech.tts.TextToSpeech
import android.speech.tts.UtteranceProgressListener
import android.util.Log
import java.util.Locale

object TextToSpeechUntil  {
    private const val TAG = "TextToSpeechUntil"
    private lateinit var tts : TextToSpeech
    private var utteranceId = System.currentTimeMillis()

    fun init(context: Context){
        tts = TextToSpeech(context
        ) { status ->
            if (status == TextToSpeech.SUCCESS) {
                Log.d(TAG, "onInit: ")
            }
        }
        tts.language = Locale.CHINA
        Log.d(TAG, "init: defaultEngine ${tts.defaultEngine}")
        tts.setOnUtteranceProgressListener(object : UtteranceProgressListener() {
            override fun onStart(utteranceId: String?) {
                Log.d(TAG, "onStart: $utteranceId")
            }

            override fun onDone(utteranceId: String?) {
                Log.d(TAG, "onDone: $utteranceId")
            }

            override fun onError(utteranceId: String?) {
                Log.d(TAG, "onError: $utteranceId")
            }

        })


    }

    fun speak(string: String){
        utteranceId = System.currentTimeMillis()
        tts.speak(string, TextToSpeech.QUEUE_ADD, null, utteranceId.toString())
    }

    fun destroy(){
        tts.shutdown()
    }
}

这个代码是一个简单的TextToSpeech模块,可以将输入的字符串转化为语音并播放出来。同时,它还监听了语音合成器的状态,可以在日志中看到每一次语音合成的信息,该模块可以将文本转化为语音。现在我来为你简单解释下这个代码:

代码导入了几个Android的类,包括Context(用于获取应用程序环境的类)、TextToSpeech(用于将文本转化为语音的类)、UtteranceProgressListener(用于监听语音合成器状态的类)和Log(用于记录日志的类)。

之后,代码定义了一个名为TextToSpeechUntil的Object,这个Object包含了一些变量和方法。

其中,tts是一个TextToSpeech对象,用于将文本转化为语音。utteranceId是一个变量,用于唯一标识每一次的语音合成。

init方法中,我们首先初始化了一个TextToSpeech对象,并设置其语言为中文。然后设置了一个UtteranceProgressListener,它可以监听语音合成器的状态。在开始、完成和出错时,都会打印相应的日志。

speak方法中,我们调用TextToSpeech对象的speak方法,将传入的字符串转化为语音。同时,我们设置了utteranceId,这样我们可以在日志中清楚地知道每一次语音合成的情况。

最后,在destroy方法中,我们调用TextToSpeech对象的shutdown方法,关闭TextToSpeech引擎并释放资源。

然后我们将activity的代码更改如下:

package com.example.test

import android.annotation.SuppressLint
import android.os.Bundle
import android.speech.tts.TextToSpeech
import android.util.Log
import android.widget.Button
import android.widget.EditText
import androidx.appcompat.app.AppCompatActivity
import java.util.Locale


class MainActivity : AppCompatActivity() {
    private  val TAG = "MainActivity"
    var button :Button ? = null
    var editText :EditText?=null
    private lateinit var tts :TextToSpeech


    @SuppressLint("MissingInflatedId")
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        button = findViewById(R.id.test)
        editText = findViewById(R.id.edit)
        testTextToSpeechUntil()
    }



    override fun onDestroy() {
        super.onDestroy()
        TextToSpeechUntil.destroy()
    }

    private fun testTextToSpeechUntil(){
    	//这里偷懒没将初始化放到applicaiton中
        TextToSpeechUntil.init(this)
        button?.setOnClickListener {
            TextToSpeechUntil.speak(editText?.text.toString())
        }
    }
}

然后再次运行,播报成功,并且defaultEngine 打印出包名为荣耀语音引擎,如果你需要使用其他引擎可以自行下载然后通过代码设置。
在这里插入图片描述


总结

本文主要介绍了Android平台上的文本转语音功能TextToSpeech的使用方法和简单封装。首先介绍了TTS的作用和官方介绍,然后通过一个简单的示例程序演示了如何使用TextToSpeech进行文本转语音。最后,针对实际应用场景,对TextToSpeech进行了简单封装,方便开发者调用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1276944.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在 SQL Server 中备份和恢复数据库的最佳方法

在SQL Server中&#xff0c;创建备份和执行还原操作对于确保数据完整性、灾难恢复和数据库维护至关重要。以下是备份和恢复过程的概述&#xff1a; 方法 1. 使用 SQL Server Management Studio (SSMS) 备份和还原数据库 按照 SSMS 步骤备份 SQL 数据库 打开 SSMS 并连接到您…

【数据结构和算法】找出叠涂元素

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、题目描述 二、题解 三、代码 四、复杂度分析 前言 这是力扣的2661题&#xff0c;难度为中等&#xff0c;解题方案有很多种&…

LeNet对MNIST 数据集中的图像进行分类--keras实现

我们将训练一个卷积神经网络来对 MNIST 数据库中的图像进行分类&#xff0c;可以与前面所提到的CNN实现对比CNN对 MNIST 数据库中的图像进行分类-CSDN博客 加载 MNIST 数据库 MNIST 是机器学习领域最著名的数据集之一。 它有 70,000 张手写数字图像 - 下载非常简单 - 图像尺…

规则引擎专题---2、开源规则引擎对比

开源规则引擎 开源的规则引擎整体分为下面几类&#xff1a; 通过界面配置的成熟规则引擎&#xff0c;这种规则引擎相对来说就比较重&#xff0c;但功能全&#xff0c;比较出名的有:drools, urule。 基于jvm脚本语言&#xff0c;互联网公司会觉得drools太重了&#xff0c;然后…

用100ask 6ull配合 飞凌 elf1的教程进行学习的记录

启动方式 百问网 elf1: 固件 emmc-otg 串口 网络 改eth0, 网线接在右边的网口eth2上

spring boot mybatis TypeHandler 看源码如何初始化及调用

目录 概述使用TypeHandler使用方式在 select | update | insert 中加入 配置文件中指定 源码分析配置文件指定Mapper 执行query如何转换 结束 概述 阅读此文 可以达到 spring boot mybatis TypeHandler 源码如何初始化及如何调用的。 spring boot 版本为 2.7.17&#xff0c;my…

触控板绘画工具Inklet mac功能介绍

Inklet mac是一款触控板绘画工具&#xff0c;把你的触控板变成画画的板子&#xff0c;意思是&#xff0c;你点在触控板的哪里&#xff0c;鼠标就会出现载相应的地方。例如&#xff0c;但你把手指移动到触控盘左下角&#xff0c;那么鼠标也会出现在左下角&#xff0c;对于用户而…

【已解决】Cannot find project Scala library 2.11.8 for module XXX

问题描述 在 flink 示例程序调试过程中&#xff0c;reload project 报错 Cannot find project Scala library 2.11.8 for module HbasePrint 报错如下图所示&#xff1a; 问题解决 经过搜索&#xff0c;初步判定是 pom 文件中 Scala 版本配置和项目中实际使用的版本不一致导…

11.29 知识回顾(视图层、模板层)

一、视图层 1.1 响应对象 响应---》本质都是 HttpResponse -HttpResponse---》字符串 -render----》放个模板---》模板渲染是在后端完成 -js代码是在客户端浏览器里执行的 -模板语法是在后端执行的 -redirect----》重定向 -字符串参数不是…

RabbitMq整合Springboot超全实战案例+图文演示+源码自取

目录 介绍 简单整合 简单模式 定义 代码示例 work模式 定义 代码示例 pubsub模式 定义 代码示例 routing模式 定义 代码示例 top模式 定义 代码 下单付款加积分示例 介绍 代码 可靠性投递示例 介绍 代码 交换机投递确认回调 队列投递确认回调 ​延迟消…

前缀和 LeetCode1094 拼车

1094. 拼车 车上最初有 capacity 个空座位。车 只能 向一个方向行驶&#xff08;也就是说&#xff0c;不允许掉头或改变方向&#xff09; 给定整数 capacity 和一个数组 trips , trip[i] [numPassengersi, fromi, toi] 表示第 i 次旅行有 numPassengersi 乘客&#xff0c;接…

抖音怎么一次性隐藏全部视频

很多朋友不知道抖音怎么一次性隐藏全部视频&#xff0c;其实只需要在设置菜单中将账号设置为【私密账号】即可&#xff0c;在抖音中依次点击【设置】-【我】-【隐私设置】-【私密账号】&#xff0c;在弹出的窗口中将账号设为私密即可。也可以依次打开抖音作品&#xff0c;点击底…

golang Pool实战与底层实现

使用的go版本为 go1.21.2 首先我们写一个简单的Pool的使用代码 package mainimport "sync"var bytePool sync.Pool{New: func() interface{} {b : make([]byte, 1024)return &b}, }func main() {for j : 0; j < 10; j {obj : bytePool.Get().(*[]byte) // …

解决element ui tree组件不产生横向滚动条

结果是这样的 需要在tree的外层&#xff0c;包一个父组件 <div class"tree"><el-tree :data"treeData" show-checkbox default-expand-all></el-tree></div> 在css里面这样写,样式穿透按自己使用的css编译器以及框架要求就好 &l…

SQL Server 2016(创建数据库)

1、实验环境。 某公司有一台已经安装了SQL Server 2016的服务器&#xff0c;现在需要新建数据库。 2、需求描述。 创建一个名为"db_class"的数据库&#xff0c;数据文件和日志文件初始大小设置为10MB&#xff0c;启用自动增长&#xff0c;数据库文件存放路径为C:\db…

文献速递:人工智能在健康和医学中

人工智能在健康和医学中 01 文献速递介绍 这篇文章详细探讨了人工智能&#xff08;AI&#xff09;在医学领域的最新进展、挑战和未来发展的机遇。 1.医学AI算法的最新进展&#xff1a; **AI在医疗实践中的应用&#xff1a;**虽然AI系统在多项回顾性医学研究中表现出色&…

docker 搭建开发环境,解决deepin依赖问题

本机环境&#xff1a; deepin v23b2 删除docker旧包 sudo apt-get remove docker docker-engine docker.io containerd runc注意卸载docker旧包的时候Images, containers, volumes, 和networks 都保存在 /var/lib/docker 卸载的时候不会自动删除这块数据&#xff0c;如果你先…

Beautiful Soup4爬虫速成

做毕业论文需要收集数据集&#xff0c;我的数据集就是文本的格式&#xff0c;而且是静态页面的形式&#xff0c;所以只是一个简单的入门。动态页面的爬虫提取这些比较进阶的内容&#xff0c;我暂时没有这样的需求&#xff0c;所以有这类问题的朋友们请移步。 如果只是简单的静态…

目标检测——Faster R-CNN算法解读

论文&#xff1a;Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks 作者&#xff1a;Shaoqing Ren, Kaiming He, Ross Girshick, and Jian Sun 链接&#xff1a;https://arxiv.org/abs/1506.01497 代码&#xff1a;https://github.com/rbgirsh…

vue使用elementui的el-menu的折叠菜单collapse

由于我的是在el-menu所在组件外面的兄弟组件设置是否折叠的控制&#xff0c;我用事件总线bus进行是否折叠传递 参数说明类型可选值默认值collapse是否水平折叠收起菜单&#xff08;仅在 mode 为 vertical 时可用&#xff09;boolean—falsebackground-color菜单的背景色&#…