FluidVoice의 온디바이스 동작 원리와 내부 아키텍처
FluidVoice가 클라우드 연결 없이도 높은 정밀도와 신속성을 유지하는 비결은 파이프라인의 각 단계가 Apple Silicon 하드웨어 특성에 맞춰 정밀하게 설계되었기 때문이에요.
저지연 오디오 캡처와 Core ML 기반 STT 모델
사용자가 단축키를 누르는 순간 macOS의 Core Audio 프레임워크가 실시간 PCM 오디오 스트림을 캡처합니다. 고비율 샘플링 데이터를 작은 버퍼 단위로 쪼개어 메모리 지연을 극소화해요.
수집된 오디오 버퍼는 Apple Silicon의 Neural Engine 가속을 받도록 변환된 Core ML 기반 음성 인식 모델(Parakeet 또는 Whisper 계열)로 바로 전달됩니다. 이 단계에서 연산 지연 시간을 최소화함으로써 사용자가 말을 마치는 즉시 1차 원시 텍스트가 완성됩니다.
%%{init: {"theme":"base","themeVariables":{"primaryColor":"#F0EEE9","primaryBorderColor":"#2a78d6","primaryTextColor":"#2b2926","secondaryColor":"#e8f0fb","secondaryBorderColor":"#4a3aa7","secondaryTextColor":"#2b2926","tertiaryColor":"#eafaf3","tertiaryBorderColor":"#1baf7a","tertiaryTextColor":"#2b2926","lineColor":"#8a8578","textColor":"#2b2926","edgeLabelBackground":"#F0EEE9","noteBkgColor":"#F0EEE9","noteTextColor":"#2b2926","noteBorderColor":"#8a8578","clusterBkg":"#faf9f6","clusterBorder":"#d8d4c8","fontFamily":"Pretendard, sans-serif"}}}%%
sequenceDiagram
autonumber
actor User as 사용자
participant App as FluidVoice 앱
participant Audio as Core Audio Engine
participant Model as Core ML STT Engine
participant Enhancer as Fluid-1 Model
participant System as macOS Accessibility
User->>App: 단축키 입력
App->>Audio: 녹음 시작
User->>App: 단축키 해제
App->>Audio: 녹음 중단
Audio->>Model: 오디오 버퍼 전송
Model->>App: 원시 텍스트 반환
App->>Enhancer: 원시 텍스트 및 프롬프트 전송
Enhancer->>App: 정제된 문장 반환
App->>System: 활성 입력창에 텍스트 주입
10만 건 데이터로 학습된 Fluid-1 후처리 LLM
1차로 생성된 원시 텍스트는 FluidVoice만의 자체 언어 모델인 Fluid-1로 진입해요. 개발진은 10만 건 이상의 실제 구어체 받아쓰기 합성 데이터셋을 구성하여 Fluid-1 모델을 직접 파인튜닝했습니다.
Fluid-1 모델은 단순히 문법 검사를 하는 수준을 넘어섭니다. 문맥 내의 대소문자 정렬, 문장부호 삽입, 중복 표현 제거는 물론, 사용자의 어조 가이드라인을 이행해요. 모델의 크기는 약 3GB 수준으로, 로컬 디스크 및 메모리에 상주하면서 밀리초 단위로 텍스트를 재작성합니다.
%%{init: {"theme":"base","themeVariables":{"primaryColor":"#F0EEE9","primaryBorderColor":"#2a78d6","primaryTextColor":"#2b2926","secondaryColor":"#e8f0fb","secondaryBorderColor":"#4a3aa7","secondaryTextColor":"#2b2926","tertiaryColor":"#eafaf3","tertiaryBorderColor":"#1baf7a","tertiaryTextColor":"#2b2926","lineColor":"#8a8578","textColor":"#2b2926","edgeLabelBackground":"#F0EEE9","noteBkgColor":"#F0EEE9","noteTextColor":"#2b2926","noteBorderColor":"#8a8578","clusterBkg":"#faf9f6","clusterBorder":"#d8d4c8","fontFamily":"Pretendard, sans-serif"}}}%%
stateDiagram-v2
[*] --> APP_STATE_IDLE
APP_STATE_IDLE --> APP_STATE_RECORDING : 단축키 누름
APP_STATE_RECORDING --> APP_STATE_TRANSCRIBING : 단축키 뗌
APP_STATE_TRANSCRIBING --> APP_STATE_ENHANCING : STT 완료
APP_STATE_ENHANCING --> APP_STATE_INJECTING : Fluid-1 교정 완료
APP_STATE_INJECTING --> APP_STATE_IDLE : 텍스트 주입 완료
Apple Silicon 통합 메모리와 macOS 접근성 API 연동
Apple Silicon 시스템은 CPU, GPU, Neural Engine이 동일한 물리 메모리 영역을 공유하는 통합 메모리(Unified Memory) 아키텍처를 채택하고 있습니다. FluidVoice는 오디오 데이터 및 모델 가중치를 CPU와 GPU 사이에서 별도로 복사할 필요가 없어 메모리 이동에 따른 오버헤드가 없어요.
%%{init: {"theme":"base","themeVariables":{"primaryColor":"#F0EEE9","primaryBorderColor":"#2a78d6","primaryTextColor":"#2b2926","secondaryColor":"#e8f0fb","secondaryBorderColor":"#4a3aa7","secondaryTextColor":"#2b2926","tertiaryColor":"#eafaf3","tertiaryBorderColor":"#1baf7a","tertiaryTextColor":"#2b2926","lineColor":"#8a8578","textColor":"#2b2926","edgeLabelBackground":"#F0EEE9","noteBkgColor":"#F0EEE9","noteTextColor":"#2b2926","noteBorderColor":"#8a8578","clusterBkg":"#faf9f6","clusterBorder":"#d8d4c8","fontFamily":"Pretendard, sans-serif"}}}%%
classDiagram
class CODE_AUDIO_CAPTURE {
+startStream()
+stopStream()
+getPCMBuffer()
}
class CODE_STT_ENGINE {
+loadModel()
+transcribe(buffer) String
}
class CODE_FLUID_TRANSFORMER {
+loadWeights()
+refine(rawText, mode) String
}
class CODE_ACCESSIBILITY_INJECTOR {
+pasteToActiveWindow(text)
}
CODE_AUDIO_CAPTURE --> CODE_STT_ENGINE
CODE_STT_ENGINE --> CODE_FLUID_TRANSFORMER
CODE_FLUID_TRANSFORMER --> CODE_ACCESSIBILITY_INJECTOR
문맥 교정이 끝난 최종 텍스트는 macOS의 Accessibility API(접근성 API)를 활용하여 현재 포커스가 맞춰진 애플리케이션의 커서 위치로 주입됩니다. 클립보드 이력을 더럽히지 않고 실제 키보드 타이핑 이벤트를 시뮬레이션하기 때문에 시스템 전반의 모든 앱에서 유연하게 작동해요.
{"type":"bar","data":{"labels":["Wispr Flow","Superwhisper","FluidVoice"],"datasets":[{"label":"월 구독료 (USD)","data":[15,10,0]},{"label":"네트워크 외부 유출 (KB)","data":[300,120,0]}]}}