前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >学习|Android使用TTS语音合成

学习|Android使用TTS语音合成

作者头像
Vaccae
发布2019-12-11 15:20:27
4.1K0
发布2019-12-11 15:20:27
举报
文章被收录于专栏:微卡智享

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-12-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 微卡智享 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
语音合成
语音合成(Text To Speech,TTS)满足将文本转化成拟人化语音的需求,打通人机交互闭环。提供多场景、多语言的音色选择,支持 SSML 标记语言,支持自定义音量、语速等参数,让发音更专业、更符合场景需求。语音合成广泛适用于智能客服、有声阅读、新闻播报、人机交互等业务场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档