简单​到​不可想象:

文字转化为语音Android中TextToSpeech类的简单使用

学习使用,请勿传播

写在前面:

TTS是Text To Speech的缩写,即“从文本到语音”,是人机对话的一部分,让机器能够说话。

它是同时运用语言学和心理学的杰出之作,在内置芯片的支持之下,通过神经网络的设计,把文字智能地转化为自然语音流。TTS技术对文本文件进行实时转换,转换时间之短可以秒计算。在其特有智能语音控制器作用下,文本输出的语音音律流畅,使得听者在听取信息时感觉自然,毫无机器语音输出的冷漠与生涩感。TTS语音合成技术 即将覆盖国标一、二级汉字,具有英文接口,自动识别中、英文,支持中英文混读。所有声音采用真人普通话为标准发音,实现了120-150个汉字/分钟的快速语音合成,朗读速度达3-4个汉字/秒,使用户可以听到清晰悦耳的音质和连贯流畅的语调。现在有少部分MP3随身听具有了TTS功能。

TTS是语音合成应用的一种,它将储存于电脑中的文件,如帮助文件或者网页,转换成自然语音输出。TTS不仅能帮助有视觉障碍的人阅读计算机上的信息,更能增加文本文档的可读性。现在的TTS应用包括语音驱动的邮件以及声音敏感系统,并常与声音识别程序一起使用。

1、必须知道的部分

  1. TextToSpeech的功能:将文字快速转化为语音进行播放或者保存为音频文件
  2. android也可以实现把输入的文字朗读出来,使用到的是TextToSpeech,将一段文字转换为成语音,可根据需要合成出不同音色、语速和语调的声音,让机器像人一样开口说话。
  3. 目前只支持5种语言:English、 French 、 German 、 Italian 和 Spanish。
  4. TextToSpeech必须被实例化之后才能使用.实现TextToSpeech.OnInitListener方法来获取实例化结果的监听。当你已经使用完TextToSpeech实例之后, 应该调用shutdown()方法来释放TextToSpeech所使用的本地资源。
  5. 使用前需先安装第三方插件,例如本次使用了

                `2019竞赛资料\任务2\18_讯飞中文语音工具\讯飞中文引擎支持.apk`
    
  6. 构造方法

    • //使用默认的引擎
      TextToSpeech(Context context, TextToSpeech.OnInitListener listener)
    • //使用指定的引擎
      TextToSpeech(Context context, TextToSpeech.OnInitListener listener, String engine)

2、TTS初始化常用方法

  • setLanguage设置语言,帮助文档里面写了有22种
  • TextToSpeech.LANG_MISSING_DATA:表示语言的数据丢失。
  • TextToSpeech.LANG_NOT_SUPPORTED:不支持
         // 参数Context,TextToSpeech.OnInitListener
        mTextToSpeech = new TextToSpeech(this, this);
        // 设置音调,值越大声音越尖(女生),值越小则变成男声,1.0是常规
        mTextToSpeech.setPitch(1.0f);
        // 设置语速
        mTextToSpeech.setSpeechRate(0.5f);
         // setLanguage设置语言
        int result = mTextToSpeech.setLanguage(Locale.CHINA);
        // 常用初始化方法
         if (result == TextToSpeech.LANG_MISSING_DATA
                            || result == TextToSpeech.LANG_NOT_SUPPORTED) {
                        Toast.makeText(this, "数据丢失或不支持", 
                                       Toast.LENGTH_SHORT).show();
                    }

3、初步实例

  1. 初始化(init)

    private void Speak() {
        mTextToSpeech=new TextToSpeech(this, new TextToSpeech.OnInitListener() {
    
            @Override
            public void onInit(int status) {
                if (status==TextToSpeech.SUCCESS) {
                    //设置朗读语言
                    int supported=mTextToSpeech.setLanguage(Locale.CHINA);
                    if ((supported!=TextToSpeech.LANG_AVAILABLE)&&(supported!=TextToSpeech.LANG_COUNTRY_AVAILABLE)) {
                        Toast.makeText(RFID_Reader.this, "不支持当前语言!", Toast.LENGTH_SHORT).show();
                    }
                }
    
            }
        });
    }
  2. 朗读

    mTextToSpeech.speak("本次消费"+tmp+"元", TextToSpeech.QUEUE_FLUSH, null);

写在中间​:

做题时需配合Handler来进行逐步朗读,自己设定相关算法进行不重复朗读。

4、经研究发现

​ 经研究发现,根本不用这么麻烦,本次用两行代码搞定

// 初始化
TextToSpeech speak = new TextToSpeech(this,null);
// 使用
speak.speak("欢迎光临",TextToSpeech.QUEUE_FLUSH,null);

5、敷衍了事

​ 这是一行废话。。

6、简单案例分享

activity_main.xml

<?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">

    <TextView
        android:id="@+id/test"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!\nThis is Suk!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

MainActivity.java

package com.example.a4_4_voicedemo;

import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.speech.tts.TextToSpeech;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
    private TextToSpeech textToSpeech;
    private TextToSpeech speak;
    private TextView txt;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        speak = new TextToSpeech(this,null);
        txt = findViewById(R.id.test);
        txt.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                speak.speak(txt.getText().toString()+",这里是TTS输出!",TextToSpeech.QUEUE_FLUSH,null);
            }
        });
    }
}

写在最后:

这是一行凑字数的废话!引用请注明出处!