Android文字转语音播报


前言

Android文字转语音播报可以通过Android自带TTS和第三方语音框架实现。


一、实现方式

1.Android系统自带TTS

2.第三方语音框架:云知声离线语音(32位:armeabi-v7a)、…

二、Android系统自带TTS

1.集成工具类TextToSpeechUtils

代码如下(示例):

public class TextToSpeechUtils {
    private static TextToSpeechUtils textToSpeechUtils;
    private TextToSpeech mTextToSpeech;    // TTS对象

    public static TextToSpeechUtils getInstance() {
        if (textToSpeechUtils == null) {
            textToSpeechUtils = new TextToSpeechUtils();
        }
        return textToSpeechUtils;
    }

    private TextToSpeechUtils() {
    }

    public void initTextToSpeech(Context context) {
        mTextToSpeech = new TextToSpeech(context, new TextToSpeech.OnInitListener() {
            @Override
            public void onInit(int status) {
                if (status == TextToSpeech.SUCCESS) {
            /*
                使用的是小米手机进行测试,打开设置,在系统和设备列表项中找到更多设置,
            点击进入更多设置,在点击进入语言和输入法,见语言项列表,点击文字转语音(TTS)输出,
            首选引擎项有三项为Pico TTs,科大讯飞语音引擎3.0,度秘语音引擎3.0。其中Pico TTS不支持
            中文语言状态。其他两项支持中文。选择科大讯飞语音引擎3.0。进行测试。

                如果自己的测试机里面没有可以读取中文的引擎,
            那么不要紧,我在该Module包中放了一个科大讯飞语音引擎3.0.apk,将该引擎进行安装后,进入到
            系统设置中,找到文字转语音(TTS)输出,将引擎修改为科大讯飞语音引擎3.0即可。重新启动测试
            Demo即可体验到文字转中文语言。
             */
                    // setLanguage设置语言
                    int result = mTextToSpeech.setLanguage(Locale.CHINA);
                    // TextToSpeech.LANG_MISSING_DATA:表示语言的数据丢失
                    // TextToSpeech.LANG_NOT_SUPPORTED:不支持
                    if (result == TextToSpeech.LANG_MISSING_DATA
                            || result == TextToSpeech.LANG_NOT_SUPPORTED) {
                        Toast.makeText(context, "数据丢失或不支持", Toast.LENGTH_SHORT).show();
                    }
                }
            }
        });
        // 设置音调,值越大声音越尖(女生),值越小则变成男声,1.0是常规
        mTextToSpeech.setPitch(1.0f);
        // 设置语速
        mTextToSpeech.setSpeechRate(1.0f);
    }

    public void close(){
        if (mTextToSpeech != null) {
            mTextToSpeech.stop();        // 不管是否正在朗读TTS都被打断
            mTextToSpeech.shutdown();    // 关闭,释放资源
            mTextToSpeech = null;
        }
    }

    public void speak(String speakStr){
        if (mTextToSpeech != null && !mTextToSpeech.isSpeaking()) {
            mTextToSpeech.speak(speakStr, TextToSpeech.QUEUE_ADD, null);
        }
    }
}

2.初始化和调用

代码如下(示例):

//初始化
textToSpeechUtils = TextToSpeechUtils.getInstance();
textToSpeechUtils.initTextToSpeech(mContext);
//关闭
textToSpeechUtils.close();
//播放
textToSpeechUtils.speak("开始虹膜注册");

3.需要的支持中文语音引擎

1.包名、应用名:
com.svox.pico 系统自带不支持中文语音
com.baidu.duersdk.opensdk 度秘语音引擎3.0 不支持5.0以下系统,大小11.95M
com.google.android.tts 谷歌文字转语音引擎,不支持5.0以下系统,大小17.98M
com.iflytek.speechcloud 科大讯飞语音引擎3.0,支持4.0以上系统,大小27.27M,科大讯飞引擎3.0安装后的名字叫:语音设置
com.iflytek.tts 科大讯飞语音合成,较老,不支持7.0以上系统,大小9M

博客及下载地址:https://blog.csdn.net/yingchengyou/article/details/79591954

2.切换发音人
设置 —— 辅助功能 —— 无障碍 ——TTS文本转语音 —— 切换引擎(如果有多个引擎的话)
引擎右边设置可点击进入选择发音人(如果有的话)
科大讯飞语音引擎3.0支持多个人物的语音切换,可以自行下载这个引擎。

博客:https://blog.csdn.net/qq_35584878/article/details/100535133

3.Android11 初始化失败问题处理
博客:https://blog.csdn.net/Jason_996/article/details/121704510

三、第三方语音框架(云知声离线语音)

1.Dos窗口查看是Android主板支持SO库架构(64位、32位)

C:\Users\CWY>adb shell
rk3399_all:/ $ getprop 

2.集成使用

在这里插入图片描述

1.添加jar包:
api files('libs/usc.jar')  //语音

2.build文件defaultConfig下添加so文件:
        ndk {
            // 设置支持的SO库架构
            abiFilters 'armeabi-v7a'// 'arm64-v8a'//'armeabi'
        }
3.添加工具类SpeechUtilOffline4.初始化和调用:
初始化:
        speechUtilOffline = SpeechUtilOffline.getInstance();
        if(speechUtilOffline!=null){
            speechUtilOffline.init(MainActivity.this);
        }

关闭:
if (speechUtilOffline!=null){
            speechUtilOffline.release();
        }

播放:
speechUtilOffline.play("云知声离线语音");

四、注意点

1.喇叭问题

调试Android主板时喇叭确保装上、喇叭声音大小与其功率有关。(调试Android主板rk3399时遇到)


总结

Android系统内置了文字转语音功能,可以通过调用系统提供的API实现。具体步骤如下: 1. 在AndroidManifest.xml文件中添加以下权限: ``` <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_PHONE_STATE"/> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.RECORD_AUDIO"/> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/> <uses-permission android:name="android.permission.WRITE_SETTINGS"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> ``` 2. 在布局文件中添加一个TextView和一个Button: ``` <TextView android:id="@+id/tv_text" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Hello World!" /> <Button android:id="@+id/btn_speak" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Speak" /> ``` 3. 在Activity中实现以下代码: ``` private TextToSpeech mTTS; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mTTS = new TextToSpeech(this, new TextToSpeech.OnInitListener() { @Override public void onInit(int status) { if (status == TextToSpeech.SUCCESS) { int result = mTTS.setLanguage(Locale.US); if (result == TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED) { Log.e("TTS", "Language not supported"); } else { findViewById(R.id.btn_speak).setEnabled(true); } } else { Log.e("TTS", "Initialization failed"); } } }); findViewById(R.id.btn_speak).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String text = ((TextView) findViewById(R.id.tv_text)).getText().toString(); mTTS.speak(text, TextToSpeech.QUEUE_FLUSH, null); } }); } @Override protected void onDestroy() { if (mTTS != null) { mTTS.stop(); mTTS.shutdown(); } super.onDestroy(); } ``` 在初始化TextToSpeech对象时,需要传入一个OnInitListener对象,用于判断TextToSpeech是否初始化成功。如果初始化成功,则设置语言为英文,否则输出日志。在Button的点击事件中,获取TextView的内容并调用TextToSpeech的speak方法将文字转换为语音播放。 以上是简单的Android文字转语音实现方式,具体根据需求进行修改。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值