Anddroid 文本合成语音TTS实现

一、近期有个人脸识别的项目中识别成功以后要有语音播报,但是三方提供的Demo中并没有此功能,于是了解TTS语音合成技术可以实现,要提前安装一个TTS引擎然后调用原生TTS,下面附上源码以及引擎apk,

AndroidManifest.xml 权限

    <!--往sdcard中写入数据的权限 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <!--往sdcard中读取数据的权限 -->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />



二、上面是这边封装的一个工具类,使用很简单直接调用即可,这边测试正常语速可能会有点快,可以根据情况定义

package com.baidu.idl.main.facesdk.utils;

import android.annotation.SuppressLint;
import android.content.Context;
import android.speech.tts.TextToSpeech;
import android.speech.tts.UtteranceProgressListener;

public class TTSUtils {
    private static final TTSUtils INSTANCE = new TTSUtils();
    private TextToSpeech textToSpeak;
    private boolean isSpeaking;

    private TTS() {
    }

    /**
     * 播报
     *
     * @param context
     * @param text    文本内容
     */
    public static void speak(Context context, String text) {
        speak(context, text, 1.0f, 1.0f, false);
    }

    /**
     * 播报
     *
     * @param context
     * @param text             文本内容
     * @param ignoreIfSpeaking 如果在播报就忽略
     */
    public static void speak(Context context, String text, boolean ignoreIfSpeaking) {
        speak(context, text, 1.0f, 1.0f, ignoreIfSpeaking);
    }

    /**
     * 播报
     *
     * @param context
     * @param text             文本内容
     * @param rate             语速 1.0为正常
     * @param pitch            语调 1.0为正常
     * @param ignoreIfSpeaking 如果在播报就忽略
     */
    public static void speak(Context context, String text, float rate, float pitch, boolean ignoreIfSpeaking) {
        if (ignoreIfSpeaking && INSTANCE.isSpeaking) return;
        INSTANCE.speakNow(context, text, rate, pitch);
    }

    @SuppressLint("NewApi")
    private void speakNow(final Context context, final String text, final float rate, final float pitch) {
        if (textToSpeak == null) {
            textToSpeak = new TextToSpeech(context.getApplicationContext(), new TextToSpeech.OnInitListener() {
                @Override
                public void onInit(int status) {
                    if (status == 0) {
                        speakNow(context.getApplicationContext(), text, rate, pitch);
                    } else {
                        textToSpeak = null;
                    }
                }
            });
            textToSpeak.setOnUtteranceProgressListener(new UtteranceProgressListener() {
                @Override
                public void onStart(String utteranceId) {
                    isSpeaking = true;
                }

                @Override
                public void onDone(String utteranceId) {
                    isSpeaking = false;
                }

                @Override
                public void onError(String utteranceId) {
                    isSpeaking = false;
                }
            });
        } else {
            textToSpeak.setSpeechRate(rate);
            textToSpeak.setPitch(pitch);
            textToSpeak.speak(text, TextToSpeech.QUEUE_FLUSH, null, "tts");
        }
    }
}



三、MainActivity 使用步骤

package com.litrabbit.ttsyuyin;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.widget.TextView;

import com.litrabbit.ttsyuyin.utils.TTSUtils;

public class MainActivity extends AppCompatActivity {

    /**
     * 记得要先安装TTS  apk引擎  不然无效 项目目录下面 kdxf_tts_3.0.apk 为引擎apk
     * @param savedInstanceState
     */

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        /**
         * TextView 文本
         */
        TextView textView = findViewById(R.id.text_view);
        /**
        * 播报
        *
        * @param context
        * @param text             文本内容
        * @param rate             语速 1.0为正常
        * @param pitch            语调 1.0为正常
        * @param ignoreIfSpeaking 如果在播报就忽略
        */
        TTSUtils.speak(MainActivity.this,textView.getText().toString(),0.5f,0.5f,true);
    }
}



TTS引擎apk连接 提取码:1234

源码地址
————————————————

原文链接:https://blog.csdn.net/weixin_42996187/article/details/125368225

猜你喜欢

转载自blog.csdn.net/weixin_42602900/article/details/127298428