Android TTS文本转语音TextToSpeech

Android 提供了 TextToSpeech(TTS)API,允许开发者将文本转换为语音。以下是对 Android TTS 文本转语音功能的详细介绍,包括基本用法、配置、事件处理和一些高级功能。

基本用法

  1. 添加权限: 在 AndroidManifest.xml 文件中添加网络权限(如果需要在线合成服务):

    <uses-permission android:name="android.permission.INTERNET"/>
  2. 初始化 TextToSpeech: 创建一个 TextToSpeech 对象并在 OnInitListener 中处理初始化结果。

    import android.content.Context;
    import android.os.Bundle;
    import android.speech.tts.TextToSpeech;
    import android.util.Log;
    
    public class TtsUtil implements TextToSpeech.OnInitListener {
        private static final String TAG = "TtsUtil";
        private TextToSpeech tts;
        private boolean initialized = false;
    
        public void init(Context context) {
            tts = new TextToSpeech(context, this);
        }
    
        @Override
        public void onInit(int status) {
            if (status == TextToSpeech.SUCCESS) {
                int result = tts.setLanguage(Locale.US);
                if (result == TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED) {
                    Log.e(TAG, "This Language is not supported");
                } else {
                    initialized = true;
                    Log.i(TAG, "Initialization successful");
                }
            } else {
                Log.e(TAG, "Initialization Failed!");
            }
        }
    
        public void shutdown() {
            if (tts != null) {
                tts.stop();
                tts.shutdown();
                tts = null;
                initialized = false;
                Log.i(TAG, "TTS shut down successfully");
            }
        }
    
        public void speak(String text) {
            if (initialized && tts != null) {
                tts.speak(text, TextToSpeech.QUEUE_FLUSH, null, null);
            } else {
                Log.w(TAG, "TTS is not initialized yet.");
            }
        }
    }
  3. 使用 TtsUtil 类: 在 Activity 中使用 TtsUtil 类进行文本转语音。

    package com.hellom.trp;
    
    import androidx.appcompat.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import com.hellom.trp.utils.TtsUtil;
    
    public class MainActivity extends AppCompatActivity {
        private TtsUtil ttsUtil;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            ttsUtil = new TtsUtil();
            ttsUtil.init(this);
    
            Button playButton = findViewById(R.id.playButton);
            playButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    ttsUtil.speak("Hello, World!");
                }
            });
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            ttsUtil.shutdown();
        }
    }

配置

  1. 设置语言:

    int result = tts.setLanguage(Locale.US);
    if (result == TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED) {
        Log.e(TAG, "This Language is not supported");
    } else {
        initialized = true;
        Log.i(TAG, "Initialization successful");
    }
  2. 设置音调和速度:

    tts.setPitch(1.0f); // Default pitch is 1.0
    tts.setSpeechRate(1.0f); // Default speech rate is 1.0

事件处理

  1. 播放完成回调: 实现 OnUtteranceCompletedListener 接口来处理播放完成事件。

注意:

初始化失败-1

权限问题

在Android 11中,TTS功能需要使用ACCESSIBILITY_SERVICE权限。这是因为TTS可以读取屏幕上的文本,因此需要确保它不会滥用用户数据。如果没有这个权限,TTS的初始化过程可能会失败。为了解决这个问题,可以在AndroidManifest.xml文件中添加以下代码:

<uses-permission android:name="android.permission.ACCESSIBILITY_SERVICE"/>

软件包可见性问题

在Android 11中,由于软件包可见性限制,可能会导致TTS初始化失败。解决这个问题的方法是在AndroidManifest.xml文件中增加<queries>标签,指定TTS服务的action:

<queries>
    <intent>
        <action android:name="android.intent.action.TTS_SERVICE"/>
    </intent>
</queries>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值