【问题标题】:UtteranceProgressListener works overall but the events onStart and onDone don't workUtteranceProgressListener 整体工作,但事件 onStart 和 onDone 不起作用
【发布时间】:2021-04-08 02:10:01
【问题描述】:

这是包含重写的 onDone 和 onStart 的 SpeechSynthesizer.java 文件

package ru.cadmean.speechforunityjava;

import android.content.Context;
import android.speech.tts.TextToSpeech;
import android.speech.tts.UtteranceProgressListener;
import android.util.Log;

import java.util.Locale;

public class SpeechSynthesizer {

    private boolean isReady;

    private String currentLanguage = "en-US";
    private float currentRate = 1f;

    private TextToSpeech tts;

    public SpeechSynthesizer(Context context, SpeechSynthesizerDelegate delegate) {
        tts = new TextToSpeech(context, status -> {
            if (status != TextToSpeech.SUCCESS) {
                Log.d("Speech", "Failed to initialize text to speech: " + status);
                return;
            }

            tts.setLanguage(Locale.ENGLISH);
            tts.setSpeechRate(currentRate);

            tts.setOnUtteranceProgressListener(new UtteranceProgressListener() {
                @Override
                public void onStart(String utteranceId) {
                    delegate.onSpeakingStarted();
                    Log.d("Bruh", "speaking started2");
                }

                @Override
                public void onDone(String utteranceId) {
                    delegate.onSpeakingFinished();
                    Log.d("Bruh", "speaking finished2");
                }

                @Override
                public void onError(String utteranceId) {
                    delegate.onSpeakingCancelled();
                    Log.d("Bruh", "speaking Cancelled2");

                }
            });

            isReady = true;
        });
    }

    public boolean isReady() {
        return isReady;
    }

    public void speakText(String text, String lang, float rate) {
        if (!currentLanguage.equals(lang)) {
            currentLanguage = lang;
            tts.setLanguage(new Locale(lang));
        }
        if (currentRate != rate) {
            currentRate = rate;
            tts.setSpeechRate(rate);
        }
        Log.d("Speech", "Speaking: " + text);
        tts.speak(text, TextToSpeech.QUEUE_FLUSH, null);
    }

    public boolean isSpeaking() {
        return tts.isSpeaking();
    }

    public void stopSpeaking() {
        Log.d("Speech", "Stopping");
        tts.stop();
    }
}

这是订阅的代表应该工作但不能工作的主文件。

package ru.cadmean.speechforunityapp;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

import ru.cadmean.speechforunityjava.SpeechSynthesizer;
import ru.cadmean.speechforunityjava.SpeechSynthesizerDelegate;

public class MainActivity extends AppCompatActivity {

    private EditText editSpeechText;
    private Button startButton;
    private Button stopButton;

    private SpeechSynthesizer speechSynthesizer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        speechSynthesizer = new SpeechSynthesizer(getApplicationContext(), new SpeechSynthesizerDelegate() {
            @Override
            public void onSpeakingStarted() {
                Log.d("Bruh", "speaking started");
            }

            @Override
            public void onSpeakingFinished() {
                Log.d("Bruh", "speaking finished");
            }

            @Override
            public void onSpeakingCancelled() {
                Log.d("Bruh", "speaking cancelled");
            }
        });

        editSpeechText = findViewById(R.id.editSpeechText);
        startButton = findViewById(R.id.startButton);
        stopButton = findViewById(R.id.stopButton);

        startButton.setOnClickListener(v -> {
            if (!speechSynthesizer.isReady()) {
                Log.d("Bruh", "Not ready");
                return;
            }

            speechSynthesizer.speakText(editSpeechText.getText().toString(), "ru-RU", 1f);
        });

        stopButton.setOnClickListener(v -> {
            speechSynthesizer.stopSpeaking();
        });
    }
}

I also made the repository public

总体问题是,当我按下启动时,应用程序会说话,但 onDone 或 onStart 事件没有触发。

【问题讨论】:

  • 很好奇我的回答是否有效。

标签: android text-to-speech


【解决方案1】:

它不起作用的原因是,当您调用 speak 时,您将参数(特别是 utteranceID)设置为 null。

因此,在 SpeechSynthesizer.speakText() 中,添加以下内容:

// set params
// *** this method will work for devices API 19+ ***

String mostRecentUtteranceID = "blahblahblah";
   
HashMap<String, String> params = new HashMap<>();
params.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, mostRecentUtteranceID);

tts.speak(text, TextToSpeech.QUEUE_FLUSH, params);

“blahblah”只是一种快速解决方法,以便您可以看到问题。

如果您想区分话语,请为每个通话使用唯一的 ID。 (见setOnUtteranceProgressListener not at all working for Text To Speech for API > 21

【讨论】:

    猜你喜欢
    • 2020-12-26
    • 2014-09-25
    • 1970-01-01
    • 1970-01-01
    • 2018-05-11
    • 2012-09-25
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    相关资源
    最近更新 更多