学习|Android使用TTS语音合成

学更好的别人,

做更好的自己。

——《微卡智享》

本文长度为1633,预计阅读5分钟


划重点

所谓活到老,学到老,本篇开始我写的Android代码尽量都转为Android指定的官方语言Kotlin,一是技多不压身,二是Kotlin的语法与我接触的第一门开发语言Delphi有点像,学起来也不太难,所以直接在代码中开始使用才能掌握的更快。

Android本地TTS语音合成

前两天做WinForm项目中,有客户需求是加入语音提示,同事的努力下也是花了两天时间给更新上线了,由于我做的Android端用的手持PDA较多,在使用过程中如果有语音提示,会让用户使用起来更方便些,于是这篇就主要研究下Android端的TTS语音合成。

实现效果

TextToSpeech介绍使用

TextToSpeech

其实调用本地TTS语音识别非常的简单,一共就那么几个方法,麻烦的是在初始的配置上,我们就先来说一下使用方法

主要用到的两个包

import android.speech.tts.TextToSpeech;

import android.speech.tts.TextToSpeech.OnInitListener;

其中OnInitListener是要必须实现的,如下

mSpeech = TextToSpeech(this, TextToSpeech.OnInitListener {
            if (it == TextToSpeech.SUCCESS) {
                val i = mSpeech.setLanguage(Locale.CHINESE)
                if (i == TextToSpeech.LANG_MISSING_DATA || i == TextToSpeech.LANG_NOT_SUPPORTED) {
                    mSpeech.setSpeechRate(1.0f)
                    tvshow.text = "设置中文语音失败"
                } else {
                    tvshow.text = "初始化成功"
                }
            } else {
                tvshow.text = "初始化失败"
            }
        })

通过上面的代码我们先初始化了TTS的引擎,我们再列几个常用的函数就可以直接使用了


TextToSpeech常用方法
方法参数说明
setPitchfloat pitch设置音调,值越大声音越尖(女生),值越小则变成男声,1.0是常规
setSpeechRatefloat speechrate
设定语速 ,默认1.0正常语速
setLanguageLocale loc设置播放的语言
speakString text,int queueMode,HashMap<String,String> param
朗读,第一个参数就是朗读的文本,第二个参数是朗读方式,分为覆盖和追加等,第三个我们默认NULL即可
stop

关闭,不管是否在朗读都打断
shutdown

关闭,释放资源


代码演示

微卡智享

我们新建了一个TTSDemo的项目,先看一下布局文件

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/tvshow"
        android:text="Hello World!" />

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/edttext"
        android:hint="请输入语音合成的文字" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/btn1"
        android:text="TTS语音合成" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/btn2"
        android:text="TTS语音设置" />

</LinearLayout>

Mainactivity.kt

package dem.vac.ttsdemo

import android.Manifest
import android.Manifest.permission.WRITE_EXTERNAL_STORAGE
import android.content.Intent
import android.content.pm.PackageManager
import android.os.Bundle
import android.speech.tts.TextToSpeech
import android.widget.Button
import android.widget.EditText
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.ActivityCompat
import java.util.*

class MainActivity : AppCompatActivity() {

    lateinit var tvshow: TextView
    lateinit var edtinput: EditText
    lateinit var btn1: Button
    lateinit var btn2: Button
    lateinit var mSpeech: TextToSpeech

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        tvshow = findViewById(R.id.tvshow)

        //初始化TTS
        mSpeech = TextToSpeech(this, TextToSpeech.OnInitListener {
            if (it == TextToSpeech.SUCCESS) {
                val i = mSpeech.setLanguage(Locale.CHINESE)
                if (i == TextToSpeech.LANG_MISSING_DATA || i == TextToSpeech.LANG_NOT_SUPPORTED) {
                    mSpeech.setSpeechRate(1.0f)
                    tvshow.text = "设置中文语音失败"
                } else {
                    tvshow.text = "初始化成功"
                }
            } else {
                tvshow.text = "初始化失败"
            }
        })

        edtinput = findViewById(R.id.edttext)

        //朗读
        btn1 = findViewById(R.id.btn1)
        btn1.setOnClickListener { view ->
            var str: String = edtinput.text.toString();
            if (str != "") {
                mSpeech.speak(str, TextToSpeech.QUEUE_ADD, null)
            }
        }

        //设置
        btn2 = findViewById(R.id.btn2)
        btn2.setOnClickListener { view ->
            var intent = Intent("com.android.settings.TTS_SETTINGS")
            startActivity(intent)
        }
    }


}

通过上面的代码,我们就可以实现TTS的朗读了,我的是Android 4.1的虚拟机,默认的本地TTS是PICO的,里面没有中文,无法进行中文的朗读,如下图

如果想要实现中文的朗读,我们就需要下载一个讯飞的语音合成离线包,安装后设置这个TTS后即可实现,我这网盘有个APK的下载地址

链接:https://pan.baidu.com/s/110AG3JyxipTKrIfDkcppaA

提取码:bflk

点击安装后,我们重新打开TTS设置就会出现,选择用讯飞语音合成

里面就会有中文的语音了

这一章主要讲了TTS的简单使用,产品在用户体验上要不断的打磨,像刚才我们安装讯飞语音,下一章我们就来看看怎么样检测如果没安装讯飞语音自动下载提示安装的方法。

扫描二维码

获取更多精彩

微卡智享

「 往期文章 」

实战|Android文字滚动自定义动画

学习|Android属性动画TypeEvaluator和Interpolator使用

学习|Android属性动画的组合动画之二--AnimatorSet

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Vaccae

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值