1

GoogleAndroidの音声合成機能のラッパークラスを作成しようとしています。ただし、onInit関数が終了するまでシステムを一時停止する方法を見つけるのに問題があります。下部に添付されているのは、ここで見つけたものに基づいて作成したソリューションの一部です。Androidのスピーチ-Androidでテキストを読み取るにはどうすればよいですか?

ただし、このソリューションは機能していないようです。これが機能しない理由についての考え、またはonInit()呼び出しの後にSpeak()呼び出しが確実に発生するようにするための良いアイデアは何でしょうか?

パブリッククラスSpeechSynthはOnInitListenerを実装します{

private TextToSpeech tts;
static final int TTS_CHECK_CODE = 0;
private int ready = 0;
private ReentrantLock waitForInitLock = new ReentrantLock();

SpeechSynth( Activity screen )
{
    ready = 0;
    tts = new TextToSpeech( screen, this );
    waitForInitLock.lock();

}

public void onInit(int status) 
{
    if (status == TextToSpeech.SUCCESS)
    {
        ready = 1;
    }
    waitForInitLock.unlock();
}

public int Speak( String text )
{
    if( ready == 1 )
    {
        tts.speak(text, TextToSpeech.QUEUE_ADD, null);
        return 1;
    }
    else
    {
        return 0;
    }   
}

}

コンストラクターを介してテキストの文字列を渡し、onInit()関数で再生できるようにすることができました。ただし、プログラムに別のことを言わせる必要があるたびに、テキスト読み上げエンジン全体を破棄して再作成する必要はありません。

4

1 に答える 1

1

準備完了状態のintではなく、ロックに依存することをお勧めします。次のようにコードを挿入します。

public int Speak( String text )
{
        if (waitForInitLock.isLocked())
        {
            try
            {
                waitForInitLock.tryLock(180, TimeUnit.SECONDS);
            }
            catch (InterruptedException e)
            {
                Log.e(D_LOG, "interruped");
            }
            //unlock it here so that it is never locked again
            waitForInitLock.unlock();
        }

    if( ready == 1 )
    {
        tts.speak(text, TextToSpeech.QUEUE_ADD, null);
        return 1;
    }
    else
    {
        return 0;
    }   
}
于 2010-06-15T17:39:19.937 に答える