Nvidia Riva
Nvidia Riva (음성-텍스트 변환, Speech-to-Text)
NVIDIA Riva의 speech-to-text를 LiteLLM에서 사용하는 방법을 알아봐요. NVCF 호스팅 Riva 엔드포인트와 자체 호스팅 Riva 배포 모두에서 동작해요.
출처: 문서
본문
LiteLLM은 /audio/transcriptions를 통해 NVIDIA Riva의 speech-to-text를 지원해요. NVCF 호스팅 Riva 엔드포인트(예: build.nvidia.com의 Parakeet)와 자체 호스팅 Riva 배포 모두에서 동작해요.
| 속성 | 내용 |
|---|---|
| 설명 | Riva는 NVIDIA의 GPU 가속 음성 AI. LiteLLM은 오디오를 gRPC로 Riva에 스트리밍하고 OpenAI 호환 전사 결과를 반환해요 |
| LiteLLM 라우트 | nvidia_riva/ |
| 제공사 문서 | Riva ASR docs ↗ |
| 전송 방식 | gRPC (HTTP 아님) |
| 지원 OpenAI 엔드포인트 | /audio/transcriptions |
선택 설치: nvidia_riva는 gRPC 클라이언트와 오디오 디코딩 라이브러리가 필요해요. 다음과 같이 설치해요:
pip install 'litellm[stt-nvidia-riva]'
이렇게 하면 nvidia-riva-client, soundfile, audioread, numpy가 함께 설치돼요. 이들은 지연(lazy) 방식으로 import되므로 설치하지 않아도 나머지 LiteLLM은 정상 동작해요.
빠른 시작
from litellm import transcription
import os
os.environ["NVIDIA_RIVA_API_KEY"] = "nvapi-..." # your nvapi key
audio_file = open("/path/to/audio.mp3", "rb")
response = transcription(
model="nvidia_riva/nvidia/parakeet-ctc-1_1b-asr",
file=audio_file,
api_base="grpc.nvcf.nvidia.com:443",
nvcf_function_id="1598d209-5e27-4d3c-8079-4751568b1081", # NVCF function id
)
print(response.text)
LiteLLM은 스트리밍 전에 오디오를 16kHz 모노 LINEAR_PCM(Riva가 요구하는 통신 형식)으로 리샘플링하므로, mp3 / wav / flac / ogg를 그대로 보낼 수 있어요. 사전 처리가 필요 없어요.
배포 모드
Riva는 두 가지 매우 다른 형태로 실행돼요. nvcf_function_id의 존재가 LiteLLM이 use_ssl 기본값을 정하는 신호이며, 언제든 덮어쓸 수 있어요.
NVCF (NVIDIA 호스팅)
model_list:
- model_name: parakeet-asr
litellm_params:
model: nvidia_riva/nvidia/parakeet-ctc-1_1b-asr
api_base: grpc.nvcf.nvidia.com:443
api_key: os.environ/NVIDIA_RIVA_API_KEY # nvapi-...
nvcf_function_id: 1598d209-5e27-4d3c-8079-4751568b1081
nvcf_function_id가 설정되면 LiteLLM은:
- TLS 활성화 (
use_ssl=True) function-idgRPC 메타데이터 부착authorization: Bearer ***부착
자체 호스팅 (TLS 없음)
model_list:
- model_name: parakeet-asr
litellm_params:
model: nvidia_riva/nvidia/parakeet-ctc-1_1b-asr
api_base: localhost:50051
TLS가 있는 인그레스 뒤의 자체 호스팅
model_list:
- model_name: parakeet-asr
litellm_params:
model: nvidia_riva/nvidia/parakeet-ctc-1_1b-asr
api_base: riva.internal.company.com:443
use_ssl: true
LiteLLM Proxy 사용법
1. config에 모델 추가
model_list:
- model_name: parakeet-asr
litellm_params:
model: nvidia_riva/nvidia/parakeet-ctc-1_1b-asr
api_base: grpc.nvcf.nvidia.com:443
api_key: os.environ/NVIDIA_RIVA_API_KEY
nvcf_function_id: 1598d209-5e27-4d3c-8079-4751568b1081
model_info:
mode: audio_transcription
general_settings:
master_key: os.environ/LITELLM_MASTER_KEY
2. Proxy 시작
litellm --config /path/to/config.yaml
# RUNNING on http://0.0.0.0:4000
3. 요청 보내기
curl --location 'http://0.0.0.0:4000/v1/audio/transcriptions' \
--header "Authorization: Bearer ***" \
--form 'file=@"/path/to/speech.mp3"' \
--form 'model="parakeet-asr"'
from openai import OpenAI
client = OpenAI(
api_key="sk-",
base_url="http://0.0.0.0:4000",
)
audio_file = open("speech.mp3", "rb")
transcript = client.audio.transcriptions.create(
model="parakeet-asr",
file=audio_file,
)
print(transcript.text)
지원 파라미터
Riva에 깔끔하게 매핑되는 OpenAI 파라미터:
| OpenAI 파라미터 | 동작 |
|---|---|
language |
Riva language_code에 매핑. en 같은 단순 코드는 en-US로 정규화. de-DE 같은 BCP-47 코드는 그대로 통과 |
response_format |
json (기본값)은 { "text": "..." } 반환. verbose_json은 duration과 words(초 단위 타임스탬프) 추가 |
timestamp_granularities |
["word"]를 전달하면 단어 수준 타임스탬프 활성화 |
litellm_params에서 설정할 수 있는 Riva 전용 파라미터 (transcription(...)에 직접 전달 가능):
| 파라미터 | 기본값 | 용도 |
|---|---|---|
nvcf_function_id |
미설정 | NVCF 함수 ID. 설정 시 use_ssl=True 기본값과 NVCF 메타데이터 부착 |
use_ssl |
nvcf_function_id가 설정되면 True, 아니면 False |
TLS 강제 on/off. TLS 인그레스 뒤의 자체 호스팅 Riva에 유용 |
riva_model_name |
"" (자동 선택) |
내부 Riva 모델명 덮어쓰기. 비워두면 language_code + sample_rate_hertz 기반으로 Riva가 선택 |
enable_automatic_punctuation |
True |
표준 Riva 플래그 |
endpointing_config |
미설정 | Riva의 EndpointingConfig를 반영한 dict 전달 (start_threshold, stop_threshold, stop_history, stop_history_eou, ...) |
chunking_strategy |
미설정 | OpenAI 스타일 VAD 설정 ({"type": "server_vad", "threshold": 0.5, "silence_duration_ms": 700, "prefix_padding_ms": 250}). LiteLLM이 Riva의 EndpointingConfig로 변환 |
riva_model_name이 기본적으로 비어 있는 이유는?
parakeet-1.1b-en-US-asr-streaming-silero-vad-sortformer 같은 내부 Riva 배포 이름은 NVIDIA의 배포 식별자예요. NIM 버전, 리전, 자체 호스팅 빌드에 따라 달라져요. RecognitionConfig에 model=""을 비워두면 Riva가 language_code와 sample_rate_hertz에 기반해 올바른 모델을 자동 선택하는데, 이것이 거의 항상 원하는 동작이에요. 특정 배포 모델을 고정해야 할 때만 riva_model_name을 설정해요.
오디오 형식
LiteLLM은 soundfile(wav / flac / ogg)로 수신 오디오를 디코딩하고, mp3 / m4a / mp4 / webm은 audioread로 폴백해요. 이후 Riva로 스트리밍 전에 오디오를 16kHz 모노 LINEAR_PCM으로 리샘플링해요.
디코딩이 실패하면(예: 특이한 코덱, DRM, audioread 미설치) LiteLLM은 명확한 오류를 발생시키며 상류에서 변환하도록 안내해요:
ffmpeg -i input.mp3 -ac 1 -ar 16000 -sample_fmt s16 output.wav
환경 변수
| 변수 | 용도 |
|---|---|
NVIDIA_RIVA_API_KEY |
authorization: Bearer ***로 보내는 API 키. NVCF는 nvapi-... 형식을 기대해요 |
NVIDIA_RIVA_API_BASE |
gRPC 엔드포인트의 기본 host:port. litellm_params에서 api_base 설정과 동일하게 동작 |
NVIDIA_NIM_API_KEY |
NVIDIA_RIVA_API_KEY의 폴백으로 사용. 대부분의 사용자가 NVCF 서비스에서 동일한 nvapi-... 키를 재사용하기 때문 |
참고 사항 및 제한
- 전송은 gRPC 스트리밍이에요. NVCF는 현재 스트리밍 ASR만 지원하므로 짧은 파일도 스트림으로 전송돼요.
- Diarization(
diarization_config)과srt/vtt응답 형식은 아직 연결되지 않았어요. 필요하면 이슈를 열어주세요. - 비용 계산: Riva는 토큰 사용량을 반환하지 않아요. LiteLLM은 오디오 길이를
_hidden_params["audio_transcription_duration"]에 저장해 외부에서 비용을 도출할 수 있게 해요.
더 알아보기 (Learn more)
- Nvidia Riva ASR 문서
- LiteLLM 오디오 전사 API