AI
February 28

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

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

На это всё :) Подписывайтесь и следите за обновлениями) Дальше будет интереснее!


Используемые ссылки: