Работа с аудио. Распознавание и генерация. OpenAI
В OpenAI представлена Audio API, которая позволяет генерировать аудио из текста и распознавать его.
Для самых нетерпеливых, вот ссылка на полноценный Colab.
Генерация аудио
Для генерации аудио представлено 6 разных голосов, каждый из которых можно прослушать на основной странице документации.
Метод client.audio.speech.create на вход принимает 3 основных обязательных параметра:
model— модель, которую использовать. Возможны 2 значения:tts-1иtts-1-hd. Для приложений реального времени стандартная модельtts-1обеспечивает минимальную задержку, но более низкое качество, чем модельtts-1-hd. Из-за способа генерации звукаtts-1, скорее всего, будет генерировать контент, который в определенных ситуациях будет более статичным, чемtts-1-hd. В некоторых случаях звук может не иметь заметных различий в зависимости от вашего устройства прослушивания и конкретного человека.voice— голос, которым озвучивать. Возможны значения:alloy,echo,fable,onyx,nova, иshimmer. На сайте документации можно ознакомиться с каждым звучанием.input— текст, который необходимо озвучить.
Все голоса обычно больше оптимизированы под английский язык. Но OpenAI поддерживает также и следующие языки: Африканский, арабский, армянский, азербайджанский, белорусский, боснийский, болгарский, каталанский, китайский, хорватский, чешский, датский, голландский, английский, эстонский, финский, французский, галисийский, немецкий, греческий, иврит, хинди, венгерский, исландский, индонезийский, Итальянский, японский, каннада, казахский, корейский, латвийский, литовский, македонский, малайский, маратхи, маори, непальский, норвежский, персидский, польский, португальский, румынский, русский, сербский, словацкий, словенский, испанский, суахили, шведский, тагальский, Тамильский, тайский, турецкий, украинский, урду, вьетнамский и валлийский.
Вот базовый пример кода для генерации аудио:
response = client.audio.speech.create(
model="tts-1",
voice="alloy",
input="Привет! Это аудио сгенерировано с помощью OpenAI. Теперь и Вы можете генерировать любое аудио и любой текст будет озвучен!",
)
response.stream_to_file("/content/output-001.mp3")Здесь мы генерируем аудио и сразу записываем его в файл.
Пробуем аудио более высокого качества (модель tts-1-hd)
response = client.audio.speech.create(
model="tts-1-hd",
voice="nova",
input="Шла Саша по шоссе и сосала сушку.",
)
response.stream_to_file("/content/output-002.mp3")Формат аудио по умолчанию — «mp3», но доступны и другие форматы, такие как «opus», «aac» или «flac».
Opus: Для потоковой передачи через Интернет и общения, низкая задержка.AAC: для сжатия цифрового звука, предпочтительного для YouTube, Android, iOS.FLAC: для сжатия звука без потерь, предпочитаемый аудиоэнтузиастами для архивирования.
Чтобы сгенерировать аудио другого формата, передаём параметр response_format:
response = client.audio.speech.create(
model="tts-1-hd",
voice="shimmer",
input="Карл украл у Клары кораллы. А Клара у Карла - кларнет.",
response_format="opus",
)
response.stream_to_file("/content/output-004.opus")Также, если вам необходимо управлять скоростью воспроизведения аудио: сделать медленной или наоборот быстрее, то есть параметр speed. Данный параметр принимает значения от 0.25 до 4.0.
response = client.audio.speech.create(
model="tts-1-hd",
voice="shimmer",
input="Карл украл у Клары кораллы. А Клара у Карла - кларнет.",
speed=0.7,
)
response.stream_to_file("/content/output-005.mp3")Выше мы разобрали основные моменты генерации аудио из текста. Теперь можем рассмотреть обратный процесс — распознавание аудио и преобразование его в текст.
Распознавание аудио
Основная документация расположена по ссылке здесь.
Аудио API предоставляет две функции преобразования речи в текст: транскрипцию и перевод, основанные на современной модели Whisper large-v2 с открытым исходным кодом.
Они могут использоваться, чтобы:
- Расшифровать аудио на любой язык, на котором оно представлено.
- Перевести и расшифровать аудио на английский язык.
Загрузка файлов в настоящее время ограничена 25 МБ, поддерживаются следующие типы входных файлов: mp3, mp4, mpeg, mpga, m4a, wav и webm.
Расшифровка аудио
Возьмём предыдущий сгенерированный файл для фразы "Карл украл у Клары кораллы. А Клара у Карла - кларнет." и переведём его обратно в текст:
audio_file= open("/content/output-003.mp3", "rb")
transcript = client.audio.transcriptions.create(
model="whisper-1",
file=audio_file,
)
print(transcript)
И на выходе получаем (барабанная дробь...) не совсем корректную расшифровку:
Transcription(text='Karalukraluklarikarali aklarukarliklarinit.')
Как видим получилось не совсем то, что нам нужно было. Давайте добавим язык в параметры, чтобы он понимал, что нам нужен именно русский язык:
audio_file= open("/content/output-003.mp3", "rb")
transcript = client.audio.transcriptions.create(
model="whisper-1",
file=audio_file,
language="ru",
)
print(transcript)Transcription(text='Каролукралукларакарали Аклараукарлакларнет')
Что ж, как видим, уже стало чуть чуть лучше :) Но результат не совсем тот, что мы ожидали. Давайте теперь попробуем расшифровать ту же самую фразу, но только ту, что была записана с замедлением (где мы указывали параметр speed=0.7 при генерации).
audio_file= open("/content/output-005.mp3", "rb")
transcript = client.audio.transcriptions.create(
model="whisper-1",
file=audio_file,
language="ru",
)
print(transcript)Transcription(text='Карл украл у Клары кораллы, а Клара у Карла кларнет.')
Что ж, как видим из результата, что некоторые фразы он не может распознать, если их не замедлить.
Хотя другие фразы распознаёт хорошо. Я возьму другие сгенерированные аудио и подам ему на вход. Эти аудио с обычной скоростью. Без замедления.
audio_file= open("/content/output-001.mp3", "rb")
transcript = client.audio.transcriptions.create(
model="whisper-1",
file=audio_file,
language="ru",
)
print(transcript)Transcription(text='Привет, это аудио сгенерировано с помощью OpenAI. Теперь и вы можете генерировать любое аудио, и любой текст будет озвучен.')
Ещё результат расшифровки можно получать обычным текстом, без JSON. Для этого есть параметр response_format="text":
audio_file= open("/content/output-002.mp3", "rb")
transcript = client.audio.transcriptions.create(
model="whisper-1",
file=audio_file,
language="ru",
response_format="text",
)
print(transcript)Шла Саша по шоссе и сосала сушку.
Как видим из результатов выше, OpenAI не всегда может корректно расшифровать аудио. Если человек говорит очень быстро или быструю скороговорку, скорее всего предварительно придётся обработать запись и замедлить её на всякий случай. Но в большинстве своём отрабатывает хорошо.
Что касается генерации аудио, то тут нареканий нет. Работает отлично. Проблем с генерацией у меня не возникало.
Расшифровка и перевод
Как и говорилось выше. OpenAI API ещё умеет взять аудио, расшифровать и перевести на английский язык текст.
Давайте перейдём к примеру кода, откуда сразу всё станет понятно:
audio_file= open("/content/output-002.mp3", "rb")
translation = client.audio.translations.create(
model="whisper-1",
file=audio_file
)
print(translation)Translation(text='Sasha was walking down the road, sucking a dried fruit.')
Как видим на вход подаём аудио файл и указываем модель, которую используем. На выходе получаем текст распознанный и переведённый на английский язык.
Что касается скороговорок, то результат аналогичный как с расшифровкой. Замедленное аудио распознаётся лучше, чем на обычной скорости.
# Замедленная скорость
audio_file= open("/content/output-005.mp3", "rb")
translation = client.audio.translations.create(
model="whisper-1",
file=audio_file
)
print(translation)Translation(text='Karl stole from Klara Karala, and Klara stole from Karla Klarnet.')
# Обычная скорость
audio_file= open("/content/output-003.mp3", "rb")
translation = client.audio.translations.create(
model="whisper-1",
file=audio_file
)
print(translation)Translation(text='Karalukraluklarikarali. Aklarukarliklarinit.')
Аналогичный вывод, что нужна предварительная обработка с замедлением.
На это всё :) Подписывайтесь и следите за обновлениями) Дальше будет интереснее!
- https://platform.openai.com/docs/guides/speech-to-text
- https://platform.openai.com/docs/guides/text-to-speech
- https://colab.research.google.com/drive/14Efcmy42PKBn3uyrl5WW5uXucuqqoQxr?usp=sharing