Что такое распознавание речи
Распознавание речи (также известное как автоматическое распознавание речи или преобразование речи в текст) — это область, возникшая на стыке информатики и компьютерной лингвистики. Она разрабатывает технологии, позволяющие компьютерным системам обрабатывать человеческую речь и преобразовывать ее в текстовый формат. Другими словами, методики и инструменты распознавания речи используются для перевода речи из вербального формата в текстовый.
Наиболее эффективные алгоритмы, применяемые при распознавании речи, используют методы и концепции из областей искусственного интеллекта и машинного обучения. Большинство этих алгоритмов со временем совершенствуются, поскольку способны повышать свои возможности и производительность за счет взаимодействия.
Приложения для распознавания речи нашли применение во многих отраслях промышленности и помогают пользователям, потребителям и предприятиям быть более эффективными. Например, с помощью таких виртуальных помощников, как Siri от Apple, Alexa от Amazon и Google Ассистент, можно получить доступ к определенным функциям через голосовые команды. Помимо этого, распознавание речи применяется в сферах здравоохранения и безопасности, а также в автомобильной индустрии.
В связи с растущим спросом на технологии распознавания речи, эта область получила большое развитие, что облегчает разработчикам и организациям ее внедрение. В следующих разделах рассмотрим, как выполнить распознавание речи с помощью Python и API AssemblyAI всего в несколько строк кода.
Преобразование речи в текст с использованием API AssemblyAI
AssemblyAI предлагает мощный API преобразования речи в текст. Он работает на базе передового искусственного интеллекта и позволяет пользователю точно расшифровывать аудио- и видеофайлы. В данном руководстве будем использовать этот интерфейс для выполнения распознавания речи из аудиофайла в формате mp3.
Все, что вам нужно, чтобы следовать этому руководству, — это ключ API. Его можно получить путем создания бесплатной учетной записи AssemblyAI. Как только вы зарегистрируетесь, ваш ключ будет виден в разделе Account.
Для этого урока я подготовил короткий аудиофайл (приведенный ниже). Вы можете создавать свои собственные или использовать созданные мной файлы. Тестовый аудиофайл, который будет использован в этом руководстве. Источник.
Теперь приступаем к использованию библиотеки requests
для вызова API AssemblyAI, для чего понадобится полученный вами ключ API, а также заголовки, определенные ниже.
import requests
API_KEY = <сюда вводится ваш ключ AssemblyAI API>
# Создание заголовков для запроса
headers = {
'authorization': API_KEY,
'content-type': 'application/json'
}
Следующий шаг — чтение файла и загрузка его на хостинг AssemblyAI для получения ссылки, которая понадобится для расшифровки аудиозаписи.
AUDIO_FILE = '/path/to/your/audio/file.mp3'
UPLOAD_ENDPOINT = 'https://api.assemblyai.com/v2/upload'
def read_audio_file(file):
"""Метод-помощник, считывающий аудиофайлы"""
with open(file, 'rb') as f:
while True:
data = f.read(5242880)
if not data:
break
yield data
res_upload = requests.post(
UPLOAD_ENDPOINT,
headers=headers,
data=read_audio_file(AUDIO_FILE)
)
upload_url = res_upload.json()['upload_url']
"""
Пример ответа от конечной точки загрузки AssemblyAI
pprint(res_upload.json())
{'upload_url': 'https://cdn.assemblyai.com/upload/b017e8c0-b31a-4d09-9dc2-8dee0ee0d3c8'}
"""
Теперь, после успешной загрузки аудиофайла на хостинг AssemblyAI, можно перейти к отправке URL-адреса, полученного на предыдущем шаге, на конечную точку транскрипции AssemblyAI. Пример ответа от конечной точки показан в комментариях в конце Gist.
TRANSCRIPT_ENDPOINT = 'https://api.assemblyai.com/v2/transcript'
res_transcript = requests.post(
TRANSCRIPT_ENDPOINT,
headers=headers,
json={'audio_url': upload_url},
)
res_transcript_json = res_transcript.json()
"""
Пример ответа от конечной точки расшифровки
print(res_transcript_json)
{
'id': 'w9w13r544-8459-4b06-8d7a-1e9accee4b61',
'language_model': 'assemblyai_default',
'acoustic_model': 'assemblyai_default',
'language_code': 'en_us',
'status': 'queued',
'audio_url': 'https://cdn.assemblyai.com/upload/4eb47686-249d-4d48-9b79-62aea715d735',
'text': None,
'words': None,
'utterances': None,
'confidence': None,
'audio_duration': None,
'punctuate': True,
'format_text': True,
'dual_channel': None,
'webhook_url': None,
'webhook_status_code': None,
'speed_boost': False,
'auto_highlights_result': None,
'auto_highlights': False,
'audio_start_from': None,
'audio_end_at': None,
'word_boost': [],
'boost_param': None,
'filter_profanity': False,
'redact_pii': False,
'redact_pii_audio': False,
'redact_pii_audio_quality': None,
'redact_pii_policies': None,
'redact_pii_sub': None,
'speaker_labels': False,
'content_safety': False,
'iab_categories': False,
'content_safety_labels': {},
'iab_categories_result': {}
}
"""
Наконец, можно получить доступ к результату транскрипции, указав ID расшифровки, полученный в ответе от конечной точки расшифровки на предыдущем шаге. Обратите внимание, что необходимо делать повторные GET
-запросы до тех пор, пока статус в ответе не станет либо completed
, либо error
, если аудиофайл не удастся обработать.
Пример ответа от конечной точки расшифровки, полученного при успешном завершении, приведен ниже в качестве комментария в конце Gist.
import os
import sys
from time import sleep
status = ''
while status != 'completed':
res_result = requests.get(
os.path.join(TRANSCRIPT_ENDPOINT, res_transcript_json['id']),
headers=headers
)
status = res_result.json()['status']
print(f'Status: {status}')
if status == 'error':
sys.exit('Audio file failed to process.')
elif status != 'completed':
sleep(10)
"""
Пример ответа от конечной точки расшифровки после успешного завершения
{
'acoustic_model': 'assemblyai_default',
'audio_duration': 11,
'audio_end_at': None,
'audio_start_from': None,
'audio_url': 'https://cdn.assemblyai.com/upload/b017e8c0-b31a-4d09-9dc2-8dee0ee0d3c8',
'auto_highlights': False,
'auto_highlights_result': None,
'boost_param': None,
'confidence': 0.80822375,
'content_safety': False,
'content_safety_labels': {
'results': [],
'status': 'unavailable',
'summary': {}
},
'dual_channel': None,
'filter_profanity': False,
'format_text': True,
'iab_categories': False,
'iab_categories_result': {
'results': [],
'status': 'unavailable',
'summary': {}
},
'id': '5eszwu5pv-99c1-4f9f-b825-ffc44acb50a5',
'language_code': 'en_us',
'language_model': 'assemblyai_default',
'punctuate': True,
'redact_pii': False,
'redact_pii_audio': False,
'redact_pii_audio_quality': None,
'redact_pii_policies': None,
'redact_pii_sub': None,
'speaker_labels': False,
'speed_boost': False,
'status': 'completed',
'text': 'You know, demons on TV like that. And for people to expose '
'themselves to being rejected on TV or humiliated by fear factor or.',
'utterances': None,
'webhook_status_code': None,
'webhook_url': None,
'word_boost': [],
'words': [
{
'confidence': 0.86681,
'end': 1140,
'speaker': None,
'start': 1090,
'text': 'You'
},
{
'confidence': 0.68773,
'end': 1200,
'speaker': None,
'start': 1150,
'text': 'know,'
},
{
'confidence': 0.22389,
'end': 2050,
'speaker': None,
'start': 1750,
'text': 'demons'
},
{
'confidence': 0.61079,
'end': 2220,
'speaker': None,
'start': 2170,
'text': 'on'
},
{
'confidence': 0.97529,
'end': 2470,
'speaker': None,
'start': 2410,
'text': 'TV'
},
{
'confidence': 0.99821,
'end': 2760,
'speaker': None,
'start': 2710,
'text': 'like'
},
{
'confidence': 0.84939,
'end': 3060,
'speaker': None,
'start': 3010,
'text': 'that.'
},
{
'confidence': 0.87296,
'end': 3420,
'speaker': None,
'start': 3370,
'text': 'And'
},
{
'confidence': 0.98954,
'end': 4440,
'speaker': None,
'start': 4390,
'text': 'for'
},
{
'confidence': 0.99979,
'end': 4680,
'speaker': None,
'start': 4630,
'text': 'people'
},
{
'confidence': 0.99812,
'end': 4980,
'speaker': None,
'start': 4930,
'text': 'to'
},
{
'confidence': 0.99877,
'end': 5350,
'speaker': None,
'start': 5110,
'text': 'expose'
},
{
'confidence': 0.99862,
'end': 5640,
'speaker': None,
'start': 5590,
'text': 'themselves'
},
{
'confidence': 0.99799,
'end': 6180,
'speaker': None,
'start': 6130,
'text': 'to'
},
{
'confidence': 0.91051,
'end': 6300,
'speaker': None,
'start': 6250,
'text': 'being'
},
{
'confidence': 0.97299,
'end': 6970,
'speaker': None,
'start': 6550,
'text': 'rejected'
},
{
'confidence': 0.9854,
'end': 7200,
'speaker': None,
'start': 7150,
'text': 'on'
},
{
'confidence': 0.71539,
'end': 7450,
'speaker': None,
'start': 7330,
'text': 'TV'
},
{
'confidence': 0.75286,
'end': 7860,
'speaker': None,
'start': 7810,
'text': 'or'
},
{
'confidence': 0.61332,
'end': 8650,
'speaker': None,
'start': 8230,
'text': 'humiliated'
},
{
'confidence': 0.76878,
'end': 9540,
'speaker': None,
'start': 9490,
'text': 'by'
},
{
'confidence': 0.54277,
'end': 9850,
'speaker': None,
'start': 9730,
'text': 'fear'
},
{
'confidence': 0.44984,
'end': 10330,
'speaker': None,
'start': 10030,
'text': 'factor'
},
{
'confidence': 0.61761,
'end': 10620,
'speaker': None,
'start': 10570,
'text': 'or.'
}
]
}
"""
Наконец, при условии, что обработка файла завершилась успешно, можно записать окончательный ответ в текстовый файл.
OUTPUT_TRANSCRIPT_FILE = 'speech-to-text-tutorial.txt'
with open(OUTPUT_TRANSCRIPT_FILE, 'w') as f:
f.write(res_result.json()['text'])
print(f'Transcript file saved under {OUTPUT_TRANSCRIPT_FILE}')
Для данного примера аудиофайла вывод, полученный из API преобразования речи в текст AssemblyAI и записанный в выходной текстовый файл, будет следующим:
You know, demons on TV like that. And for people to expose themselves to being rejected on TV or humiliated by fear factor or.
Довольно точно!
Полный код
Полный код, необходимый для использования API Speech-to-Text AssemblyAI, можно найти ниже. Вкратце говоря, код загружает аудиофайл из локальной системы на хостинг AssemblyAI, а затем отправляет его в сервис транскрипции, который выполняет задачу преобразования речи в текст. В завершение происходит обработка выходного ответа и сохранение его в текстовом файле в локальной файловой системе.
import os
import sys
import requests
from time import sleep
from pprint import pprint
API_KEY = '<сюда вводится ваш ключ AssemblyAI API>'
AUDIO_FILE = '/path/to/your/audio/file.mp3'
UPLOAD_ENDPOINT = 'https://api.assemblyai.com/v2/upload'
TRANSCRIPT_ENDPOINT = 'https://api.assemblyai.com/v2/transcript'
OUTPUT_TRANSCRIPT_FILE = 'speech-to-text-tutorial.txt'
def read_audio_file(file):
"""Метод-помощник, считывающий аудиофайлы"""
with open(file, 'rb') as f:
while True:
data = f.read(5242880)
if not data:
break
yield data
headers = {
'authorization': API_KEY,
'content-type': 'application/json'
}
res_upload = requests.post(
UPLOAD_ENDPOINT,
headers=headers,
data=read_audio_file(AUDIO_FILE)
)
pprint(res_upload.json())
upload_url = res_upload.json()['upload_url']
res_transcript = requests.post(
TRANSCRIPT_ENDPOINT,
headers=headers,
json={'audio_url': upload_url},
)
res_transcript_json = res_transcript.json()
pprint(res_transcript_json)
status = ''
while status != 'completed':
res_result = requests.get(
os.path.join(TRANSCRIPT_ENDPOINT, res_transcript_json['id']),
headers=headers
)
status = res_result.json()['status']
print(f'Status: {status}')
if status == 'error':
sys.exit('Audio file failed to process.')
elif status != 'completed':
sleep(10)
pprint(res_result.json())
with open(OUTPUT_TRANSCRIPT_FILE, 'w') as f:
f.write(res_result.json()['text'])
print(f'Transcript file saved under {OUTPUT_TRANSCRIPT_FILE}')
Обратите внимание, что в этом руководстве я загрузил локальный файл в службу хостинга AssemblyAI, но вы можете отправить URL-адрес аудио из любого облачного сервиса, такого как AWS. Для получения более подробной информации и примеров обратитесь к этому разделу официальной документации AssemblyAI.
Вывод
Распознавание речи — это быстро развивающаяся область, которая значительно выиграла благодаря впечатляющему прогрессу в области машинного обучения, искусственного интеллекта и обработки естественного языка. В связи с растущим спросом на приложения для преобразования речи в текст было предоставлено огромное разнообразие инструментов, обеспечивающих быстрый доступ к таким технологиям.
Теперь вы знаете, как быстро выполнить распознавание речи на Python с помощью всего нескольких строк кода, применяя AssemblyAI — мощный API, используемый тысячами организаций по всему миру. API предлагает широкий спектр функций, не все из которых были рассмотрены в этой статье. Но вы можете изучить их здесь.
Читайте также:
- Как создать Telegram бота с помощью Python
- Python + Selenium: как получить координаты по адресам
- Хитрости на Python
Читайте нас в Telegram, VK и Яндекс.Дзен
Перевод статьи Giorgos Myrianthous: How to Perform Speech Recognition with Python