Hugging Face

netease-youdao/Confucius4-R2T2

Confucius4-R2T2 — 낮은 지연 시간과 높은 정확도를 지향하는 실시간 음성 인식 모델

Confucius4-R2T2는 이전에 출력한 문장을 수정하지 않는 append-only 방식의 실시간 음성 인식 모델입니다. 80ms부터 2초까지 디코딩 구간을 조절하며 평균 200~600ms 지연 시간을 목표로 하고, vLLM과 WebSocket 서버를 이용한 실시간 서비스 구성을 지원합니다.

AI 요약

NetEase Youdao가 공개한 Confucius4-R2T2는 음성이 들어오는 즉시 문장을 출력하는 true streaming Automatic Speech Recognition, ASR 모델입니다. 일반적인 스트리밍 인식은 부분 결과를 계속 고치면서 화면에 표시할 수 있지만, R2T2는 한 번 확정한 텍스트를 다시 수정하지 않는 append-only 출력 방식을 사용합니다. 실시간 자막, 동시 통역, 후속 Natural Language Processing 파이프라인, LLM 에이전트처럼 인식 결과를 곧바로 처리해야 하는 애플리케이션에서 문장 변경과 화면 깜빡임을 줄이는 구조입니다.

■ 안정적인 prefix를 먼저 확정하는 설계

R2T2는 Qwen3-ASR를 기반으로 만들었습니다. 학습 데이터에는 stable-prefix data, forced time-alignment data, token-level audio segmentation을 적용했습니다. 여기에 Longest Stable Prefix, LSP 학습 방식을 결합해 현재 오디오만으로 확정해도 되는 문장 앞부분과 추가 음성 맥락이 필요한 부분을 구분합니다. 모델은 안전하다고 판단한 stable prefix만 외부로 내보냅니다. 다음 예측은 이미 확정한 텍스트를 맥락으로 사용하지만, 이전에 출력한 단어는 다시 바꾸지 않습니다. LSP에 관한 기술 보고서는 추후 공개할 예정이라고 설명합니다.

디코딩 chunk는 80ms에서 2초 사이로 설정합니다. 짧은 chunk를 선택하면 낮은 지연 시간에 맞출 수 있고, 긴 chunk를 선택하면 더 많은 음성 맥락을 확보하는 방식으로 지연 시간과 정확도 사이의 설정을 조절합니다. 공개된 설명에서 평균 지연 시간은 200~600ms입니다. 스트리밍 기능을 추가해도 오프라인 인식 정확도는 떨어지지 않는다고 밝히고 있으며, 오프라인 인식과 스트리밍 인식 모두에 vLLM backend를 사용할 수 있습니다. Hugging Face Transformers backend도 제공합니다.

■ 영어 WER와 중국어 CER 비교

평가는 영어에서 WER, 중국어에서 CER을 사용하며 수치가 낮을수록 좋습니다. 160ms 설정의 R2T2를 Qwen3-ASR의 2초 pseudo-streaming 설정, Qwen3-ASR base 160ms 설정, X-ASR, WhisperRT, Nemotron, Voxtral, AssemblyAI 및 두 개의 상용 시스템과 비교했습니다. 원문은 R2T2가 오픈소스 모델 가운데 지연 시간과 인식 품질에서 SOTA 성능을 보였고, 일부 폐쇄형 시스템과도 경쟁력 있는 결과를 냈다고 설명합니다. 비교표에서 별표가 붙은 pseudo-streaming 모델은 이미 출력한 부분을 수정할 수 있으며, 표시가 없는 모델은 true streaming append-only 출력을 사용합니다.

영어 AMI 데이터셋에서 R2T2 160ms의 WER은 11.37입니다. Qwen3-ASR base 160ms는 24.79, X-ASR 160ms는 14.41, WhisperRT 200ms는 24.19로 기록됐습니다. Giga-clean에서는 R2T2가 9.60, LS-clean에서는 2.13, LS-other에서는 4.88, VoxPopuli에서는 3.07을 기록했습니다. 다만 같은 표에서 Commercial B는 AMI 8.44, LS-clean 1.25, LS-other 2.48로 더 낮은 수치를 보이는 데이터셋도 있습니다.

중국어 데이터셋에서는 Wenet-net의 R2T2 CER이 5.87입니다. Qwen3-ASR base 160ms는 19.79, X-ASR 160ms는 8.81, Nemotron 160ms는 24.70, Voxtral 160ms는 23.53입니다. Wenet-meeting에서는 R2T2가 7.27, SPEECHIO-06에서는 7.30, SPEECHIO-07에서는 8.20, CN-RealSI에서는 3.48을 기록합니다. CN-RealSI에서 Qwen3-ASR base 160ms는 39.72, X-ASR 160ms는 4.92, Commercial B는 3.64입니다. 결과 그래프는 모델별 WER 또는 CER과 retrospective chunk-wise latency를 함께 비교하며, Pareto frontier에서는 왼쪽 아래가 더 나은 지점입니다.

