Иногда приложению нужно не просто показать текст, а произнести его вслух: для людей с нарушениями зрения, в голосовых помощниках или при изучении иностранных слов. В Android для этого есть встроенный движок TextToSpeech, который преобразует строку в аудио без дополнительных библиотек. Сегодня в Android Studio мы разберём, как запустить озвучивание на языке Kotlin. Этот урок рассчитан на начинающих и покажет, как сделать приложение «говорящим» за несколько минут.
Что такое TextToSpeech
TextToSpeech (TTS) — это системный сервис, который синтезирует речь из переданного текста. Он использует установленные в системе голосовые движки (например, Google TTS) и поддерживает множество языков. Разработчику достаточно создать экземпляр класса, дождаться его готовности и вызвать метод speak(). Всё остальное — выбор голоса, высоты тона и скорости — настраивается опционально.
Сам по себе TTS не требует разрешений в манифесте, но если нужно проверить наличие языковых пакетов, может потребоваться доступ в интернет. В простом сценарии с локальными голосами интернет не обязателен.
Инициализация TextToSpeech
Создайте новый проект или откройте существующий. В MainActivity.kt объявим переменную для TTS и инициализируем её в onCreate. Конструктор принимает контекст и слушатель, который сообщит о статусе инициализации.
class MainActivity : AppCompatActivity() {
private var tts: TextToSpeech? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
tts = TextToSpeech(this) { status ->
if (status == TextToSpeech.SUCCESS) {
// движок готов к работе
} else {
Toast.makeText(this, "TTS недоступен", Toast.LENGTH_SHORT).show()
}
}
}
}
В колбэке приходит статус: TextToSpeech.SUCCESS означает, что движок загружен и готов произносить текст, а TextToSpeech.ERROR сигнализирует о проблеме.
Настройка языка и голоса
По умолчанию TTS использует системный язык, но его можно изменить. Для русской речи вызовите setLanguage(Locale("ru")). Метод возвращает результат, который стоит проверить — если язык не поддерживается, можно показать предупреждение.
val result = tts?.setLanguage(Locale("ru"))
if (result == TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED) {
Toast.makeText(this, "Русский язык не поддерживается", Toast.LENGTH_SHORT).show()
}
Произнесение текста
Чтобы заставить телефон говорить, вызовите метод speak(), передав текст, режим очереди (добавить в очередь или перебить текущий) и дополнительные параметры. Для простого сценария используем QUEUE_FLUSH, чтобы новая фраза прерывала предыдущую.
tts?.speak("Привет, мир!", TextToSpeech.QUEUE_FLUSH, null, null)
Пример: кнопка «Озвучить»
Создадим в activity_main.xml поле ввода EditText и кнопку. При нажатии будем зачитывать то, что ввёл пользователь.
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="24dp"
android:gravity="center">
<EditText
android:id="@+id/editText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="Введите текст для озвучки" />
<Button
android:id="@+id/btnSpeak"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:text="Озвучить" />
</LinearLayout>
В коде свяжем кнопку с вызовом speak():
val editText = findViewById<EditText>(R.id.editText)
val btnSpeak = findViewById<Button>(R.id.btnSpeak)
btnSpeak.setOnClickListener {
val text = editText.text.toString()
if (text.isNotEmpty()) {
tts?.speak(text, TextToSpeech.QUEUE_FLUSH, null, null)
} else {
Toast.makeText(this, "Введите текст", Toast.LENGTH_SHORT).show()
}
}
Освобождение ресурсов
TextToSpeech занимает системные ресурсы, поэтому его нужно правильно завершить. В методе onDestroy() вызовите stop() и shutdown(), чтобы остановить воспроизведение и освободить движок.
override fun onDestroy() {
tts?.stop()
tts?.shutdown()
super.onDestroy()
}
Полезные советы
- Проверяйте готовность движка. Метод
speak()можно вызывать только после успешной инициализации, иначе речь не прозвучит. Сохраняйте флаг готовности в колбэке. - Настройте высоту и скорость. Методы
setPitch()иsetSpeechRate()позволяют изменить тональность и темп речи. Значение 1.0 — норма, меньше — медленнее, больше — быстрее и выше. - Добавьте паузы. Если нужно произнести несколько фраз с паузами, используйте
playSilentUtterance()или ставьте очередь сQUEUE_ADD.
Коротко о главном
Этот урок в Android Studio на Kotlin показал, как оживить приложение с помощью синтеза речи. Вы инициализировали TextToSpeech, настроили русский язык и сделали кнопку, которая озвучивает введённый текст. Теперь ваше приложение может общаться с пользователем голосом, помогать людям с ограничениями зрения или просто разнообразить взаимодействие. Попробуйте добавить регулировку скорости речи через SeekBar — это станет отличным продолжением занятия.