사용자의 언어, 도메인 또는 억양에 맞춰 Nemotron 3.5 ASR을 미세 조정(Fine-Tune)하는 방법
요약
Nemotron 3.5 ASR은 40개의 언어 로케일을 지원하며 낮은 지연 시간과 높은 정확도를 동시에 제공하는 오픈 웨이트 모델입니다. 단일 체크포인트로 다국어 지원, 실시간 스트리밍, 구두점 자동 삽입 기능을 통합하여 기존 ASR 구축 시 발생하는 비용과 복잡성을 해결합니다.
핵심 포인트
- 40개 언어 로케일을 지원하는 단일 600M 파라미터 모델
- Cache-Aware FastConformer-RNNT 아키텍처로 초저지연 스트리밍 구현
- 구두점 및 대문자 표기 기능 내장으로 후처리 파이프라인 제거
- 오픈 웨이트 제공으로 사용자 도메인 및 억양에 맞춘 미세 조정 가능
**단일 체크포인트로부터 40개의 언어 로케일(language-locales)**을,
**실시간(real time)**으로,
구두점(punctuation) 및 대문자(capitalization) 기능이 내장된 상태로 제공합니다. 이 모델은 올해 초 Hugging Face와 NIM으로 출시된 인기 있는 Nemotron 3 ASR 모델(영어 전용)의 후속작입니다. 출시 이후, Nemotron 3 ASR은 Artificial Analysis의 독립적인 벤치마크를 통해 검증되었으며, 모든 스트리밍 ASR 모델 중 지연 시간(latency) 부문에서 2위를 기록했습니다(음성 종료 후 최종 전사까지 단 0.07초 소요). 또한, AA-WER 스트리밍 인덱스 대 최종 전사 시간(Time to Final Transcription) 리더보드의 "가장 매력적인 사분면(most attractive quadrant)"에 위치하여, 정확도와 지연 시간 사이의 결합된 트레이드오프(tradeoff) 측면에서 최고의 모델 중 하나로 자리매김했습니다. 이 모델은 Cache-Aware FastConformer-RNNT 아키텍처를 사용하여, 대부분의 스트리밍 ASR을 느리게 만드는 불필요한 재계산 없이 오디오를 스트리밍하므로, 어느 하나를 희생하지 않고도 낮은 지연 시간과 높래 정확도를 모두 얻을 수 있습니다. Nemotron 3.5 ASR은 Hugging Face에서 오픈 웨이트(open weights)로 제공되므로, API 의존성이나 호출당 과금 없이 모델을 검사, 미세 조정(fine-tune) 및 배포할 수 있습니다. 사용자가 선택하지 않는 한 데이터는 인프라를 벗어나지 않습니다. 또한 강력한 베이스 모델(base model)이기 때문에, 사용자의 고유한 언어, 도메인 또는 억양에 맞춰 미세 조정할 수 있습니다. 이 포스트의 후반부에서는 그 구체적인 방법을 설명합니다.
음성을 전사(transcribe)해야 하는 제품을 구축해 본 적이 있다면, 아마도 다음과 같은 장벽 중 하나에 부딪혀 보았을 것입니다:
다국어 지원 비용 (The polyglot tax). 여러 언어를 지원하고 싶어서 40개의 서로 다른 모델이나 40개의 서로 다른 벤더 API를 짜깁기하게 됩니다. 각 모델은 저마다의 특이점, 지연 시간 (latency) 프로필, 그리고 과금 체계를 가지고 있습니다. 결국 여러분의 인프라는 일회성 통합 사례들의 박물관이 되어버립니다.
스트리밍 대 정확도의 트레이드오프 (The streaming-vs-accuracy tradeoff). 실시간 자막 생성에는 낮은 지연 시간이 필요하지만, 대부분의 "스트리밍" ASR 시스템은 오디오의 중첩되는 윈도우 (windows)를 반복해서 재처리함으로써 스트리밍인 척 속입니다. 이는 컴퓨팅 자원을 낭비하고 지연을 추가합니다. 지연 시간을 줄이면 정확도가 급격히 떨어집니다.
후처리 파이프라인 (The post-processing pipeline). 가공되지 않은 ASR 출력은 종종 구두점이 없고 소문자로만 이루어진 텍스트의 벽과 같습니다. 구두점과 대문자 표기를 위해 두 번째 모델을 덧붙이게 되며, 이는 또 다른 가동 부품을 추가하는 셈이 됩니다.
"알려진 언어" 가정 (The "known language" assumption). 많은 시스템은 사용자에게 언어를 미리 알려줄 것을 요구합니다. 하지만 통화자가 문장 중간에 영어와 스페인어를 전환하는 고객 지원 라인의 경우는 어떻게 될까요?
Nemotron 3.5 ASR은 이 네 가지 문제를 하나의 모델로 통합하기 위해 구축되었습니다.
하나의 모델, 40개의 언어 및 지역 (One model, 40 language-locales). 단일 600M-파라미터 체크포인트가 영어 (US/GB), 스페인어 (US/ES), 독일어, 프랑스어 (FR/CA), 이탈리아어, 아랍어, 일본어, 한국어, 포르투갈어 (BR/PT), 러시아어, 힌디어, 터키어, 베트남어, 네덜란드어, 우크라이나어, 폴란드어, 핀란드어, 만다린 (Mandarin), 체코어, 불가리아어, 슬로바키아어, 스웨덴어, 크로아티아어, 루마니아어, 에스토니아어, 덴마크어, 헝가리어, 노르웨이 보크몰 (Norwegian Bokmål), 노르웨이 닌스크 (Norwegian Nynorsk), 히브리어, 그리스어, 리투아니아어, 라트비아어, 몰타어, 슬로베니아어, 태국어를 전사합니다. 언어별 배포나 모델 교체가 필요 없습니다.
제대로 구현된 실시간 스트리밍 (Real-time streaming, done right). 이 모델은 Cache-Aware FastConformer 인코더를 기반으로 구축되었습니다. 전통적인 "버퍼링" 방식의 스트리밍은 매 단계마다 오디오의 중첩되는 청크 (chunks)를 재처리하며 동일한 작업을 여러 번 반복합니다. 반면, 이 모델은 **인코더의 내부 상태를 캐싱 (caches the encoder's internal state)**하고 이를 재사용합니다. 즉, 모든 오디오 프레임은 중첩 없이 정확히 한 번만 처리됩니다. 그 결과, 정확도 저하 없이 컴퓨팅 자원 소모와 종단 간 지연 시간 (end-to-end latency)을 획기적으로 낮추었습니다.
구두점 및 대문자 표기, 네이티브하게. 출력되는 텍스트는 모델에서 즉시 사용 가능한 수준(production-ready)입니다. 적절한 대소문자 구분, 쉼표, 마침표, 물음표 등이 모델로부터 직접 생성됩니다. 별도의 구두점 복원 (punctuation-restoration) 단계가 필요하지 않습니다.
언어 조건화 (Language conditioning), 당신의 선택대로. 두 가지 방식으로 실행할 수 있습니다:
입력 언어를 모델에게 알려주기(target_lang=en-US): 언어를 알고 있는 경우에 사용하며, 일반적으로 가장 높은 정확도를 보입니다.
모델이 언어를 감지하게 하기(target_lang=auto): 언어를 모르는 경우에 사용하며, 모델이 언어를 감지하고 그에 따라 전사 (transcribe) 합니다.
모델은 두 가지 주요 구성 요소로 이루어져 있습니다:
캐시 인식형 (Cache-Aware) FastConformer 인코더 (24개 레이어). FastConformer는 선형적으로 확장 가능한 어텐션 (attention)을 갖춘 Conformer 아키텍처의 효율적인 진화 형태입니다. "캐시 인식형 (cache-aware)" 부분은 스트리밍의 핵심 기술입니다. 인코더는 이전 프레임의 셀프 어텐션 (self-attention) 및 컨볼루션 (convolution) 활성화 값을 캐시에 보관하므로, 새로운 오디오가 들어오면 실제로 새로 추가된 부분만 계산합니다. 아무것도 다시 계산하지 않습니다.
RNNT (Recurrent Neural Network Transducer) 디코더. RNNT는 스트리밍 ASR을 위한 핵심 디코더입니다. 오디오 스트림이 들어옴에 따라 프레임 단위로 텍스트를 방출하며, 이는 실시간 전사 (live transcription)에 정확히 필요한 기능입니다.
여기에 더해, 모델은 프롬프트 기반 언어 식별 (prompt-based language-ID) 조건화를 추가합니다. 오디오와 함께 언어 신호가 입력되어, 하나의 가중치 세트가 출력 내용을 대상 언어에 특화시키거나, auto 모드에서는 언어 자체를 추론할 수 있게 합니다.
이 모델은 구두점과 적절한 대소문자가 적용된 텍스트로 정규화된 공개 데이터와 독점 데이터를 혼합하여, 지원되는 모든 언어에 걸친 방대한 음성 데이터로 학습되었습니다.
스트리밍 ASR은 근본적으로 텍스트를 얼마나 빨리 방출할 것인가와 모델이 확정하기 전에 얼마나 많은 미래의 오디오를 "엿볼 (peek at)" 수 있는가 사이의 트레이드오프 (tradeoff) 관계에 있습니다. Nemotron ASR은 **어텐션 컨텍스트 크기 (attention context size)**를 통해 이를 직접적으로 노출합니다:
| 어텐션 컨텍스트 (Attention Context) | 청크 크기 (지연 시간, Chunk Size (Latency)) | 사용 사례 (Use Case) |
|---|---|---|
[56, 0] | 80ms (초저지연, Ultra-Low) | 초저지연 음성 에이전트 (Ultra low latency Voice Agents) |
[56, 1] | 160ms (저지연, Low) | 대화형 음성 에이전트 (Interactive Voice Agents), 대화형 AI (Conversational AI) |
[56, 3] | 320ms (균형, Balanced) | 대화형 AI (Conversational AI), 실시간 자막 (Live caption) |
[56, 6] | 560ms (중간, Medium) | 합리적인 지연 시간과 높은 정확도 (High accuracy with reasonable latency) |
[56, 13] | 1.12s (높음, High) | 높은 지연 시간과 최고 수준의 정확도 (Highest accuracy with high latency) |
동일한 체크포인트 (checkpoint)가 전체 스펙트럼을 커버합니다. 즉, 재학습(retraining) 없이 추론(inference) 시점에 동작 지점(operating point)을 선택하기만 하면 됩니다.
모델은 NeMo 체크포인트 형태로 제공됩니다. NeMo 브랜치를 클론(clone)하고 스트리밍 추론(streaming inference) 스크립트가 사용자의 오디오를 가리키도록 설정하세요:
git clone https://github.com/NVIDIA-NeMo/NeMo.git
알려진 언어로 전사(Transcribe)하기:
python ${NEMO_ROOT}/examples/asr/asr_cache_aware_streaming/speech_to_text_cache_aware_streaming_infer.py \
model_path=${MODEL_PATH} \
dataset_manifest=${MANIFEST_PATH} \
...
또는 모델이 언어를 감지하도록 하기:
python ${NEMO_ROOT}/examples/asr/asr_cache_aware_streaming/speech_to_text_cache_aware_streaming_infer.py \
model_path=${MODEL_PATH} \
dataset_manifest=${MANIFEST_PATH} \
...
오디오는 모노 채널(mono-channel) .wav 형식이어야 합니다.
매니페스트(manifest)는 표준 NeMo JSON-lines 파일입니다:
{"audio_filepath": "/path/to/clip.wav", "duration": 4.27, "text": "reference transcript"}
모델은 각 문장이 완료될 때마다 자동으로 언어 태그(language_tag)를 예측합니다. 예: “This is a test sample. <en-US>”. strip_lang_tags=True를 사용하면 가독성을 높이기 위해 언어 태그 <xx-XX>를 제거합니다.
Nemotron 3.5 ASR은 기본 상태(out of the box)에서도 강력하지만, 일부 언어가 다른 언어보다 훨씬 더 많은 데이터를 가진 혼합 데이터셋으로 학습되었습니다. 롱테일(long-tail) 지역 언어들은 개선의 여지가 있으며, 몇 시간 분량의 도메인 내(in-domain) 오디오와 적절한 레시피(recipe)를 결합하면 놀라울 정도로 많은 격차를 해소할 수 있습니다.
이를 구체화하기 위해, 우리는 실습 예제를 실행했습니다. 베이스 모델(base model)을 가져와 자원이 중간 정도인 두 가지 유럽 언어인 그리스어와 불가리아어로 정교화(sharpen)한 다음, 홀드아웃 데이터(held-out data)를 통해 정직하게 측정했습니다. 아래 결과는 해당 실행의 결과입니다. 이 섹션은 상위 수준의 개요이며, 코딩 예제는 동반 GitHub 저장소에 있습니다. 전체 과정을 다루는 에이전트 방식의 SKILL.md를 게시할 때, 이 블로그도 그에 따라 업데이트될 예정입니다.
이 방식이 효과를 발휘하는 몇 가지 상황은 다음과 같습니다:
롱테일 로케일(long-tail locale) 정교화. 사전 학습(pretraining) 데이터가 적은 언어일수록 얻을 수 있는 이득이 가장 큽니다.
도메인 전문 지식 또는 특화된 어휘. 베이스 모델이 거의 접하지 못한 의료, 법률, 금융 또는 기술 어휘.
억양, 방언 및 음향 특성. 전화, 원거리(far-field), 차량 내(in-car) 또는 특정 화자 집단.
새로운 언어. 아직 지원되지 않는 로케일을 부트스트래핑(bootstrapping)하는 경우.
🎥 비디오 워크스루(Video Walkthrough): YouTube에서 시청하세요
이 워크스루는 다국어 스트리밍 추론(multilingual streaming inference), 지연 시간/정확도 트레이드오프(latency/accuracy tradeoffs), 배포 옵션, 그리고 아래에 설명된 미세 조정(fine-tuning) 워크플로우를 보여줍니다.
전체 워크플로우는 다섯 단계로 이루어집니다:
- 대상 언어의 tar 형식 음성 데이터를 트레이너(trainer)로 지정합니다. 파일별로 압축을 풀 필요 없이 NeMo/Lhotse에 의해 효율적으로 스트리밍됩니다.
- 각 클립의 언어 태그(language tag)를 조건으로 하여, 동일한 Cache-Aware FastConformer-RNNT 레시피를 사용하여 베이스 체크포인트(
init_from_nemo_model)로부터 미세 조정(fine-tune)합니다. - 모델이 한 번도 본 적 없는 홀드아웃 세트(held-out set)에서 평가합니다. 이때 실제 배포할 것과 동일한 저지연 스트리밍 설정(예:
att_context_size=[56,0], 80ms 청크; 0ms 룩어헤드(lookahead))을 사용합니다. - 언어가 취약한 부분에 더 많은 데이터를 추가하고 재학습합니다.
- 미세 조정된 체크포인트를 내보내기(export)하고 배포합니다.
우리는 공개된 다국어 코퍼스(Granary, Common Voice, FLEURS)로부터 두 언어(그리스어 및 불가리아어)에 걸쳐 균형 잡힌 약 2,000시간 분량의 혼합 데이터를 수집하여 tar 형식의 NeMo/Lhotse 샤드(shards)로 유지했습니다. 가장 중요한 두 가지 세부 사항은 다음과 같습니다:
- 모든 클립은
target_lang을 포함합니다.
tag — 이것은 모델의 프롬프트 기반 언어 조건화 (prompt-based language conditioning)를 구동하는 요소이므로, 태그를 정확하게 설정하고 (모델이 인식할 수 있는 값을 사용하여) 맞추는 것이 필수적입니다. - 베이스 모델 (base model)의 텍스트 스타일과 일치시키십시오 — 모델이 생성하는 결과물인 구두점이 찍히고 대소문자가 적절히 표기된 전사 (transcripts) 형태여야 합니다.
(훈련에 포함되지 않은) 홀드아웃 (held-out) FLEURS 테스트 분할은 언어별로 실제 환경에서의 정직한 벤치마크 (benchmark)를 제공했습니다.
고정된 스텝 예산 (step budget)에 따라 구동되는 스트리밍 RNNT 모델의 간단한 전체 미세 조정 (full fine-tune) 방식입니다 (이는 스트리밍/반복 가능한 데이터 (streaming/iterable data)를 스케줄링하는 올바른 방법입니다). 빠른 패스 (pass)를 위해 단일 GPU에서 실행할 수 있으며, 전체 실행을 위해 멀티 GPU (multi-GPU)로 깔끔하게 확장할 수 있습니다. 이와 같은 작은 데이터셋에서는 1 에포크 (epoch)가 몇 시간이 아닌 몇 분 만에 완료됩니다.
우리는 미래의 오디오를
미세 조정된 모델은 베이스(base) 모델과 동일한 아키텍처를 가지므로, 동일한 서빙 경로(serving path)로 즉시 투입할 수 있으며, 파트 1에서와 마찬가지로 추론(inference) 시점에 att_context_size를 통해 지연 시간(latency)/정확도(accuracy) 운영 지점을 선택할 수 있습니다.
미세 조정(Fine-tuning)은 자원이 부족한 언어에 혁신적인 변화를 가져옵니다— 가장 큰 성과는 베이스 모델이 가장 취약했던 부분에서 나타났습니다. 배포 지연 시간(deployment latency) 기준으로, 홀드아웃 데이터(held-out data)를 통해 평가하십시오. 훈련 세트(training-set) 점수는 수치를 낙관적으로 만들 수 있습니다; 0ms 미리보기(look-ahead)를 적용한 별도의 테스트 세트가 진실을 말해줍니다. 언어 태그(language tag)를 정확하게 설정하십시오. 프롬프트 컨디셔닝(prompt conditioning)은 강력하지만
AI 자동 생성 콘텐츠
본 콘텐츠는 Hugging Face Blog의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기