среда, 28 декабря 2011 г.

Ознакомление с технологией Текст-В-Звук(Text-To-Speech) под Андроид

Данная технология появилась в Андроид 1.6 версии, Данная технология Text-To-Speech (TTS) известна как технология синтеза речи, что позволяет «заговорить» различные Андроид устройства.



Языки и ресурсы


Ресурсы
TTS поддерживает различные языки: Английский, Французкий, Итальянский, также технология поддержует синтез речи различных диалектов.
Перед использованием технологии вы должны заранее определить язык.
В некоторых версиях Андроида, устройства не полностью поддержую данную технологию, из-за небольших аппаратных возможностей. Ну есть возможность скачать и доустановить, если необходимо. Начнём работу с проверки поддержки данной технологии.
Intent checkIntent = new Intent();
checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
startActivityForResult(checkIntent, MY_DATA_CHECK_CODE);
Поддержку технологии определим по полученому коду CHECK_VOICE_DATA_PASS после инициализации объекта android.speech.tts.TextToSpeech. В другом случае необходимо доустановить данную технологию, запустим интэнд ACTION_INSTALL_TTS_DATA, который перенаправит пользователя в Андроид Маркет, после чего загрузкаи установка пройдут в автоматическом режиме. Вот полный пример исполнения onActivityResult():
private TextToSpeech mTts;
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, this);
        } else {
            // missing data, install it
            Intent installIntent = new Intent();
            installIntent.setAction(
                TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
            startActivity(installIntent);
        }
    }
}
В конструкторе TextToSpeech передаем ссылку на наш контекст Context в данном случае наш активити. И в событии OnInitListener Text-To-Speech оповистит, что она готова к работе, после чего мы можем начать настраивать.

Языки и Локали


Загружаем языки
mTts.setLanguage(Locale.US);
Также вы можете проверить поддержку тех, или других языков, локалей(диалектов) с помощью метода объекта isLanguageAvailable() к примеру:
mTts.isLanguageAvailable(Locale.UK))
mTts.isLanguageAvailable(Locale.FRANCE))
mTts.isLanguageAvailable(new Locale("spa", "ESP")))
При результате LANG_COUNTRY_AVAILABLE – Язык и диалект региона поддерживаются.
Но
mTts.isLanguageAvailable(Locale.CANADA_FRENCH))
mTts.isLanguageAvailable(new Locale("spa"))
Результат TextToSpeech.LANG_AVAILABLE. – Язык поддерживается, диалект не найден.
Интэнд ACTION_CHECK_TTS_DATA определяет наличие языков, что также можно сделать и методом объекта isLanguageAvailable()после его создания TextToSpeech. Результат TextToSpeech.LANG_MISSING_DATA – запрашиваемые ресурсы не найдены, не установлены.
Если будете пытаться заставить синтезировать итальянские слова с установка на французкий, вы получите какой-то результат, который далёк от оригинала. Даже если вы используете текущий язык Locale.getDefault() убедитесь в том, что данный язык поддерживается TTS технологией.

Заставляем ваше приложение говорить.
Сейчас наш экземпляр TextToSpeech правильно подготовлен и готов к работе. Вызовите метод speak() и получите результат. Пример ниже – код раздражительного будильника.
String myText1 = "Did you sleep well?";
String myText2 = "I hope so, because it's time to wake up.";
mTts.speak(myText1, TextToSpeech.QUEUE_FLUSH, null);
mTts.speak(myText2, TextToSpeech.QUEUE_ADD, null);
TTS движок использует глобальную очередь для синтеза. Каждый экземпляр TextToSpeech имеет свою очередь. speak()- прерывает общую очередь, размещает свой буфер в начале общей очереди.
Использование различных настроек для типа проигрываемого потока.
On Android, each audio stream that is played is associated with one stream type, as defined in android.media.AudioManager. For a talking alarm clock, we would like our text to be played on the AudioManager.STREAM_ALARM stream type so that it respects the alarm settings the user has chosen on the device. The last parameter of the speak() method allows you to pass to the TTS engine optional parameters, specified as key/value pairs in a HashMap. Let's use that mechanism to change the stream type of our utterances:
HashMap<String, String> myHashAlarm = new HashMap();
myHashAlarm.put(TextToSpeech.Engine.KEY_PARAM_STREAM,
        String.valueOf(AudioManager.STREAM_ALARM));
mTts.speak(myText1, TextToSpeech.QUEUE_FLUSH, myHashAlarm);
mTts.speak(myText2, TextToSpeech.QUEUE_ADD, myHashAlarm);

Использование дополнительных настроек для события обратного вызова при завершении воспроизведения
Заметьте, что speak() выполняется асинхронно, не в зависимости использования параметров QUEUE_FLUSH и QUEUE_ADD. Но вы должны понимать, когда и какой параметр использовать. QUEUE_ADD – добавляет в конец очереди, что будет проиграно после того, как всё что было в очереди проиграно. QUEUE_FLUSH - прерывает очередь, к примеру когда вы слушаете музыку и раздаётся будильник. Установление обратного вызова:
mTts.setOnUtteranceCompletedListener(this);
myHashAlarm.put(TextToSpeech.Engine.KEY_PARAM_STREAM,
        String.valueOf(AudioManager.STREAM_ALARM));
mTts.speak(myText1, TextToSpeech.QUEUE_FLUSH, myHashAlarm);
myHashAlarm.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID,
        "end of wakeup message ID");
// myHashAlarm now contains two optional parameters
mTts.speak(myText2, TextToSpeech.QUEUE_ADD, myHashAlarm);
Активити будет оповещён об завершении проигрывания.
public void onUtteranceCompleted(String uttId) {
    if (uttId == "end of wakeup message ID") {
        playAnnoyingMusic();
    } 
}

Преобразование файла и проигрывание
speak() – синтезирует речь и воспроизводит её, при частом синтезировании одних и теж фраз есть смысл сохранять результат, в последствии только воспроизводить результат, что снимает нагрузку с процессора.
HashMap myHashRender = new HashMap();
String wakeUpText = "Are you up yet?";
String destFileName = "/sdcard/myAppCache/wakeUp.wav";
myHashRender.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, wakeUpText);
mTts.synthesizeToFile(wakuUpText, myHashRender, destFileName);
Результат можно воспроизвести с помощью android.media.MediaPlayer.
TextToSpeech связан с аудио ресурсами произношения.Мы можем указать TTS экземпляру, как альтернативу источник сгенерированного аудио. Если источник пустой, аудио генерируется и сохраняется в него, иначе используется с источника. addSpeech()
mTts.addSpeech(wakeUpText, destFileName);

Заключение
Теперь Андроид разговаривает, ваши приложения могут делать тоже самое. Для того, что бы произношение совпадало с реальным произношением необходимо указать какой язык используется для синтеза речи.
Технология доступна для всех приложений, оно работает как отдельный сервис. Хорошей практикой считается освобождать сторонние ресурсы после работы. Вызывайте mTts.shutdown() в методе активити onDestroy() вашего экзепляра.

1 комментарий: