Android 语音 - 如何在 Android 中阅读文本?

标签 android text-to-speech

如何在 Android 中读取数据,即将简单的文本字符串转换为语音(语音)?

有没有一个API可以让我做这样的事情:

TextToVoice speaker = new TextToVoice();
speaker.Speak("Hello World");

最佳答案

使用 TTS 比您预期的要复杂一些,但是编写一个包装器来提供您想要的 API 是很容易的。

要使其正常工作,您必须克服许多问题。

他们是:

  1. 始终设置 UtteranceId(否则 OnUtteranceCompleted 不会 称为)
  2. 设置 OnUtteranceCompleted 听众(仅在演讲之后 系统已正确初始化)

public class TextSpeakerDemo implements OnInitListener
 {
    private TextToSpeech tts;
    private Activity activity;

    private static HashMap DUMMY_PARAMS = new HashMap();
    static 
    {
        DUMMY_PARAMS.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "theUtId");
    }
    private ReentrantLock waitForInitLock = new ReentrantLock();

    public TextSpeakerDemo(Activity parentActivity)
    {
        activity = parentActivity;
        tts = new TextToSpeech(activity, this);       
        //don't do speak until initing
        waitForInitLock.lock();
    }

    public void onInit(int version)
    {        //unlock it so that speech will happen
        waitForInitLock.unlock();
    }  

    public void say(WhatToSay say)
    {
        say(say.toString());
    }

    public void say(String say)
    {
        tts.speak(say, TextToSpeech.QUEUE_FLUSH, null);
    }

    public void say(String say, OnUtteranceCompletedListener whenTextDone)
    {
        if (waitForInitLock.isLocked())
        {
            try
            {
                waitForInitLock.tryLock(180, TimeUnit.SECONDS);
            }
            catch (InterruptedException e)
            {
                Log.e("speaker", "interruped");
            }
            //unlock it here so that it is never locked again
            waitForInitLock.unlock();
        }

        int result = tts.setOnUtteranceCompletedListener(whenTextDone);
        if (result == TextToSpeech.ERROR)
        {
            Log.e("speaker", "failed to add utterance listener");
        }
        //note: here pass in the dummy params so onUtteranceCompleted gets called
        tts.speak(say, TextToSpeech.QUEUE_FLUSH, DUMMY_PARAMS);
    }

    /**
     * make sure to call this at the end
     */
    public void done()
    {
        tts.shutdown();
    }
}

关于Android 语音 - 如何在 Android 中阅读文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1160876/

相关文章:

java - 关于Java中的Locale类

android - 在 Android 中使用 EventMotion 向上滑动图像

android - 带有自定义快门声音的相机

android - Android 4.1.1 平板电脑上的文字转语音

超过 4k 个字符的 Android TTS 文本无法播放

html - html音频标签未自动播放音频

android - 从浏览器链接到 native Google Play 商店应用程序

android - 解析查询以按位置对列表进行排序

android - 写入应用程序内部存储 - 频率限制?

java - 如何在 Android Java 上暂停文本到语音