TTS (Text to Speech): менеджер в своем классе - PullRequest
0 голосов
/ 19 марта 2012

Я пытаюсь создать менеджер преобразования текста в речь в собственном классе менеджера.

В настоящее время мой код выглядит так:

public class TTSManager extends Activity implements OnInitListener{

private TextToSpeech myTTS;
private int MY_DATA_CHECK_CODE = 0;
private boolean readyToSpeak = false;

public TTSManager()
{
    ;
}

public void checkIfTTSModulesInstalled()
{
    Intent checkIntent = new Intent();
    checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
    startActivityForResult(checkIntent, MY_DATA_CHECK_CODE);
}


protected void onActivityResult(
        int requestCode, int resultCode, Intent data) {
    if (requestCode == MY_DATA_CHECK_CODE) {
        if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) 
        {
            // success, create the TTS instance
            myTTS = new TextToSpeech(this, this);
        } 
        else 
        {
            // missing data, install it
            Intent installIntent = new Intent();
            installIntent.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
            startActivity(installIntent);
        }
    }
}


@Override
public void onInit(int status) 
{
    if (status == TextToSpeech.SUCCESS)
    {
        if(myTTS.isLanguageAvailable(Locale.US) == TextToSpeech.LANG_AVAILABLE)
        {
            myTTS.setLanguage(Locale.US);
            readyToSpeak = true;
        }
    }
}

public void speak(String text)
{
    if (readyToSpeak)
        myTTS.speak(text, TextToSpeech.QUEUE_FLUSH, null);
}

}

К сожалению, я получаю исключение нулевого указателя при попытке инициализировать модуль TTS. Как я могу построить TTS Manager - это собственный класс (а не непосредственно в той деятельности, где должен использоваться TTS)?

Ответы [ 2 ]

2 голосов
/ 19 марта 2012

У вашего менеджера нет расширения Activity. Если вы это сделаете, не будет способа использовать его в других действиях, что, я думаю, является вашей целью (это должно быть инициализировано Android, простой вызов new TTSManager() не делает его действительным действием). Сделайте его обычным классом и передайте параметр Context всем методам, которые в нем нуждаются.

Что касается NPE, вы можете посмотреть на трассировку стека.

Вот что-то похожее, что я написал, может дать вам несколько советов. В нем много кода для переключения движков, но вы можете игнорировать это, если вы просто используете стандартный:

http://code.google.com/p/wwwjdic/source/browse/branches/2.0/wwwjdic/src/org/nick/wwwjdic/TtsManager.java

1 голос
/ 29 апреля 2012

Я сейчас сделал это так (хотя и не был уверен, что этот способ «в порядке»):

import java.util.Locale;

import android.content.Context;
import android.content.Intent;
import android.speech.tts.TextToSpeech;
import android.speech.tts.TextToSpeech.OnInitListener;

public class TTSManager
{
private TextToSpeech myTTS;
private boolean readyToSpeak = false;
private Context context;

public TTSManager(Context baseContext)
{
    this.context = baseContext;
}

public void initOrInstallTTS()
{
    myTTS = new TextToSpeech(context, new OnInitListener() 
    {               
        @Override
        public void onInit(int status) 
        {
            if (status == TextToSpeech.SUCCESS)
            {
                myTTS.setLanguage(Locale.US);
                readyToSpeak = true;
            }
            else
                installTTS();
        }
    });
}

private void installTTS()
{
    Intent installIntent = new Intent();
    installIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    installIntent.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
    context.startActivity(installIntent);
}

public void speak(String text)
{       
    if (readyToSpeak)
        myTTS.speak(text, TextToSpeech.QUEUE_FLUSH, null);
}

}
...