Skip to main content
이 노트북은 인터랙티브 노트북입니다. 로컬에서 실행하거나 아래 링크 중 하나를 사용하세요:

오디오 데이터와 함께 Weave를 사용하는 방법: OpenAI 예제

이 데모에서는 OpenAI Chat Completions API와 GPT 4o Audio Preview를 사용해 텍스트 프롬프트에 대한 오디오 응답을 생성하고, 이를 Weave에서 추적합니다. GPT 4o Audio Preview 인테그레이션과 오디오 응답 생성 워크플로우가 포함된 OpenAI Chat Completions API 인터페이스 고급 예제에서는 OpenAI Realtime API를 활용해 오디오를 실시간으로 스트리밍합니다. 다음 썸네일을 클릭해 동영상 데모를 보거나, 여기를 클릭하세요. Everything Is AWESOME

설정

먼저 OpenAI (openai)와 Weave (weave) 의존성을 설치하고, API 키 관리를 위한 set-env 의존성도 설치합니다.
다음으로 OpenAI와 Weave에 필요한 API 키를 로드합니다. 여기서는 Google Colab의 시크릿 키 관리자와 호환되는 set_env를 사용하며, Colab의 전용 google.colab.userdata를 대신할 수 있는 방법입니다. 사용 방법은 여기를 참고하세요.
마지막으로 필요한 라이브러리를 임포트합니다.

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

이제 오디오 모달리티를 활성화한 상태에서 OpenAI의 completions 엔드포인트를 호출하도록 설정해 보겠습니다. 먼저 OpenAI 클라이언트를 생성하고 Weave 프로젝트를 초기화합니다.
이제 OpenAI completions 요청을 정의하고 Weave 데코레이터(op)를 추가하겠습니다. 여기서는 함수 prompt_endpont_and_log_trace를 정의합니다. 이 함수는 세 가지 주요 단계로 구성됩니다:
  1. 텍스트와 오디오 입력/출력을 지원하는 GPT 4o Audio Preview 모델을 사용해 completion 객체를 만듭니다.
    • 모델에 다양한 억양으로 천천히 13까지 세도록 프롬프트를 제공합니다.
    • completion을 “stream”으로 설정합니다.
  2. 스트리밍된 데이터가 청크 단위로 기록될 새 출력 파일을 엽니다.
  3. 오디오 파일에 대한 열린 파일 핸들러를 반환하여 Weave가 트레이스에 오디오 데이터를 로그로 남기도록 합니다.

테스트

다음 셀을 실행하세요. 시스템 프롬프트와 사용자 프롬프트는 출력 오디오와 함께 Weave trace에 저장됩니다. 셀을 실행한 다음, 🍩 이모지 옆에 있는 링크를 클릭해 trace를 확인하세요.

고급 사용법: Weave와 함께 사용하는 Realtime Audio API

Weave와 Realtime Audio API 인테그레이션 및 스트리밍 오디오 대화 인터페이스 OpenAI의 realtime API는 실시간 오디오·텍스트 어시스턴트를 구축하기 위한 고기능·고신뢰 대화형 API입니다. 다음 사항을 유의하세요:
  • Microphone Configuration의 셀을 검토하세요.
  • Google Colab 실행 환경의 제한으로 인해 반드시 호스트 머신에서 Jupyter Notebook으로 실행해야 합니다. 브라우저에서는 실행할 수 없습니다.
    • MacOS에서는 Pyaudio가 동작하도록 Brew를 통해 portaudio를 설치해야 합니다(자세한 내용은 여기 참조).
  • enable_audio_playback 토글을 활성화하면 어시스턴트가 출력한 오디오가 재생됩니다. 이 옵션을 활성화한 경우 반드시 헤드폰을 사용해야 하며, 에코를 감지하려면 매우 복잡한 구현이 필요합니다.

필수 구성 요소 설정

마이크 설정

사용 가능한 모든 오디오 장치를 확인하려면 다음 셀을 실행하세요. 그런 다음 표시된 장치를 기준으로 INPUT_DEVICE_INDEXOUTPUT_DEVICE_INDEX 값을 설정하세요. 입력 장치는 입력 채널이 최소 1개 이상, 출력 장치는 출력 채널이 최소 1개 이상이어야 합니다.

OpenAI Realtime API 스키마 구현

OpenAI Python SDK는 아직 Realtime API를 지원하지 않습니다. 여기서는 가독성을 높이기 위해 전체 OAI Realtime API 스키마를 Pydantic으로 구현했으며, 공식 지원이 릴리스되면 이 구현은 더 이상 사용되지 않을 수 있습니다.

OpenAI Realtime API용 Pydantic 스키마

오디오 스트림 라이터 (디스크 및 메모리 기록)

실시간 오디오 모델

실시간(RT) 오디오 모델은 웹소켓을 사용해 OpenAI의 Realtime audio API로 이벤트를 전송합니다. 동작 방식은 다음과 같습니다.
  1. init: 로컬 버퍼(입력 오디오)와 스트림(assistant 응답 재생 스트림, 사용자 오디오를 디스크에 기록하는 스트림)을 초기화하고 Realtime API에 대한 연결을 엽니다.
  2. receive_messages_thread: 하나의 스레드가 API로부터 메시지를 수신하는 일을 처리합니다. 네 가지 주요 이벤트 유형을 처리합니다: - RESPONSE_AUDIO_TRANSCRIPT_DONE: 서버가 assistant 응답이 완료되었음을 알리고 전사본을 제공합니다.
    • CONVERSATION_ITEM_INPUT_AUDIO_TRANSCRIPTION_COMPLETED: 서버가 사용자의 오디오 전사가 완료되었음을 알리고, 사용자의 오디오 전사본을 전송합니다. 이 전사본을 Weave에 기록하고 사용자에게 출력합니다.
    • RESPONSE_AUDIO_DELTA: 서버가 새로운 assistant 응답 오디오 청크를 전송합니다. 이를 응답 ID를 기준으로 진행 중인 응답 데이터에 이어 붙이고, 재생을 위해 출력 스트림에 추가합니다.
    • RESPONSE_DONE: 서버가 assistant 응답이 완료되었음을 알립니다. 해당 응답과 연관된 모든 오디오 청크와 전사본을 가져와 Weave에 기록합니다.
    3.send_audio: 핸들러가 사용자 오디오 청크를 버퍼에 추가하고, 오디오 버퍼가 특정 크기에 도달하면 오디오 청크를 전송합니다.

오디오 레코더

RTAudio 모델의 send_audio 메서드에 연결된 핸들러와 함께 PyAudio 입력 스트림을 사용합니다. 이 스트림은 프로그램이 종료될 때 안전하게 종료할 수 있도록 메인 스레드로 반환됩니다.

메인 스레드 (Run me!)

메인 스레드는 Weave가 통합된 실시간 오디오 모델을 초기화합니다. 이어서 녹음을 시작하고, 사용자로부터 키보드 인터럽트가 발생할 때까지 대기합니다.