C.W.K.
Stream
Lesson 04 of 05 · published

배치 모델로 실시간 흉내 내기

~12 min · batch-vs-streaming, localagreement, real-time, preview

Level 0불씨 없음
0 XP0/36 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"추측을 삽입하고 되무를 순 없어. 그러니 추측이길 멈춘 부분만 삽입해."

불일치

Whisper 계열 모델은 근본적으로 배치 야: 오디오 덩어리를 주면 전사를 받아. 근데 좋은 받아쓰기는 스트리밍 처럼 느껴져 — 말하는 대로 단어가 나타나. 순진한 다리('30초 녹음, 한 번 전사, 붙여넣기')는 기술적으론 되지만 죽은 느낌이야: 말하는 동안 피드백 없음, 끝에 긴 멈춤. 라이브하게 느끼려면 배치 모델 위에 스트리밍을 흉내 내야 해 — 조심해서, 왜냐면 배치 모델이 더 들으면서 앞 단어에 대한 마음을 계속 바꾸니까.

LocalAgreement

비결은 엔진 위에 앉는 스트리밍 컨트롤러야. 롤링 버퍼를 유지하고, 오디오가 커지면서 배치 모델을 반복 돌리고, 각 새 가설을 이전 것과 비교해. 연속 두 패스가 접두부에 일치 하는 곳, 그 접두부가 커밋 돼 — 최종으로 보여줄 만큼 안정적이야. 아직 불일치하는 꼬리는 프리뷰로 보이되 절대 최종 취급 안 해. 그게 LocalAgreement 아이디어야: 연속 패스가 일치한 후에만 텍스트 확정, 미확정 꼬리는 보이게 유지, 안전할 때 문장 경계에서 버퍼 다듬기.

패스 N:    "보고서를 보내"
패스 N+1:  "보고서를 화요일에 보내"     접두부 일치 ->
           ^^^^^^^^  커밋됨                "보고서를"
                     ^^^^^^^^^^  아직 꼬리 -> 프리뷰만

# 일치한 접두부만 커밋. 휘발성 꼬리는 절대 삽입 안 함.

MVP 규율

말하는 동안 라이브 타이핑은 어려운 버전이고, 거기서 시작하는 건 함정이야. 솔직한 MVP 는 부분 전사를 오버레이에 프리뷰로 보이되 놓음 때 한 번만 삽입 해. 결정적으로, MVP 에서도 '커밋됨' 과 '미커밋' 을 내부적으로 분리해 — 그래서 진짜 라이브-타이핑 삽입을 더하는 날, 기계는 이미 있고 커밋된 텍스트가 어디로 가는지(오버레이 대신 앱으로)만 바꾸면 돼. 어려운 버전의 데이터 모델을 짓고; 쉬운 버전을 먼저 배포해.

되무를 수 있는 텍스트를 절대 삽입하지 마. 부분 가설을 삽입하고 라이브 앱에서 교정하는 건 유저 밑에서 글자를 지운다는 뜻 — 잘해야 덜컹, 나빠야 파괴적. 안정된 것(패스 간 일치)만 커밋; 휘발성 꼬리는 프리뷰로 둬. 유저는 교정을 겪지 않고 움직임을 봐.
어려운 버전을 모델링하고, 쉬운 걸 배포해. MVP 가 끝에 한 번만 삽입해도, 커밋-대-미커밋 상태를 내부적으로 추적해. 지금은 거의 공짜고 나중에 라이브-타이핑이 재작성이 아니라 작은 변경이란 뜻이야. 싼 전방-호환성이 두 번째-시스템 재구축을 이겨.

Code

일치한 접두부를 커밋, 꼬리는 프리뷰로·swift
struct StreamingState {
    var committed = ""   // 안정: 연속 패스가 일치함
    var tail = ""        // 휘발: 프리뷰로 보임, 아직 삽입 안 함
}

func onNewHypothesis(_ hypo: String, _ state: inout StreamingState) {
    let agreed = longestCommonPrefix(state.committed + state.tail, hypo)
    if agreed.count > state.committed.count {
        state.committed = agreed          // 새로 안정된 텍스트 승격
    }
    state.tail = String(hypo.dropFirst(state.committed.count))
    overlay.show(committed: state.committed, tail: state.tail)
    // MVP: 놓음 때만 insert(state.committed).
    // 나중 라이브-타이핑: 안정되는 대로 커밋 델타 삽입.
}

External links

Exercise

모델이 마음을 바꾸는 대로 모든 부분 가설을 유저 문서에 직접 삽입하면 유저가 뭘 보는지 묘사해. 그다음 LocalAgreement 버전을 묘사해. 어느 게 유저가 읽던 중인 단어를 지울 수 있고, 왜 '프리뷰' 가 휘발성 텍스트의 안전한 집이야?
Hint
직접-삽입은 모델이 수정하면서 앱이 이미 놓인 단어를 다시 쓴다는 뜻 — 커서 밑에서 글자가 사라졌다 다시 나타나. LocalAgreement 는 휘발성 텍스트를 유저가 잠정적이라 아는 프리뷰 오버레이에 두고, 바뀌길 멈춘 것만 진짜 문서에 써. 오버레이가 추측이 틀려도 되는 곳이야.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.