Преобразовать речь в текст (speech to text) легко с помощью бесплатной модели автоматического распознавания речи Whisper от компании OpenAI, создателя ChatGPT. В этой статье распознаем речь на русском и на английском языке. Распознаем речь как уже записанную в аудио файл, так и аудиопоток (живой звук) с микрофона. Работать будем в Debian. Погнали!

Установка Whisper

Актуализируем установленные версии пакетов Debian:

apt update && apt upgrade -y

Устанавливаем Python, библиотеку PyTorch для Python, менеджер пакетов Pip для Python, пакет Venv для виртуальных окружений в Python и пакет инструментов для работы с аудио и видео FFmpeg:

apt install python3 python3-torch python3-pip python3-venv ffmpeg

Проверяем версию установленного Python:

python3 --version

Дожна быть версия не менее Python 3.9.9.

Начиная с Python 3.12, а в некоторых сборках с Python 3.11, попытка установить пакет с помощью команды pip install не увенчается успехом:

Ошибка externally-managed-environment

Ниже строки «error: externally-managed-environment» имеются разъяснения, что Python-пакет можно установить командой apt. Если же Python-пакет желаете ставить командой pip install, то нужно предварительно создать виртуальное окружение Python. Это все сделано, чтобы избежать конфликтов между пакетами, установленными через apt и pip.

Под обычным пользователем (не root) cоздаем виртуальное окружение Python с именем whisper_env:

python3 -m venv whisper_env

Активируем виртуальное окружение whisper_env:

source whisper_env/bin/activate

Когда понадобится выйти из виртуального окружения:

deactivate

Когда понадобится удалить виртуальное окружение whisper_env:

rm -rf whisper_env

В виртуальном окружении устанавливаем самую свежую версию Whisper от OpenAI:

pip install git+https://github.com/openai/whisper.git
Установка Wisper от OpenAI

Whisper и необходимые ему для работы пакеты успешно установлены.

Если понадобится обновить Whisper:

pip install --upgrade --no-deps --force-reinstall git+https://github.com/openai/whisper.git

Speech to text для аудиофайла

Whisper поддерживает аудиофайлы в следующих форматах: mp3, wav, m4a, flac, ogg, webm.

Для преобразования речи в текст (speech to text) запустим Whisper в командной строке, например, для аудиофайла на английском языке:

whisper /home/user/test.mp3 --model base --language English

где /home/user/test.mp3 – путь к аудиофайлу, который нужно обработать.

--model base – выбор модели base (средняя точность, хорошая скорость). Всего доступно шесть моделей, различающихся по размеру, скорости и точности: tiny, base, small, medium, large, turbo.

--language English – явное указание языка речи. Без явного указания языка Whisper сам определит язык.

Whisper обрабатывает аудиофайл и выводит распознанный текст с временными метками в терминал:

Speech to text для аудиофайла

Кроме того, Whisper создает пять файлов с расширениями:

  • .txt — просто текст без временных меток;
  • .srt — формат субтитров с таймкодами, например, для видео на YouTube;
  • .vtt — формат субтитров, используемый в HTML5-видеоплеерах;
  • .json — структурированные данные с временными метками для программного анализа;
  • .tsv — тект и время в табличной форме.

Чтобы обработать аудиофайл и узнать время, которое понадобилось Whisper для обработки этого файла:

time whisper /home/user/test.mp3 --model base --language English

Например, mp3 аудиофайл на английском языке, длительностью 3:18 минут, был обработан с помощью модели base за 11 секунд.

Время обработки Speed to text

Вот пример Speech to text обработки с помощью Whisper и модели base для mp3 аудиофайла на русском языке длительностью 12:22 минут. Время обработки — 1 минута и 2 секунды:

Speech to text для аудиофайла на русском языке

Модель base быстрая, но делает ошибки. Я обнаружила ошибки в распознанном тексте и на английском языке, и на русском. Следующая по точности модель small уже эти ошибки не сделала. Так что, экспериментируйте!

Speech to text для аудиопотока с микрофона

Источник звука по умолчанию

Проверяем, какое устройство в данный момент установлено по умолчанию как источник звука:

pactl info | grep "Default Source"
Источник звука по умолчанию

Если это не микрофон, как у меня, то смотрим, какие вообще есть устройства — источники звуков:

pactl list sources short
Иточники звуков в Debian

Устанавливаем микрофон как устройство — источник звука по умолчанию:

pactl set-default-source <имя_устройства>

В моем случае это будет команда:

pactl set-default-source alsa_input.usb-Creative_Technology_Ltd_Sound_Blaster_Play__3_YDSB1730445001857F-00.iec958-stereo

Проверка микрофона

