푸시투토크의 마감 처리
F13 을 누르고 말하고 떼면 글자가 된다. 행복 경로는 하루면 만든다. 문제는 그 바깥이다. 키가 눌린 채 장치가 빠지면? 아무 말 없이 떼면? 말하다 후회하면? 음성 딕테이션 클라이언트의 가장자리 세 곳을 마감한 기록.
가장자리 1: 키가 영원히 눌려 있다
녹음 루프의 원형은 순진했다. 키가 눌려 있는 동안 기다린다, 끝. 그런데 F13 이 눌린 채 장치가 통째로 빠지면 Windows 는 keyup 을 영영 받지 못하고, 키 상태 조회는 계속 "눌림"을 돌려준다. 루프는 안 끝나고, 녹음은 메모리에 무한히 쌓이고(16kHz 16bit mono 기준 시간당 약 115MB), 무엇보다 F13 이 완전 무반응이 된다. 이 머신의 F13 발행자는 유령 펌웨어 전력이 있는 매크로패드라, 가정이 아니라 실제 위험이다.
처방은 90초 상한. 그런데 상한만 걸면 두 번째 함정이 기다린다. 상한에서 끊고 바로 다음 루프로 돌아가면, 키는 여전히 "눌림"이라 즉시 재녹음이 시작되고 90초짜리 녹음이 무한 반복된다. 그래서 상한 후에는 키가 실제로 풀릴 때까지 파킹하고, 파킹이 길어지면 주기적으로 경고를 울려 키 고착을 알린다.
상한에 걸린 녹음을 버리지 않는 것도 결정이다. 진짜 스턱이면 내용이 룸톤뿐이라 음성 구간 필터가 걸러 빈 결과가 되고, 진짜 90초 발화였다면 사용자는 그 내용을 원한다. 어느 쪽이든 버릴 이유가 없다.
가장자리 2: 아무 말도 안 하고 뗐다
이 시스템의 초기 버전에는 유명한 증상이 있었다. 무음을 보내면 "다음 영상에서 만나요"나 "감사합니다"가 주입되는 것. whisper 계열 모델이 학습 데이터의 영상 마무리 멘트를 무음에 환각하는 고전적 증상이다. 음성 구간 필터(VAD)를 켜서 해결했는데, 그러자 새 사각지대가 생겼다. 무음의 결과가 이제 "아무것도 아님"이라, 성공과 소리로 구분이 안 된다.
틀린 텍스트가 들어오던 시절에는 적어도 뭔가 일어난 것은 알 수 있었습니다. 고치고 나니 이번에는 아무 일도 안 일어나서, 잘된 것인지 안 된 것인지 소리로는 알 수 없게 됐습니다. 수리가 새 구멍을 팠습니다.
그래서 빈 결과에 전용 큐 사운드를 붙였다. 너무 짧게 눌러 스킵되는 경로도 "아무 일도 안 일어남"이라는 점에서 같은 부류라, 같은 큐로 묶었다.
가장자리 3: 말하다 후회했다
잘못 말한 것을 깨달아도 주입을 막을 방법이 없었다. 떼면 무조건 전사되고, 들어간 텍스트를 사후에 지워야 한다. 이제 F13 을 뗄 때 Esc 를 같이 누르고 있으면 전사·주입을 통째로 건너뛴다. 서버에 요청 자체를 보내지 않으니 GPU 추론도 아낀다. 어차피 버릴 결과다.
구현에서 중요한 것은 한 줄이다. Esc 상태는 키 대기 루프를 빠져나온 직후 즉시 표집해야 한다. 녹음 파일 정리와 큐 재생을 거친 뒤에 읽으면, 그 수십에서 수백 ms 사이에 사용자가 Esc 를 떼어 취소 의사를 놓친다.
소리 팔레트: 무소식에도 종류가 있다
세 가장자리를 막고 나니 클라이언트가 내는 소리가 다섯 가지가 됐다. 전부 Windows 내장 wav 라 외부 자산이 없다.
| 상황 | 큐 | 뜻 |
|---|---|---|
| 녹음 시작 | Speech On.wav | 듣고 있다 |
| 녹음 종료 | Speech Off.wav | 전사하러 갔다 |
| 전사·주입 실패 | Speech Misrecognition.wav | 뭔가 잘못됐다 |
| 빈 결과 / 너무 짧음 | Speech Sleep.wav | 들었는데 건질 게 없다 |
| 사용자 취소 (Esc) | chord.wav | 버렸다, 의도대로 |
취소 큐로 chord.wav 를 고른 근거는 취향이 아니라 실측이다. 후보 wav 들의 영교차율(zcr)을 재서 기존 세 큐와 청각적으로 가장 멀리 떨어진 것을 골랐다. 빈 결과(인식 실패)와 취소(의도된 폐기)는 원인이 다르므로 소리도 달라야 한다. 포그라운드 콘솔을 보지 않는 사용자에게는 이 소리들이 유일한 UI 다.
배운 것
- 푸시투토크의 적은 오인식이 아니라 "아무 일도 안 일어남"이다. 그 무소식을 스턱, 빈 결과, 취소로 갈라 각각 다른 소리를 주는 것이 마감의 대부분이었다.
- 상한을 걸 때는 상한 이후를 설계해야 한다. 끊고 돌아가면 무한 반복이 기다린다. 파킹까지가 상한이다.
- 버그 수정은 사각지대를 이동시킨다. 환각 텍스트를 지웠더니 침묵이 새 버그가 됐다.
행복 경로는 하루, 가장자리 셋은 또 하루였습니다. 그래도 이제 마이크가 어떤 기분인지 소리만 듣고 알 수 있습니다. 보고서를 눈으로 읽지 않아도 되는 시스템이 좋은 시스템입니다.