在Android Studio模拟器中无法使用文本转语音应用程序,但在Android设备上可以正常工作。

3

我需要改变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);
    }
}
1个回答

6
TTS在模拟器上无法正常工作的原因是TextToSpeech实例创建应该异步执行,而不是在主UI线程中执行。
确保TTS初始化成功需要等待onInit()回调并验证状态是否为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;
        }
}

最后,如果你的目标是 Android 11,则需要将以下代码添加到清单文件中:

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

@Farman M,上面的答案有助于解决问题吗? - Lino
我在模拟器上无法让TTS工作,但是在添加了那个“action”后它就可以工作了。但是同样的代码为什么在真实设备上也能工作呢?为什么真实设备不需要那个“action”呢? - Damn Vegetables
在我的情况下,我只有实现了TextToSpeech.OnInitListenerMainActivity。它在模拟API 30上无法工作,但在API 24上可以工作。 解决API 30的问题是添加清单部分。 - Bernat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接