Глобальный TTS в Android - PullRequest
       18

Глобальный TTS в Android

3 голосов
/ 17 ноября 2011

Привет, я разрабатываю приложение для слепых пользователей, так что я очень часто использую текст в речь, так как практически единственный способ реагировать на действия пользователя.Я решил сделать один глобальный экземпляр TTS работающим так же долго, как приложение.Я реализовал это следующим образом:

package com.simekadam.blindguardian;

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

public class SpeechHelper implements OnInitListener {

private static TextToSpeech mTts;
private String text; 
private static final SpeechHelper helper = new SpeechHelper();

public static SpeechHelper getInstance(){

    return helper;
}


public void say(String text, Context context){

    if(mTts == null){
        this.text = text;
        mTts = new TextToSpeech(context, (OnInitListener) helper);

    }
    else{
        mTts.speak(text, TextToSpeech.QUEUE_FLUSH, null);
    }
}


@Override
public void onInit(int status) {
    // TODO Auto-generated method stub
    if (status == TextToSpeech.SUCCESS) {
        mTts.speak(text, TextToSpeech.QUEUE_FLUSH, null);
    }
}

public void stopTTS(){
    if(mTts != null){
        mTts.shutdown();
        mTts.stop();
        mTts = null;
    }
}

}

Сначала - это работает, НО .. Я хотел проверить наличие таких речевых данных

protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    Intent checkIntent = new Intent();
    checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
    startActivityForResult(checkIntent, MY_DATA_CHECK_CODE);
    text = getIntent().getExtras();
}


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
            mTts = new TextToSpeech(this, (OnInitListener) this);
            mTts.setLanguage(new Locale("cze", "CZE"));
        } else {
            // missing data, install it
            Intent installIntent = new Intent();
            installIntent.setAction(
                TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
            startActivity(installIntent);
        }
    }       
}

Его код с портала для разработчиков Android, но я не могу запустить Activity для результата из класса, который не является дочерним для android.Activity. Пожалуйста, как проверить это, не используя активности, и является ли этот подход вызова TTS правильным?(Я реализовал все это с Activity раньше, но произошла пара утечек памяти из-за неправильно закрытого TTS - и когда я закрывал его должным образом, он должен создаваться снова при каждом вызове - просто слишком медленно ..)

Ответы [ 3 ]

2 голосов
/ 17 ноября 2011

Вам не нужно использовать ACTION_CHECK_TTS_DATA.Вместо этого используйте isLanguageAvailable следующим образом: (убедитесь, что вызываете его только после завершения onInit)

    // check if language is available
    switch (tts.isLanguageAvailable(locale))
    {
        case TextToSpeech.LANG_AVAILABLE:
        case TextToSpeech.LANG_COUNTRY_AVAILABLE:
        case TextToSpeech.LANG_COUNTRY_VAR_AVAILABLE:
            Log.d(TAG, "SUPPORTED");
            break;
        case TextToSpeech.LANG_MISSING_DATA:
            Log.d(TAG, "MISSING_DATA");//launch the install data activity
            break;
        case TextToSpeech.LANG_NOT_SUPPORTED:
            Log.d(TAG, "NOT SUPPORTED");//report failure
            break;
    }
2 голосов
/ 17 ноября 2011

Инициализируйте ваш глобальный экземпляр с onActivityResult(), после того как вы узнаете, что данные TTS доступны. Вашему приложению требуется действие, поэтому сделайте это из действия ввода, все последующие смогут использовать ваш глобальный экземпляр после его инициализации. Также подумайте, когда и как вы его отключите.

0 голосов
/ 10 января 2013

Вот еще несколько ответов от gregm на похожие вопросы:

TTS - CHECK_VOICE_DATA_FAIL - Проверить работоспособность двигателя или

Почему ACTION_CHECK_TTS_DATA Intent "неудобно для"используйте "?

, который также рекомендует просто использовать TextToSpeech.isLanguageAvailable() вместо ACTION_CHECK_TTS_DATA вместе с указателем на вспомогательный класс.

Я проверял это на некоторых android 4.1.2 телефонов с Locale.US, и он прекрасно активирует движок TTS и прекрасно работает с движками сторонних производителей.При тестировании на старом телефоне Android 1.6 (G1) похоже, что стандартный движок TTS не установлен (LANG_MISSING_DATA).Следующий код в этом случае будет перенаправлен в хранилище для установки:

Intent installIntent = new Intent();
installIntent.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
startActivity(installIntent);

После чего использование tts engine в приложении будет работать нормально.По сути, старая запись в блоге от ребят из Android немного устарела и устарела, поскольку, по моему опыту, она не очень хорошо работает с Android 4.x (ANDROID_CHECK_TTS_DATA всегда возвращало мне CHECK_VOICE_DATA_MISSING_DATA в Android 4.x).

...