메인 콘텐츠로 건너뛰기
이 노트북은 인터랙티브 노트북입니다. 로컬에서 실행하거나 아래 링크를 사용할 수 있습니다:

오디오 데이터에 Weave 사용하기: OpenAI 예제

이 데모에서는 OpenAI chat completions API와 GPT 4o Audio Preview를 사용하여 텍스트 프롬프트에 대한 오디오 응답을 생성하고 이를 Weave에서 추적하는 방법을 보여줍니다. 심화 유스 케이스로는 OpenAI Realtime API를 활용하여 실시간으로 오디오를 스트리밍합니다. 비디오 데모를 보려면 다음 썸네일을 클릭하거나 여기를 클릭하세요. Everything Is AWESOME

설정

먼저 OpenAI (openai)와 Weave (weave) 종속성, 그리고 API 키 관리를 위한 set-env를 설치합니다.
%%capture
!pip install openai
!pip install weave
!pip install set-env-colab-kaggle-dotenv -q # 환경 변수 설정을 위해 사용
python
%%capture
# openai의 버그를 해결하기 위한 임시 우회책:
# TypeError: Client.__init__() got an unexpected keyword argument 'proxies'
# 참고: https://community.openai.com/t/error-with-openai-1-56-0-client-init-got-an-unexpected-keyword-argument-proxies/1040332/15
!pip install "httpx<0.28"
다음으로 OpenAI와 Weave에 필요한 API 키를 로드합니다. 여기서는 Google Colab의 secret keys manager와 호환되는 set_env를 사용하며, 이는 Colab 전용인 google.colab.userdata를 대체할 수 있는 대안입니다. 사용법은 여기를 참조하세요.
# 환경 변수 설정
from set_env import set_env

_ = set_env("OPENAI_API_KEY")
_ = set_env("WANDB_API_KEY")
마지막으로 필요한 라이브러리를 임포트합니다.
import base64
import os
import time
import wave

import numpy as np
from IPython.display import display
from openai import OpenAI

import weave

오디오 스트리밍 및 저장 예제

이제 오디오 모달리티가 활성화된 OpenAI completions 엔드포인트 호출을 설정하겠습니다. 먼저 OpenAI 클라이언트를 생성하고 Weave 프로젝트를 시작합니다.
client = OpenAI(api_key=os.environ.get("OPENAI_API_KEY"))
weave.init("openai-audio-chat")
이제 OpenAI completions 요청을 정의하고 Weave 데코레이터(op)를 추가하겠습니다. 여기서는 prompt_endpont_and_log_trace 함수를 정의합니다. 이 함수는 세 가지 주요 단계로 구성됩니다:
  1. 텍스트 및 오디오 입출력을 지원하는 GPT 4o Audio Preview 모델을 사용하여 completion 오브젝트를 생성합니다.
    • 모델이 다양한 억양으로 천천히 13까지 세도록 프롬프트를 작성합니다.
    • completion을 “stream”으로 설정합니다.
  2. 스트리밍된 데이터가 청크별로 기록될 새로운 출력 파일을 엽니다.
  3. Weave가 trace에 오디오 데이터를 로그할 수 있도록 오디오 파일의 파일 핸들러를 반환합니다.
SAMPLE_RATE = 22050

@weave.op()
def prompt_endpoint_and_log_trace(system_prompt=None, user_prompt=None):
    if not system_prompt:
        system_prompt = "You're the fastest counter in the world"
    if not user_prompt:
        user_prompt = "Count to 13 super super slow, enunciate each number with a dramatic flair, changing up accents as you go along. British, French, German, Spanish, etc."
    # 오디오 모달리티를 사용한 OpenAI API 요청
    completion = client.chat.completions.create(
        model="gpt-4o-audio-preview",
        modalities=["text", "audio"],
        audio={"voice": "fable", "format": "pcm16"},
        stream=True,
        messages=[
            {"role": "system", "content": system_prompt},
            {"role": "user", "content": user_prompt},
        ],
    )

    # 쓰기용 wave 파일 열기
    with wave.open("./output.wav", "wb") as wav_file:
        wav_file.setnchannels(1)  # 모노
        wav_file.setsampwidth(2)  # 16-bit
        wav_file.setframerate(SAMPLE_RATE)  # 샘플 레이트 (필요시 조정)

        # API에서 스트리밍되는 청크를 순차적으로 기록
        for chunk in completion:
            if (
                hasattr(chunk, "choices")
                and chunk.choices is not None
                and len(chunk.choices) > 0
                and hasattr(chunk.choices[0].delta, "audio")
                and chunk.choices[0].delta.audio.get("data") is not None
            ):
                # base64 오디오 데이터 디코딩
                audio_data = base64.b64decode(chunk.choices[0].delta.audio.get("data"))

                # 현재 청크를 wave 파일에 기록
                wav_file.writeframes(audio_data)

    # Weave op에 파일 반환
    return wave.open("output.wav", "rb")

테스트

다음 셀을 실행하세요. 시스템 및 사용자 프롬프트와 출력 오디오가 Weave trace에 저장됩니다. 셀 실행 후, ”🍩” 이모지 옆의 링크를 클릭하여 trace를 확인하세요.
from IPython.display import Audio

# 오디오 스트림을 기록하는 함수 호출
prompt_endpoint_and_log_trace(
    system_prompt="You're the fastest counter in the world",
    user_prompt="Count to 13 super super slow, enunciate each number with a dramatic flair, changing up accents as you go along. British, French, German, Spanish, etc.",
)

# 업데이트된 오디오 스트림 재생
display(Audio("output.wav", rate=SAMPLE_RATE, autoplay=True))

심화 사용법: Weave와 함께 Realtime Audio API 사용하기