Продолжаем мегапроект, в котором поставим себе на службу безразмерное облако Яндекса. Задача — воспользоваться облачным сервисом Яндекса, который отвечает за расшифровку текста из аудиофайла.
Вчера мы подготовили «Яндекс.Облако» и разобрались с технологиями, которые будем использовать. Теперь можно отправлять файлы на сервер и получать текст.
Технические детали
В проекте мы будем распознавать длинные аудио. Яндекс считает длинными записи от 30 секунд и больше одного мегабайта, но никто не мешает отправить на распознавание файл с меньшей длительностью записи. Так тоже можно.
Форматы аудио, которые понимает нейросеть Яндекса на момент написания статьи, — LPCM и OggOpus. Мы будем работать со вторым: он занимает меньше места и проще в обработке. MP3 пока не поддерживается.
Распознаётся только русская речь.
Готовим файл
Нам нужен файл в формате OggOpus и расширением .ogg. Если ваш диктофон, телефон или компьютер не умеют сохранять аудио в таком формате, используйте любой аудиоконвертер — онлайн-сервис или в виде программы на компьютере.
Например, это может работать так: находите в интернете любой сервис конвертации аудио, выбираете формат Opus (просто Ogg не пойдёт — не тот кодек) и сохраняете файл в этом формате. Затем меняете расширение на .ogg вместо .opus — и у вас получился файл нужного формата.
Если аудиозаписей пока никаких нет, используйте тестовый файл speech.ogg, потренируйтесь на нём.
Загружаем файл на сервер
Теперь нужно готовый файл отправить в «Яндекс.Облако». Место, где хранятся файлы в облачном сервисе, называется «бакет» («ведро» по-нашему). Чтобы сделать новое ведро, заходим в консоль, переходим в раздел Object Storage и нажимаем «Создать бакет»:
В появившемся окне придумываем имя и нажимаем «Создать бакет»:
Нам нужно загрузить файл в этот бакет. Для этого заходим в него и перетаскиваем туда мышкой наш файл:
Последнее, что осталось, — узнать путь к файлу. Для этого нажимаем на сам файл, выбираем «Получить ссылку» и копируем её. Она нам пригодится на последнем этапе:
Добавляем нужные библиотеки в Python
Мы будем писать программу-обработчик на Python, поэтому перед началом убедитесь, что он есть у вас на компьютере.
Чтобы отправлять запросы на сервер и принимать в ответ готовый текст, нам нужна python-библиотека requests
. Установим её из командной строки в PowerShell. Если у вас Мак — то через Терминал:
pip install requests --user
Пишем программу
К этому моменту у нас уже есть аудиофайл в нужном формате, он залит в хранилище, осталось только распознать его. Вот что нам для этого нужно:
- API-ключ → его мы получали в первой части.
- Путь к файлу в бакете → получили, когда заливали файл в хранилище.
Эти данные мы вставим в наш код на 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 :-)