文本到语音应用程序无法在 Android Studio 的模拟器中运行,但可以在 Android 设备中运行

Far*_*n M 3 android text-to-speech android-emulator android-studio

我需要在 Android 模拟器中更改一些设置吗?该应用程序在 Android 设备中运行,但不在模拟器中运行。当我按下转换按钮时,它根本不输出任何语音。我什至检查其他应用程序是否通过扬声器提供输出。是的,youtube 运行得很好。

package com.example.labpgm7;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.speech.tts.TextToSpeech;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import java.util.Locale;

public class MainActivity extends AppCompatActivity {
    EditText texttospeak;
    Button speak;
    TextToSpeech t;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        texttospeak=findViewById(R.id.texttospeech);
        t=new TextToSpeech(this, new TextToSpeech.OnInitListener() {
            @Override
            public void onInit(int status)
            {

            }
        });
    }

    public void speak(View v)
    {
        String text=texttospeak.getText().toString();
        t.setPitch(1.0f);
        t.setSpeechRate(1.0f);
        t.speak(text,TextToSpeech.QUEUE_FLUSH,null);
    }
}
Run Code Online (Sandbox Code Playgroud)

Lin*_*ino 6

TTS 在模拟器上不起作用的原因是TextToSpeech实例创建应该异步执行,而不是在主 UI 线程中执行。

onInit()事实上,您必须通过等待回调验证状态是否为 来确保 TTS 初始化成功TextToSpeech.SUCCESS。还应该定义语言,例如(仅使用 AsyncTask 进行演示):

private class TTSInit extends AsyncTask<Void, Void, Void> {

        @Override
        protected Void doInBackground(Void... voids) {
            t=new TextToSpeech(getContext(), status -> {
                if (status == TextToSpeech.SUCCESS) {
                    t.setLanguage(Locale.ENGLISH);
                    /* now you can invoke speak() */
                }
            });
            return null;
        }
}
Run Code Online (Sandbox Code Playgroud)

最后,如果您的目标是 Android 11,则应将以下代码添加到清单中:

<queries>
    <intent>
       <action android:name="android.intent.action.TTS_SERVICE" />
    </intent>
</queries>
Run Code Online (Sandbox Code Playgroud)