Транскрипция аудио с помощью Python


Введение

Транскрипция аудио — это процесс преобразования речи в аудио- или видеофайле в текст. Наличие транскрипции для видео- или аудиозаписи имеет свои преимущества. Ниже перечислены некоторые из преимуществ транскрипции аудиозаписей:

  • Расширение целевой аудитории. Когда транскрипция переводится на несколько языков, это открывает контент для более широкой аудитории.
  • Делает контент более доступным. С помощью расшифровки можно легко и точно получить доступ к содержанию аудиозаписи, особенно в тех случаях, когда качество звука ухудшено из-за фоновых помех, низкой громкости, региональных акцентов и так далее.
  • Повышение SEO. Благодаря транскрипции ключевые слова, использованные в аудиозаписи, теперь будут представлены в письменном виде, а значит, их смогут распознать поисковые системы.

В этой статье мы узнаем, как транскрибировать аудио с помощью python.

Необходимые условия

  • Базовые знания программирования на языке python

  • Учетная запись Assembly AI

Получение API-токена

Первое, что мы сделаем, это получим API-токен от Assembly AI.
Давайте перейдем на сайт Assembly AI и создадим бесплатную учетную запись.
После создания учетной записи мы войдем в нее, а затем скопируем API-ключ.
Ключ API находится в правой части главной страницы.

Создание файла конфигурации для хранения ключа

Теперь, когда у нас есть API Key, давайте создадим конфигурационный файл для хранения ключа.
Создадим файл python и назовем его ‘api_key.py’ (вы можете дать ему любое имя). Затем создадим переменную и присвоим ей ключ API Key.

API_KEY = 'API Key from Assembly AI'
Вход в полноэкранный режим Выход из полноэкранного режима

После создания файла конфигурации мы создадим основной файл (main.py), в котором мы напишем коды для транскрибирования аудио.

ПРИМЕЧАНИЕ: ‘api_key.py’ и ‘main.py’ должны находиться в одном каталоге.

Импортирование запросов и API-ключа

Первое, что мы сделаем в ‘main.py’, это импортируем запросы и API-ключ.

import requests
from api_key import API_KEY 
Вход в полноэкранный режим Выход из полноэкранного режима

Загрузка аудио в Assembly AI

Далее создадим переменную ‘filename’, затем получим путь к аудио, которое мы хотим расшифровать, и присвоим этот путь ‘filename’.

filename = 'audio path'
Вход в полноэкранный режим Выход из полноэкранного режима

Теперь создадим еще одну переменную ‘upload_endpoint’.

upload_endpoint = 'https://api.assemblyai.com/v2/upload'
Вход в полноэкранный режим Выход из полноэкранного режима

Давайте также создадим переменную ‘headers’, которая будет использоваться для аутентификации. Для аутентификации мы будем использовать API-ключ.

headers = {'authorization': API_KEY}
Вход в полноэкранный режим Выход из полноэкранного режима

Далее создадим функцию для чтения аудиофайла.

def read_file(filename, chunk_size=5242880):
    with open(filename, 'rb') as _file:
        while True:
            data = _file.read(chunk_size)
            if not data:
                break
            yield data
Вход в полноэкранный режим Выход из полноэкранного режима

Теперь выполним пост-запрос для загрузки файла.

upload_response = requests.post(upload_endpoint,
                        headers=headers,
                        data=read_file(filename))
Вход в полноэкранный режим Выход из полноэкранного режима

Мы можем распечатать ответ, чтобы посмотреть, какой ответ мы получим.

print(upload_response.json())
Вход в полноэкранный режим Выход из полноэкранного режима

На выходе мы получаем url-адрес загрузки, где находится аудиофайл после загрузки

Транскрибирование аудио

Следующим нашим шагом будет транскрибирование загруженного аудио.
Давайте создадим переменную ‘transcript_endpoint’. Этой переменной мы присвоим конечную точку транскрипции.

transcript_endpoint = "https://api.assemblyai.com/v2/transcript"
Вход в полноэкранный режим Выход из полноэкранного режима

Конечная точка транскрипции такая же, как и конечная точка загрузки, только она заканчивается на ‘transcript’, а конечная точка загрузки — на ‘upload’.

Далее, давайте извлечем url аудио из ответа, который мы получили при загрузке аудио.

audio_url = upload_response.json()['upload_url']
Вход в полноэкранный режим Выход из полноэкранного режима

Теперь создадим json-файл, содержащий url аудиозаписи.

json = { "audio_url": audio_url}
Войти в полноэкранный режим Выйдите из полноэкранного режима

Затем отправим аудиозапись на расшифровку

transcript_response = requests.post(transcript_endpoint, json=json, headers=headers)
Войти в полноэкранный режим Выйти из полноэкранного режима

Распечатайте ответ.

