Инфраструктура, Искусственный интеллект, Технологии, Новости и обновления

Как расшифровать подкаст: используем Whisper от OpenAI

Поделиться:

Как расшифровать подкаст: используем Whisper от OpenAI


Ознакомьтесь с этой статьей, если хотите узнать больше об AI Endpoints.
Вы также можете найти больше информации об AI Endpoints в наших предыдущих публикациях.

В этой статье объясняется, как создать транскрипцию подкаста с помощью Whisper — мощной системы автоматического распознавания речи (ASR), разработанной OpenAI. Whisper интегрируется с AI Endpoints и упрощает транскрибирование аудиофайлов, а также добавление таких функций, как диаризация говорящих.

ℹ️ Полный код можно найти на Github ℹ️

Настройка окружения

Определите переменные окружения для доступа к AI Endpoints:

$ export OVH_AI_ENDPOINTS_WHISPER_URL=<URL модели whisper>
$ export OVH_AI_ENDPOINTS_ACCESS_TOKEN=<ваш_токен_доступа>
$ export OVH_AI_ENDPOINTS_WHISPER_MODEL=whisper-large-v3

Установите зависимости:

$ pip install -r requirements.txt

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

С Whisper и клиентом OpenAI транскрибирование аудио так же просто, как написание нескольких строк кода:

import os
import json
from openai import OpenAI

# 🛠️ Инициализация клиента OpenAI
client = OpenAI(base_url=os.environ.get('OVH_AI_ENDPOINTS_WHISPER_URL'), 
                api_key=os.environ.get('OVH_AI_ENDPOINTS_ACCESS_TOKEN'))

# 🎼 Загрузка аудиофайла
with open("../resources/TdT20-trimed-2.mp3", "rb") as audio_file:
    # 📝 Вызов API транскрибирования Whisper
    transcript = client.audio.transcriptions.create(
        model=os.environ.get('OVH_AI_ENDPOINTS_WHISPER_MODEL'),
        file=audio_file,
        temperature=0.0,
        response_format="verbose_json",
        extra_body={"diarize": True},
    )

К сведению:
– мы используем параметр 'diarize' (не параметр Whisper) для включения диаризации, так как клиент OpenAI позволяет нам добавлять дополнительные параметры тела запроса.
– вам нужен формат verbose_json для диаризации (что также означает режим сегментации)

После получения полной транскрипции отформатируйте её так, чтобы её было легко читать людям.

Создание скрипта

JSON-поле 'diarization' содержит весь транскрибированный, диаризованный контент.

"diarization": [
    {
      "speaker": 0,
      "text": "бла бла бла",
      "start": 16.5,
      "end": 26.38
    },
    {
      "speaker": 1,
      "text": "бла бла",
      "start": 26.38,
      "end": 32.6
    },
    {
      "speaker": 1,
      "text": "бла бла",
      "start": 32.6,
      "end": 40.6
    },
    {
      "speaker": 2,
      "text": "бла бла",
      "start": 40.6,
      "end": 42
    }
]

Поскольку они сегментированы, вы можете объединить несколько полей для одного и того же говорящего, как показано ниже — для говорящего 1.

Вот пример кода для создания скрипта французского подкаста с участием 3 говорящих:

# 🔀 Объединение диалога, произнесённого одним говорящим     
diarizedTranscript = ''
speakers = ["Орели", "Гийом", "Стефан"]
previousSpeaker = -1
jsonTranscript = json.loads(transcript.model_dump_json())

# 💬 Полезно только поле diarization
for dialog in jsonTranscript["diarization"]:
    speaker = dialog.get("speaker")
    text = dialog.get("text")
    if (previousSpeaker == speaker):
        diarizedTranscript += f" {text}"
    else:
        diarizedTranscript += f"nn{speakers[speaker]}: {text}"
    previousSpeaker = speaker

print(f"n📝 Диаризованная транскрипция 📝:n{diarizedTranscript}")

Наконец, запустите Python-скрипт:

$ python PodcastTranscriptWithWhisper.py

📝 Диаризованная транскрипция 📝:

Стефан: Здравствуйте всем, рад снова встретиться с вами для записи этого последнего эпизода сезона перед тем, как взять заслуженный отпуск и встретиться с вами в начале следующего сезона для третьего сезона. Мы записываем этот эпизод 30 июня в прохладе, ну если можно так сказать, учитывая температуры, которые уже присутствуют этим утром. Кстати, она горячо возвращается с Sunnytech, и я с удовольствием встречаюсь с ней для записи этого эпизода. Здравствуй, Орели, как дела?

Орели: Привет, всё отлично. Признаюсь, мне тоже очень жарко. У меня вентилятор прямо рядом со мной, так что всё будет в порядке для записи подкаста.

Стефан: Да, правда жарко. И для этого последнего эпизода сезона я с радостью, но также с некоторым трепетом принимаю нашего гостя. Если я делаю эту работу так, как я её делаю, это во многом благодаря ему. Этот подкаст, в некотором смысле, имеет вдохновение от того, что делает наш гость. Поэтому я очень рад принять тебя, Гийом. Здравствуй, Гийом, как дела и не хочешь ли ты представиться нашим слушательницам и слушателям? Здравствуйте

Гийом: всем, и спасибо, что пригласили меня. Я очень рад присоединиться к вашему подкасту для этого эпизода. Меня зовут Гийом Лафорж, я Java-разработчик с самого начала, уже очень-очень давно. Я работаю в Google, в частности в Google Cloud. Я много фокусируюсь на всём, что связано с Generative AI, так как это, очевидно, в моде. Люди могут меня знать или, возможно, мой голос, потому что я являюсь частью подкаста Les Cascodeurs, который мы начали 15 лет назад или что-то вроде того. Слишком давно. Или же они меня знают, потому что я один из соучредителей языка Groovy, Apache Groovy.

Не стесняйтесь попробовать наш новый продукт, AI Endpoints, и поделитесь своими впечатлениями.

Как расшифровать подкаст: используем Whisper от OpenAI