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-id gRPC 메타데이터 부착
  • 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_jsondurationwords(초 단위 타임스탬프) 추가
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 버전, 리전, 자체 호스팅 빌드에 따라 달라져요. RecognitionConfigmodel=""을 비워두면 Riva가 language_codesample_rate_hertz에 기반해 올바른 모델을 자동 선택하는데, 이것이 거의 항상 원하는 동작이에요. 특정 배포 모델을 고정해야 할 때만 riva_model_name을 설정해요.

오디오 형식

LiteLLM은 soundfile(wav / flac / ogg)로 수신 오디오를 디코딩하고, mp3 / m4a / mp4 / webmaudioread로 폴백해요. 이후 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