본문으로 건너뛰기

© 2026 Molayo

🤗 HF헤드라인2026. 05. 28. 00:29

Reachy Mini의 완전 로컬 구동

요약

Reachy Mini 로봇을 위해 VAD, STT, LLM, TTS를 결합한 완전 로컬 speech-to-speech 파이프라인 구축 방법을 안내합니다. llama.cpp와 Gemma 4를 활용하여 클라우드 연결 없이 실시간 대화가 가능한 로컬 백엔드 구성법을 다룹니다.

핵심 포인트

  • cascaded VAD-STT-LLM-TTS 파이프라인 구축
  • llama.cpp를 이용한 Gemma 4 로컬 서빙
  • Realtime API 호환 WebSocket 제공
  • 데이터 유출 없는 완전한 로컬 환경 구현

이 스택은 우리의 cascaded VAD → STT → LLM → TTS 파이프라인인 speech-to-speech를 통해 구동되며, Realtime API와 호환되는 /v1/realtime WebSocket을 제공합니다. 백엔드를 실행한 후, UI에서 로봇을 해당 백엔드로 지정하면 됩니다.

Cascades(계단식 구조)는 오늘날 오픈 소스 생태계에서 가장 유연한 옵션이며, 적절한 구성 요소를 갖춘다면 가장 빠른 방법이기도 합니다. 저희가 가장 선호하는 구성 요소를 추천해 드리겠지만, cascade 방식의 핵심은 언제든 교체할 수 있다는 점입니다. 새로운 모델들이 매주 출시되고 있습니다.

요약 (TL;DR)

  • Reachy Mini를 위한 로컬 음성 백엔드 배포.
  • cascade 방식을 사용하는 우리의 speech-to-speech 라이브러리 사용.
  • 추천 구성: Gemma 4를 포함한 llama.cpp, Silero VAD, Parakeet-TDT STT, Qwen3-TTS.

이 블로그에서는 Reachy Mini와 완전히 로컬로 대화를 실행하는 과정을 안내합니다. 클라우드도, API 키도, 데이터의 외부 유출도 없습니다. 다음은 이를 실시간으로 보여주는 영상입니다:

[IMG:1]

LLM을 서빙하기 위해 Hugging Face의 llama.cpp를 사용하겠습니다. 설치가 필요한 경우 가장 간단한 방법은 brew install llama.cpp 또는 winget install llama.cpp이며, 더 자세한 도움은 문서를 확인하세요.

먼저 다음을 실행합니다:

llama-server -hf ggml-org/gemma-4-E4B-it-GGUF -np 2 -c 65536 -fa on --swa-full

그러면 끝입니다! 처음 실행할 때는 모델을 다운로드하지만, 이후 실행은 매우 빠릅니다.

이 플래그(flags)들은 무엇을 하나요?

-hf ggml-org/gemma-4-E4B-it-GGUF — Hub에서 모델을 직접 가져옵니다. 첫 실행 시 다운로드하며, 이후 실행 시에는 캐시를 사용합니다.

-np 2 — 두 개의 병렬 슬롯을 생성합니다. 서버가 첫 번째 요청에 막히지 않고 두 번째 요청(예: 빠른 끼어들기)을 처리할 수 있게 합니다.

-c 65536 — 슬롯 간에 공유되는 64k 컨텍스트 윈도우(context window)를 설정합니다. 긴 대화를 위한 충분한 여유 공간을 제공합니다.

-fa on — Flash Attention을 사용합니다. 더 빠르고 메모리 사용량이 적으며, 최신 하드웨어에서는 기본적으로 이점이 있습니다.

--swa-full — 슬라이딩 윈도우 어텐션(sliding-window attention) 캐시를 재계산하는 대신 전체를 유지합니다. 약간의 RAM을 사용하는 대신 Gemma에서 눈에 띄게 빠른 프롬프트 처리를 제공합니다.

먼저 라이브러리를 설치하는 것으로 시작하겠습니다:

uv pip install speech-to-speech

그다음, 다른 터미널에서 LLM (Large Language Model)을 서빙하는 동안, 단순히 다음 명령어를 실행하면 됩니다:

speech-to-speech --responses_api_base_url "http://127.0.0.1:8080" --responses_api_api_key "" --mode local

그러면 터미널을 통해 모델과 대화를 시작할 수 있습니다! 처음 실행할 때는 Parakeet와 Qwen3TTS를 다운로드해야 하지만, 이후 실행부터는 매우 빠릅니다.

다음은 로컬 대화 모드를 보여주는 영상입니다:

[IMG:1]

--mode local 모드로 테스트를 마쳤다면, 해당 옵션 없이 명령어를 다시 실행하여 로봇에게 speech-to-speech 기능을 제공할 수 있습니다.

lama.cpp와 speech-to-speech가 실행 중이라면, 데스크톱 앱으로 로봇을 시작하고 대화 앱(conversation app)을 실행할 수 있습니다. 대화 앱의 UI에서 HF 백엔드의 "edit connection"을 클릭하여 로컬 모드를 선택해야 합니다. 다음은 그 방법을 보여주는 영상입니다:

[IMG:2]

이제 완료되었습니다. 로봇과 대화를 시작할 수 있습니다. 파이프라인(pipeline)의 모든 단계는 트레이드오프(trade-off) 관계에 있습니다. 품질은 낮지만 더 빠른 TTS (Text-to-Speech) 모델이 있는가 하면, 품질은 높지만 더 느린 STT (Speech-to-Text) 모델도 있습니다. 저희는 다국어(multilingual) 환경에 최적화했지만, 사용자는 단일 언어에 맞춰 최적화하고 싶을 수도 있습니다. 블로그의 나머지 부분에서는 이를 어떻게 커스텀(customize)하는지 다룹니다.

호스팅된 실시간 백엔드는 편리하지만, 자체 엔진을 실행하면 세 가지 이점을 얻을 수 있습니다:

개인정보 보호 (Privacy). 오디오가 네트워크를 절대 벗어나지 않으며, 전체 파이프라인이 사용자가 제어하는 하드웨어에서 실행됩니다.
API 비용 없음 (No API costs). 분당 또는 토큰당 비용이 발생하지 않습니다.
파이프라인에 대한 완전한 제어 (Full control over the pipeline). VAD (Voice Activity Detection), STT, LLM, TTS 중 어떤 구성 요소든 교체할 수 있습니다. Hub 🤗에 더 나은 모델이 출시될 때마다 언제든 교체 가능합니다.

speech-to-speech 리포지토리(repo)는 이 모든 것을 단일 CLI (Command Line Interface)로 제공합니다. 이 도구는 Reachy Mini가 이미 통신할 줄 아는 것과 동일한 프로토콜을 사용하는 /v1/realtime 경로에 WebSocket 서버를 구동합니다.

계단식 음성 파이프라인(cascaded voice pipeline)은 VAD, STT, LLM, TTS의 네 단계로 구성됩니다. 이 중 세 단계에 대해서는 사용자가 LLM에 집중할 수 있도록 견고한 기본값(defaults)을 선택했습니다:

단계선택이유
VADSilero VAD v5작고 정확하며, CPU에서 실행 가능합니다. 오픈 소스 음성 에이전트(voice-agent) 세계의 사실상의 표준(de-facto default)입니다.
STTParakeet-TDT스트리밍에 적합하며, 매우 빠르고 영어 품질이 뛰어납니다.
TTSQwen3-TTS표현력이 풍부하고, 지연 시간(latency)이 낮으며, 다국어를 지원하고 커스텀 음성을 지원합니다.

우리는 이러한 선택에 대해 확고한 주관을 가지고 있지만, 선호하는 방식이 있다면 자유롭게 교체하여 사용하셔도 좋습니다.

LLM은 시스템의 지연 시간(latency)과 전반적인 성능에 가장 큰 영향을 미치는 계층입니다. 우리는 두 가지 옵션을 지원합니다: 모델을 로컬에서 실행(llama.cpp, MLX, Transformers, vLLM)하거나, Responses API를 사용하는 서버를 활용(OpenAI, Gemini, HF Inference Endpoints, llama.cpp, vLLM 등)하는 것입니다.

시스템의 주요 병목 현상(bottleneck)은 LLM 추론 지연 시간(inference latency)입니다. 이를 해결하기 위해, 우리는 Responses API 프로토콜을 통해 노출되는 외부 추론 엔진(inference engines)을 지원합니다.

따라서 speech-to-speech 엔진은 LLM이 Responses API 프로토콜을 준수하는 한 별도의 프로세스에서 실행되는 두 번째 모드를 지원합니다. 한 터미널에서 모델 서버를 실행하고, 다른 터미널에서 음성 루프(voice loop)를 실행하면, 두 프로세스는 HTTP를 통해 통신합니다.

터미널 1: llama.cpp 서버:

llama-server -hf ggml-org/gemma-4-E4B-it-GGUF -np 2 -c 65536 -fa on --swa-full

터미널 2: speech-to-speech 클라이언트:

speech-to-speech \
--mode realtime \
--stt parakeet-tdt \
...

vLLM ≥ 0.21.0 버전이 필요합니다. speech-to-speech 백엔드에서 사용되는 도구 호출 스트리밍(tool-call streaming)을 포함하여 Responses API 프로토콜에 대한 완전한 지원은 vLLM 0.21.0에서 도입되었습니다. 이전 버전에서도 부팅은 가능하지만, 어시스턴트가 도구를 호출하려고 시도하는 즉시 오류가 발생할 것입니다.

이 파이프라인을 위해 vLLM을 통해 모델을 서빙할 때는 다음 세 가지 플래그가 사실상 필수적입니다:

--enable-auto-tool-choice

--tool-call-parser <tool_parser_name>

— 모델의 원시 출력(raw output)을 구조화된 도구 호출(structured tool calls)로 변환하는 모델 제품군별 파서(parser)를 선택합니다 (예: Qwen3 instruct 모델의 경우 qwen3_coder, Llama 3의 경우 llama3_json, hermes 등).

(Hermes 스타일 모델의 경우, ...).--default-chat-template-kwargs '{"enable_thinking":false}'

: 해당 기능을 지원하는 모델의 <think> 추론 채널 (reasoning channel)을 비활성화합니다. 더 어려운 에이전트 작업 (agentic tasks)을 수행할 때는 이를 true로 전환하여 모델이 추론하게 할 수 있지만, 자연스러운 대화 느낌을 위해서는 비활성 상태로 유지하는 것을 강력히 권장합니다. 모든 추론 토큰 (thinking token)은 로봇이 말을 시작하기 전 사용자가 침묵으로 느끼게 되는 지연 시간 (latency)이 되기 때문입니다.

터미널 1: vLLM 추론 서버 (Qwen/Qwen3-4B-Instruct-2507):

vllm serve Qwen/Qwen3-4B-Instruct-2507 \
--port 8000 \
--host 127.0.0.1 \
...

--speculative-config 라인은 다중 토큰 예측 (Multi-Token Prediction, MTP)을 활성화합니다. 이는 선택 사항이지만, 엔드 투 엔드 지연 시간 (end-to-end latency)에 큰 영향을 미칩니다. 모델이 지원하는 경우 항상 켜두십시오.

터미널 2: 음성-대-음성 (speech-to-speech) 클라이언트:

speech-to-speech \
--mode realtime \
--stt parakeet-tdt \
...

동일한 프로토콜을 사용하지만, 모델은 Hugging Face의 관리형 GPU에서 실행됩니다. 어떤 채팅 모델이든 추론 엔드포인트 (Inference Endpoint)로 배포한 다음, 음성 루프 (voice loop)가 해당 엔드포인트 URL을 가리키도록 설정하십시오:

speech-to-speech \
--mode realtime \
--stt parakeet-tdt \
...

직접 엔드포인트를 관리하고 싶지 않다면 추론 제공자 (Inference Provider)를 사용하십시오. Hugging Face는 단일 URL을 통해 사용자의 요청을 제3자 백엔드(예: Together, Fireworks, Replicate)로 라우팅합니다:

speech-to-speech \
--mode realtime \
--stt parakeet-tdt \
...

인프라 구축 없이 프런티어 모델 (frontier model)을 테스트하고 싶을 때는 동일한 플래그를 OpenAI로 지정하십시오:

speech-to-speech \
--mode realtime \
--stt parakeet-tdt \
...

--responses_api_* 플래그는 해당 프로토콜을 구현하는 모든 제공자(OpenRouter, Together, Fireworks 등)에 대해 동일하게 작동합니다. 베이스 URL과 API 키만 교체하면 나머지 파이프라인 (pipeline)은 동일하게 유지됩니다.

Mac을 사용 중이라면, MLX가 합리적인 지연 시간으로 실제 모델을 실행할 수 있는 가장 마찰이 적은 (lowest-friction) 방법입니다. 저희는 Qwen3-4B-Instruct-2507을 권장합니다. 이 모델은 M 시리즈 칩에서 즉각적인 반응을 느낄 수 있을 만큼 충분히 작으면서도, 대화를 유지할 수 있을 만큼 충분한 능력을 갖추고 있습니다.

speech-to-speech \
--llm_backend mlx-lm \
--model_name "mlx-community/Qwen3-4B-Instruct-2507-bf16"

서버는 기본적으로 ws://127.0.0.1:8765/v1/realtime에서 대기합니다. 서버를 실행 상태로 두고, 대화 앱을 로컬 백엔드(backend)에 연결하면 로봇과 대화할 수 있습니다.

동일한 방식이지만, 순수(vanilla) transformers를 사용하는 방법입니다.

CUDA 환경의 PC를 사용 중이거나, Linux를 사용 중이거나, 혹은 MLX용으로 가중치(weights)를 다시 변환하지 않고 자유롭게 모델을 교체하고 싶다면 이 방법을 사용하세요.

speech-to-speech \
--llm_backend transformers \
--model_name "Qwen/Qwen3-4B-Instruct-2507"

팁: Qwen3-4B-Instruct-2507은 단일 소비자용 GPU에서 속도와 품질의 균형이 뛰어나기 때문에 LLM(대규모 언어 모델)을 위한 또 다른 좋은 선택지입니다. --model_name에 백엔드가 지원하는 Hugging Face (HF) 모델 중 무엇이든 지정할 수 있습니다. 예를 들어, 더 큰 규모의 Gemma, Qwen, 또는 Mistral 모델을 사용할 수 있습니다.

음성 엔진(voice engine)은 노트북에서 실행하고 대화 앱은 Reachy Mini Wireless에서 실행하는 경우, 변경되는 유일한 사항은 URL입니다. 엔진이 127.0.0.1뿐만 아니라 LAN 주소에 바인딩(bind)되도록 설정해야 하며, UI에서 IP를 선택할 때 로봇에서 노트북의 IP를 사용해야 합니다.

자신의 IP를 모른다면, 다음과 같은 방법으로 찾을 수 있습니다:

macOS

ipconfig getifaddr en0 # wifi
ipconfig getifaddr en1 # ethernet (때로는 en0이며, 환경에 따라 다름)

Linux

hostname -I

Windows

ipconfig

활성화된 어댑터 아래의 "IPv4 Address"를 찾으세요.

192.168.x.x 또는 10.x.x.x 형태의 주소를 찾아야 합니다. 만약 169.254.x.x가 보인다면, 실제로 네트워크에 연결된 상태가 아닙니다.

이제 완전히 로컬로 작동하는 음성 루프(voice loop)를 갖추게 되었습니다:

  • Silero를 통한 로봇의 청취,
  • Parakeet-TDT를 통한 전사(transcribing),
  • 로컬 MLX, 로컬 Transformers, 옆에 있는 vLLM 또는 llama.cpp 서버, 혹은 호스팅된 Responses API 엔드포인트 등 사용자가 선택한 LLM을 통한 사고,
  • 그리고 Qwen3-TTS를 통한 답변.

huggingface/speech-to-speechpollen-robotics/reachy_mini_conversation_app를 스타(Star) 해주시고, 여러분의 로봇에서 최종적으로 어떤 오픈 소스 캐스케이드(cascade)를 실행했는지 토론(discussions)에서 알려주세요.

AI 자동 생성 콘텐츠

본 콘텐츠는 HuggingFace Blog의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
1

댓글

0