print(transcript_response())
Войти в полноэкранный режим Выйти из полноэкранного режима

Ниже приведен ответ, но только часть информации, а не вся.

{ ‘id’: ‘ongvqhtbo7-ad52-4272-b695-d7c624b7c2b5’, ‘language_model’: ‘assemblyai_default’, ‘acoustic_model’: ‘assemblyai_default’, ‘language_code’: ‘en_us’, ‘status’: ‘queued’}.

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

Наш главный интерес из ответа — это ‘id’, мы будем использовать его, чтобы спросить AssemblyAI, готова ли работа по расшифровке или нет.

Опрос

В довольно простом определении, опрос относится к постоянной проверке ресурса, чтобы узнать, в каком состоянии он находится.

Сейчас мы напишем код для опроса AssemblyAI. Мы будем использовать этот код для постоянной проверки состояния задания транскрипции, чтобы знать, готова транскрипция или нет.

Первое, что мы сделаем, это получим ‘id’ из ответа.

job_id = transcript_response.json()['id']
Вход в полноэкранный режим Выйти из полноэкранного режима

Получив идентификатор задания, создадим конечную точку опроса и отправим запрос get.

polling_endpoint = transcript_endpoint + '/' + job_id # creating a polling endpoint
polling_response = requests.get(polling_endpoint, headers=headers) # get request
Вход в полноэкранный режим Выход из полноэкранного режима

Давайте напечатаем ответ на опрос.

print(polling_response.json())
Вход в полноэкранный режим Выход из полноэкранного режима

Как и в ответе транскрипта, в этом ответе также содержится много информации.
Ниже приведен ответ, но только часть информации, а не вся.

{‘id’: ‘onse9tjyxv-4164-439c-b19c-ee92ae95a7c1’, ‘language_model’: ‘assemblyai_default’, ‘acoustic_model’: ‘assemblyai_default’, ‘language_code’: ‘en_us’, ‘status’: ‘processing’}.

Для этого ответа нас интересует статус. Если транскрипция еще не готова, статус будет означать «обработка», в противном случае он будет означать «завершено».
Из приведенного выше ответа видно, что статус указывает на ‘processing’, что означает, что транскрипция еще не готова.

Давайте теперь создадим цикл while, который будет продолжать опрашивать AssemblyAI до тех пор, пока статус не покажет «завершено».

while True:
    polling_response = requests.get(polling_endpoint, headers=headers)
    if polling_response.json()['status'] == 'processing':
        print('Still processing')
    elif polling_response.json()['status'] == 'error':
        print('error')
    elif polling_response.json()['status'] == 'completed':
        print('completed')
        break
Вход в полноэкранный режим Выход из полноэкранного режима

Вот результат цикла while. Как мы видим, с помощью цикла while мы продолжаем опрашивать до тех пор, пока статус не покажет «завершено».

Все еще обрабатывается
Все еще обрабатывается
Все еще обработка
Все еще обрабатывается
завершено

С указанием статуса «завершена» давайте теперь напечатаем ответ на опрос.

print(polling_response.json())
Вход в полноэкранный режим Выход из полноэкранного режима

Ниже приведен ответ, но с небольшой частью информации.

{‘id’: ‘onsx3yoyc6-aaa9-472e-b8fa-e3cc10e0432f’, ‘language_model’: ‘assemblyai_default’, ‘acoustic_model’: ‘assemblyai_default’, ‘language_code’: ‘en_us’, ‘status’: ‘completed’, ‘text’: ‘Как вам работается с Python?’, ‘words’: [{‘text’: ‘Как’, ‘start’: 730, ‘end’: 822, ‘confidence’: 0.38754, ‘speaker’: Нет},

Основное внимание в ответе мы уделили «тексту», потому что он содержит расшифровку. Из ответа мы видим, что наша расшифровка звучит так: «Как вам работается с Python?».

Теперь, когда у нас есть стенограмма, давайте сохраним ее.

Сохранение стенограммы

Теперь мы запишем стенограмму в текстовый файл, а затем выведем ‘File succesfully saved!’, чтобы подтвердить, что файл был сохранен.
Текстовый файл будет сохранен в рабочем каталоге.

response = polling_response.json()
with open ('transcript.txt', 'w') as f:
    f.write(response['text'])
print('File succesfully saved!')
Вход в полноэкранный режим Выход из полноэкранного режима

Заключение

В этой статье мы узнали, как расшифровать аудиофайл, и рассмотрели все шаги, которые необходимо выполнить при расшифровке аудио.
Помимо AssemblyAI, существуют и другие платформы, такие как Deepgram, которые можно использовать для преобразования речи в текст.

Кредиты

Как транскрибировать аудиофайлы с помощью python(AssemblyAI)

Оцените статью
devanswers.ru
Добавить комментарий