hard

Переводим аудио в текст. Часть 2

Python, выручай!

Продолжаем мегапроект, в котором поставим себе на службу безразмерное облако Яндекса. Задача — воспользоваться облачным сервисом Яндекса, который отвечает за расшифровку текста из аудиофайла.

Вчера мы подготовили «Яндекс.Облако» и разобрались с технологиями, которые будем использовать. Теперь можно отправлять файлы на сервер и получать текст.

Технические детали

В проекте мы будем распознавать длинные аудио. Яндекс считает длинными записи от 30 секунд и больше одного мегабайта, но никто не мешает отправить на распознавание файл с меньшей длительностью записи. Так тоже можно.

Форматы аудио, которые понимает нейросеть Яндекса на момент написания статьи, — LPCM и OggOpus. Мы будем работать со вторым: он занимает меньше места и проще в обработке. MP3 пока не поддерживается.

Распознаётся только русская речь.

Готовим файл

Нам нужен файл в формате OggOpus и расширением .ogg. Если ваш диктофон, телефон или компьютер не умеют сохранять аудио в таком формате, используйте любой аудиоконвертер — онлайн-сервис или в виде программы на компьютере.

Например, это может работать так: находите в интернете любой сервис конвертации аудио, выбираете формат Opus (просто Ogg не пойдёт — не тот кодек) и сохраняете файл в этом формате. Затем меняете расширение на .ogg вместо .opus — и у вас получился файл нужного формата.

Если аудиозаписей пока никаких нет, используйте тестовый файл speech.ogg, потренируйтесь на нём.

Загружаем файл на сервер

Теперь нужно готовый файл отправить в «Яндекс.Облако». Место, где хранятся файлы в облачном сервисе, называется «бакет» («ведро» по-нашему). Чтобы сделать новое ведро, заходим в консоль, переходим в раздел Object Storage и нажимаем «Создать бакет»:

В появившемся окне придумываем имя и нажимаем «Создать бакет»:

Нам нужно загрузить файл в этот бакет. Для этого заходим в него и перетаскиваем туда мышкой наш файл:

Последнее, что осталось, — узнать путь к файлу. Для этого нажимаем на сам файл, выбираем «Получить ссылку» и копируем её. Она нам пригодится на последнем этапе:

Добавляем нужные библиотеки в Python

Мы будем писать программу-обработчик на Python, поэтому перед началом убедитесь, что он есть у вас на компьютере.

Чтобы отправлять запросы на сервер и принимать в ответ готовый текст, нам нужна python-библиотека requests. Установим её из командной строки в PowerShell. Если у вас Мак — то через Терминал:

pip install requests --user
Чтобы установщик не выдавал в конце подобные предупреждения, добавьте путь к скриптам в глобальную переменную PATH.

Пишем программу

К этому моменту у нас уже есть аудиофайл в нужном формате, он залит в хранилище, осталось только распознать его. Вот что нам для этого нужно:

  1. API-ключ → его мы получали в первой части.
  2. Путь к файлу в бакете → получили, когда заливали файл в хранилище.

Эти данные мы вставим в наш код на Python. Логика программы простая: подготавливаем все данные и отправляем запрос на распознавание. Пока сервер не ответит, что всё готово, ждём. Как только приходит ответ — выводим готовый текст на экран.

# -*- coding: utf-8 -*-
# Подключаем нужные библиотеки
import requests
import time
import json
# Вставьте свой API-ключ 
key = 'AQVNsdKJKgeu[IUyRRERhjkOUiiu9Jo6'
# Вставьте свой путь к файлу в бакете. Всё, что в ссылке стоит после знака вопроса, можно стереть — сервер всё равно это проигнорирует
filelink = 'https://storage.yandexcloud.net/bucketname/speech.ogg'
# Показываем «Облаку», что мы будем распознавать именно длинное аудио
POST = "https://transcribe.api.cloud.yandex.net/speech/stt/v2/longRunningRecognize"
# Формируем сам текст запроса
body ={
    "config": {
        "specification": {
            "languageCode": "ru-RU"
        }
    },
    "audio": {
        "uri": filelink
    }
}
# Формируем заголовок запроса, в котором ссылаемся на API-ключ
header = {'Authorization': 'Api-Key {}'.format(key)}
# Отправляем запрос на распознавание
req = requests.post(POST, headers=header, json=body)
# Получаем технический ответ от сервера и выводим его
data = req.json()
print(data)
# Получаем идентификатор запроса
id = data['id']
# Запрашиваем на сервере статус операции, пока распознавание не будет завершено
while True:
    # Ждём одну секунду
    time.sleep(1)
    # Пытаемся получить ответ по нашему идентификатору запроса
    GET = "https://operation.api.cloud.yandex.net/operations/{id}"
    req = requests.get(GET.format(id=id), headers=header)
    req = req.json()
    # Если готово — выходим из цикла
    if req['done']: break
    # Если не вышли из цикла — выводим сообщение
    print("Ещё не готово")
# Выводим готовый текст 
print("Текст:")
for chunk in req['response']['chunks']:
    print(chunk['alternatives'][0]['text'])
Результат распознавания тестового файла.

Что дальше

Дальше будем создавать аудиокниги и раскрывать весь потенциал движка SpeechKit. Ну и заодно будем программировать на Python :-)

Любишь Python? Зарабатывай на нём!
Изучите самый модный язык программирования и станьте крутым бэкенд-разработчиком. Старт — бесплатно.
Попробовать бесплатно
Любишь Python? Зарабатывай на нём! Любишь Python? Зарабатывай на нём! Любишь Python? Зарабатывай на нём! Любишь Python? Зарабатывай на нём!
Получите ИТ-профессию
В «Яндекс Практикуме» можно стать разработчиком, тестировщиком, аналитиком и менеджером цифровых продуктов. Первая часть обучения всегда бесплатная, чтобы попробовать и найти то, что вам по душе. Дальше — программы трудоустройства.
Начать карьеру в ИТ
Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию
Еще по теме
hard