学习|Android使用TTS语音合成

2019-12-11 15:20:27 浏览数 (1)

本文长度为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是要必须实现的,如下

代码语言:javascript复制
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的引擎,我们再列几个常用的函数就可以直接使用了

方法

参数

说明

setPitch

float pitch

设置音调,值越大声音越尖(女生),值越小则变成男声,1.0是常规

setSpeechRate

float speechrate

设定语速 ,默认1.0正常语速

setLanguage

Locale loc

设置播放的语言

speak

String text,int queueMode,HashMap<String,String> param

朗读,第一个参数就是朗读的文本,第二个参数是朗读方式,分为覆盖和追加等,第三个我们默认NULL即可

stop

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

shutdown

关闭,释放资源

代码演示

微卡智享

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

activity_main.xml

代码语言:javascript复制
<?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

代码语言:javascript复制
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的简单使用,产品在用户体验上要不断的打磨,像刚才我们安装讯飞语音,下一章我们就来看看怎么样检测如果没安装讯飞语音自动下载提示安装的方法。

0 人点赞