"추측을 삽입하고 되무를 순 없어. 그러니 추측이길 멈춘 부분만 삽입해."
불일치
Whisper 계열 모델은 근본적으로 배치 야: 오디오 덩어리를 주면 전사를 받아. 근데 좋은 받아쓰기는 스트리밍 처럼 느껴져 — 말하는 대로 단어가 나타나. 순진한 다리('30초 녹음, 한 번 전사, 붙여넣기')는 기술적으론 되지만 죽은 느낌이야: 말하는 동안 피드백 없음, 끝에 긴 멈춤. 라이브하게 느끼려면 배치 모델 위에 스트리밍을 흉내 내야 해 — 조심해서, 왜냐면 배치 모델이 더 들으면서 앞 단어에 대한 마음을 계속 바꾸니까.
LocalAgreement
비결은 엔진 위에 앉는 스트리밍 컨트롤러야. 롤링 버퍼를 유지하고, 오디오가 커지면서 배치 모델을 반복 돌리고, 각 새 가설을 이전 것과 비교해. 연속 두 패스가 접두부에 일치 하는 곳, 그 접두부가 커밋 돼 — 최종으로 보여줄 만큼 안정적이야. 아직 불일치하는 꼬리는 프리뷰로 보이되 절대 최종 취급 안 해. 그게 LocalAgreement 아이디어야: 연속 패스가 일치한 후에만 텍스트 확정, 미확정 꼬리는 보이게 유지, 안전할 때 문장 경계에서 버퍼 다듬기.
패스 N: "보고서를 보내"
패스 N+1: "보고서를 화요일에 보내" 접두부 일치 ->
^^^^^^^^ 커밋됨 "보고서를"
^^^^^^^^^^ 아직 꼬리 -> 프리뷰만
# 일치한 접두부만 커밋. 휘발성 꼬리는 절대 삽입 안 함.
MVP 규율
말하는 동안 라이브 타이핑은 어려운 버전이고, 거기서 시작하는 건 함정이야. 솔직한 MVP 는 부분 전사를 오버레이에 프리뷰로 보이되 놓음 때 한 번만 삽입 해. 결정적으로, MVP 에서도 '커밋됨' 과 '미커밋' 을 내부적으로 분리해 — 그래서 진짜 라이브-타이핑 삽입을 더하는 날, 기계는 이미 있고 커밋된 텍스트가 어디로 가는지(오버레이 대신 앱으로)만 바꾸면 돼. 어려운 버전의 데이터 모델을 짓고; 쉬운 버전을 먼저 배포해.