AssemblyAI
AssemblyAI
AssemblyAI의 패스스루 엔드포인트를 소개할게요. LiteLLM 프록시를 거쳐 AssemblyAI의 각종 엔드포인트를 네이티브 형식 그대로(변환 없이) 호출할 수 있어요. 즉 AssemblyAI SDK를 그대로 쓰면서도 베이스 URL만 LiteLLM 프록시로 바꾸면, 인증·로깅·비용 추적까지 한 번에 해결되는 구조예요.
출처: 문서
본문
지원 라우트는 아래와 같아요.
/assemblyai/*
api.assemblyai.com
유럽(EU) 지역 엔드포인트는 다음과 같죠.
/eu.assemblyai/*
eu.api.assemblyai.com
빠른 시작 (Quick Start)
먼저 AssemblyAI API 키를 환경 변수로 설정해요.
export ASSEMBLYAI_API_KEY=""
그다음 LiteLLM 프록시를 실행해요.
litellm
# RUNNING on http://0.0.0.0:4000
이제 /v2/transcripts 같은 엔드포인트를 프록시를 통해 호출하면 돼요. AssemblyAI 공식 SDK에서 베이스 URL만 프록시로 바꿔서 사용하는 예시를 볼게요. 음성 인식(transcription) 예시입니다.
import assemblyai as aai
aai.settings.base_url = "http://0.0.0.0:4000/assemblyai" # <your-proxy-base-url>/assemblyai
aai.settings.api_key = "Bearer sk-<your-litellm-api-key>" # Bearer <your-virtual-key>
# Use a publicly-accessible URL
audio_file = "https://assembly.ai/wildfires.mp3"
# Or use a local file:
# audio_file = "./example.mp3"
config = aai.TranscriptionConfig(
speech_models=["universal-3-pro", "universal-2"],
language_detection=True,
speaker_labels=True,
# Speech understanding features
# sentiment_analysis=True,
# entity_detection=True,
# auto_chapters=True,
# summarization=True,
# summary_type=aai.SummarizationType.bullets,
# redact_pii=True,
# content_safety=True,
)
transcript = aai.Transcriber().transcribe(audio_file, config=config)
if transcript.status == aai.TranscriptStatus.error:
raise RuntimeError(f"Transcription failed: {transcript.error}")
print(f"\nFull Transcript:\n\n{transcript.text}")
# Optionally print speaker diarization results
# for utterance in transcript.utterances:
# print(f"Speaker {utterance.speaker}: {utterance.text}")
말하기 프롬프트(speech-to-text prompting)를 활용한 예시예요.
import assemblyai as aai
aai.settings.base_url = "http://0.0.0.0:4000/assemblyai" # <your-proxy-base-url>/assemblyai
aai.settings.api_key = "Bearer sk-<your-litellm-api-key>" # Bearer <your-virtual-key>
audio_file = "https://assemblyaiassets.com/audios/verbatim.mp3"
config = aai.TranscriptionConfig(
speech_models=["universal-3-pro", "universal-2"],
language_detection=True,
prompt="Produce a transcript suitable for conversational analysis. Every disfluency is meaningful data. Include: fillers (um, uh, er, ah, hmm, mhm, like, you know, I mean), repetitions (I I, the the), restarts (I was- I went), stutters (th-that, b-but, no-not), and informal speech (gonna, wanna, gotta)",
)
transcript = aai.Transcriber().transcribe(audio_file, config)
print(transcript.text)
AssemblyAI EU 엔드포인트 호출
LITELLM_PROXY_BASE_URL 환경 변수를 활용하면 EU 엔드포인트도 쉽게 연결할 수 있어요. 베이스 URL을 <your-proxy-base-url>/eu.assemblyai로 설정하면 됩니다.
import assemblyai as aai
aai.settings.base_url = "http://0.0.0.0:4000/eu.assemblyai" # <your-proxy-base-url>/eu.assemblyai
aai.settings.api_key = "Bearer sk-<your-litellm-api-key>" # Bearer <your-virtual-key>
# Use a publicly-accessible URL
audio_file = "https://assembly.ai/wildfires.mp3"
# Or use a local file:
# audio_file = "./path/to/file.mp3"
transcriber = aai.Transcriber()
transcript = transcriber.transcribe(audio_file)
print(transcript)
print(transcript.id)
LLM 게이트웨이 (LLM Gateway)
AssemblyAI는 자체 LLM 게이트웨이 모델도 제공해요. LiteLLM을 통해서도 이 모델들을 호출할 수 있습니다.
LiteLLM Python SDK
import litellm
import os
os.environ["ASSEMBLYAI_API_KEY"] = "your-assemblyai-api-key"
response = litellm.completion(
model="assemblyai/claude-sonnet-4-5-20250929",
messages=[{"role": "user", "content": "What is the capital of France?"}]
)
print(response.choices[0].message.content)
LiteLLM 프록시
프록시 설정 파일(config.yaml)에 모델을 등록해요.
model_list:
- model_name: assemblyai/*
litellm_params:
model: assemblyai/*
api_key: os.environ/ASSEMBLYAI_API_KEY
프록시를 실행하고,
litellm --config config.yaml
# RUNNING on http://0.0.0.0:4000
OpenAI 호환 /v1/chat/completions로 호출하면 됩니다.
import requests
headers = {
"authorization": "Bearer sk-<your-litellm-api-key>" # Bearer <your-virtual-key>
}
response = requests.post(
"http://0.0.0.0:4000/v1/chat/completions",
headers=headers,
json={
"model": "assemblyai/claude-sonnet-4-5-20250929",
"messages": [
{"role": "user", "content": "What is the capital of France?"}
],
"max_tokens": 1000
}
)
result = response.json()
print(result["choices"][0]["message"]["content"])