Урок на Android Studio. Озвучка текста с TextToSpeech на Kotlin

Иногда приложению нужно не просто показать текст, а произнести его вслух: для людей с нарушениями зрения, в голосовых помощниках или при изучении иностранных слов. В 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 — это станет отличным продолжением занятия.