Работа с аудио. Распознавание и генерация. 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