Проверить работоспособность микрофона можно, например, записав короткий аудиофайл, а затем прослушав его. Команда на запись аудиофайла:

arecord -f cd -d 5 test-mic.wav

где -f cd — качество записи 44100 Гц, 16 бит, стерео;

-d 5 — длительность записи 5 секунд;

test-mic.wav — имя выходного аудиофайла.

Прослушаем аудиофайл test-mic.wav:

aplay test-mic.wav

Python программа — speech to text для аудиопотока с микрофона

Устанавливаем Python-библиотеку PyAudio для работы с микрофоном:

pip install pyaudio

Для преобразования Speech to text для аудиопотока с микрофона напишем небольшую программу на Python и назовем ее, например, streaming_speech_recognition.py:

import whisper
import pyaudio
import numpy as np
import torch

# Determine whether to use GPU
device = "cuda" if torch.cuda.is_available() else "cpu"
print(f"Using {device.upper()} for computations")

# Load the Whisper model
model = whisper.load_model("small", device=device)

# Audio stream settings
FORMAT = pyaudio.paInt16  # 16-bit audio
CHANNELS = 1  # Mono sound
RATE = 16000  # Sample rate
CHUNK = 1024  # Buffer size

# Initialize PyAudio
audio = pyaudio.PyAudio()

# Open a stream for recording from the microphone
stream = audio.open(format=FORMAT, channels=CHANNELS, rate=RATE,
                    input=True, frames_per_buffer=CHUNK)

print("Speak... (Press Ctrl+C to exit)")

try:
    while True:
        frames = []

        # Record audio for ~5 seconds (can be changed)
        for _ in range(int(RATE / CHUNK * 5)):  # 5 seconds of audio
            data = stream.read(CHUNK)
            frames.append(np.frombuffer(data, dtype=np.int16))

        # Convert data to a NumPy array and normalize
        audio_data = np.concatenate(frames, axis=0).astype(np.float32) / 32768.0

        # Transcribe speech using Whisper
        result = model.transcribe(audio_data, language="en", fp16=False)  # fp16=False for CPU
        print("Recognized text:", result["text"])

except KeyboardInterrupt:
    print("\nStopping the program...")
    stream.stop_stream()
    stream.close()
    audio.terminate()

Как это работает?

Если в двух словах, то программа streaming_speech_recognition.py в реальном времени пишет звук с микрофона, обрабатывает его и передает в модель Whisper для распознавания речи. Распознанная речь выводится в терминал.

Если подробнее описать, то получается следующая последовательность действий:

  1. Определение устройства для вычислений модели Whisper: GPU или CPU. Если подходящего GPU не обнаружно, используется CPU.
  2. Загрузка модели small Whisper. Можно экспериментировать и с другими моделями: tiny, base, medium, large, turbo.
  3. Настройки аудиопотока: FORMAT = pyaudio.paInt16 — 16-битное аудио (стандартный формат); CHANNELS = 1 — один канал, как у большинства микрофонов; RATE = 16000 — частота дискретизации (обычно 16 кГц для речи); CHUNK = 1024 — размер одного пакета данных, считываемых с микрофона.
  4. Открытие потока stream, который захватывает звук с микрофона.
  5. Запуск бесконечного цикла while True, в котором:
    • звук с микрофона считывается кусками (stream.read(CHUNK)) и складывается в frames;
    • цикл for _ in range(...) повторяет stream.read(CHUNK) столько раз, чтобы записать 5 секунд аудио. Можно уменьшить задержку, например, записывая 1 секунду вместо 5;
    • после записи 5 секунд аудио данные преобразуются в numpy массив и нормализуются для передачи в Whisper;
    • Whisper обрабатывает звук, явное указание языка language="en" ускоряет обработку, fp16=False — отключает Float16, если используется CPU;
    • распознанная речь выводится в терминал.
  6. Завершение программы, если пользователь нажимает Ctrl+C.

Запуск Python программы

Для запуска программы streaming_speech_recognition.py:

python3 streaming_speech_recognition.py

При первом запуске программы скачается small модель Whisper, размер которой ~460 MB. Для сравнения, размер base модели Whisper ~140 MB.

Рядом с микрофоном я проиграла test.mp3 — аудиофайл на английском языке, который тестировался с Whisper самый первый:

Speech to text для аудиопотока с микрофона

Я в восторге от результата!

Вывод

Напишите в комментариях, как Speed to text можно использовать в реальной жизни. Будет интересно!

Комментарии

Добавить комментарий

Этот сайт защищен reCAPTCHA, и к нему применяются Google Политика конфиденциальности и Условия использования.

Войти

Зарегистрироваться

Сбросить пароль

Пожалуйста, введите ваше имя пользователя или эл. адрес, вы получите письмо со ссылкой для сброса пароля.