■ 로컬 실행과 추론 설정

저장소는 Python 3.10 이상을 지원하고 Python 3.12를 테스트 기준으로 사용합니다. 기본 설치는 Git 저장소를 복제한 뒤 Conda 또는 uv 가상 환경을 만들고, vLLM backend가 포함된 패키지를 editable 설치하는 순서입니다. vLLM은 CUDA와 PyTorch 버전 호환 조건이 엄격하므로 설치가 해결되지 않으면 사용 중인 CUDA runtime에 맞는 vLLM 버전을 선택해야 합니다.

Docker 사용 시 NVIDIA Container Toolkit을 먼저 설치해야 합니다. 공식 Qwen3-ASR 이미지인 qwenllm/qwen3-asr에 R2T2 실행에 필요한 runtime 라이브러리가 포함되어 있습니다. 호스트 작업 디렉터리와 컨테이너 포트 8000을 연결한 뒤 컨테이너 안에서 run_example.sh를 실행합니다. 서비스가 포트 포워딩을 받으려면 컨테이너 내부 프로세스가 127.0.0.1이 아니라 0.0.0.0에 바인딩해야 합니다.

입력 오디오는 모노와 스테레오를 모두 받으며 샘플레이트가 달라도 내부에서 16kHz로 변환합니다. 실행 시 모델 경로, 음성 파일, 언어 힌트, 추론 모드, chunk 크기를 지정합니다. 기본 스트리밍 chunk는 160ms이고 80ms부터 2초까지 설정합니다. context에는 hotword나 주제 힌트를 넣을 수 있으며, unfixed token 수는 아직 확정하지 않은 끝부분을 어느 정도 유지할지 정합니다. 이 값은 스트리밍 중 일부 rollback이 필요한 구간을 제어하는 용도로 설명합니다.

Python API에서는 Qwen3ASRModel.LLM으로 모델을 초기화한 뒤 init_streaming_state를 호출합니다. 언어를 Chinese 또는 None으로 지정하고, 0.16초 단위로 오디오를 잘라 streaming_transcribe에 전달합니다. 각 호출은 새로 인식한 텍스트를 반환하며, 모든 음성을 처리한 뒤 finish_streaming_transcribe를 호출해 최종 상태를 확인합니다. 오프라인 추론에서는 배치 입력과 로컬 경로, URL, base64, NumPy 배열과 샘플레이트 튜플을 지원합니다. vLLM 코드가 프로세스를 생성하는 환경에서는 spawn 오류를 피하기 위해 if __name__ == '__main__': 아래에서 실행해야 합니다.

■ WebSocket 기반 다중 클라이언트 구성

저장소에는 VAD를 포함한 실시간 다중 클라이언트용 WebSocket 서버와 실행 스크립트, Python reference client가 들어 있습니다. FireRedVAD의 Stream-VAD 모델을 VAD로 사용하며 기본 경로는 checkpoints/vad/Stream-VAD입니다. 서버는 기본 포트 8272에서 실행하고 GPU 번호와 모델 경로를 인자로 받습니다.

/asr_stream_api_v1 endpoint에는 16kHz 모노 PCM int16 raw binary frame을 보냅니다. reference client는 약 160ms 단위인 2560 samples를 한 프레임으로 전송합니다. 오디오 전송이 끝나면 YOUDAO_ONETIME_ASR_STREAM_EOS 문자열을 보내 최종 텍스트를 요청합니다. 서버 응답은 status, requestId, msg를 포함한 JSON이며, msg 안에 새로 인식한 text, reset 여부, 현재 요청의 asr_cost_ms, 누적 total_cost_ms가 들어갑니다. text는 이전 응답 이후 추가된 부분이므로 클라이언트가 응답들을 이어 붙여 전체 transcript를 구성합니다. 이 방식은 매번 전체 문장을 다시 보내는 대신 새로 확정한 구간만 전달합니다.

■ 지원 언어와 라이선스

R2T2는 중국어와 영어에 맞춰 최적화했으며 프랑스어, 독일어, 이탈리아어, 일본어, 한국어, 포르투갈어, 러시아어, 스페인어, 아랍어 등에서도 교차 언어 스트리밍 인식을 지원합니다. 코드 저장소는 Apache License 2.0으로 공개해 해당 조건 아래 상업적 사용, 수정, 재배포를 허용합니다. 모델 가중치는 NetEase Model Use License Agreement를 따르므로 코드와 checkpoint에 적용되는 조건을 구분해 확인해야 합니다.

원문: Hugging Face / 번역·요약: Trawling