문서 쪽이 어느 정도 자리를 잡을 무렵 현장 직원에게서 요청이 왔다. 게시판에 붙은 안내문을 사진으로 찍어 올리고 말로 물어보게 해 달라는 것이었다. 장갑을 낀 손으로는 휴대폰 자판을 누를 수가 없어서, 궁금한 것이 생겨도 사무실에 돌아올 때까지 미뤄 두고 있다고 했다.
그러면 텍스트 질의응답 앞에 해석 단계가 둘 더 붙는다. 사진에서 문장을 읽어야 하고 음성을 질문으로 바꿔야 한다. 최종 답이 틀렸을 때 검색이나 언어 모델만 보면 앞 단계에서 이미 바뀐 숫자와 고유명사를 놓친다. 개발팀은 가상 교육비 문서를 이미지로 만들어 OCR로 읽어 보고, 같은 주제의 질문을 합성 음성으로 만들어 로컬 음성 인식 모델에 넘겨 봤다. 영상과 이미지 생성은 이번에 봇에 붙이지 않았다.
변환 단계의 자리
멀티모달(multimodal)은 여러 종류의 입력이나 출력을 함께 다룬다는 뜻이다. 이미지 입력이 되는 모델이 음성도 받는다고 볼 수 없다. 음성을 받더라도 전사·번역·화자 구분·음성 응답을 하나씩 따로 확인한다. 모델과 API를 고를 때 작업별 지원 여부, 입력 한도, 응답 형식, 시간 정보 제공 여부를 각각 본다.
텍스트로 바꾼 뒤 기존 파이프라인에 붙이는 방식은 중간 결과를 검사하기 쉽다. OCR 텍스트와 음성 전사를 화면에 보여 주면 사용자가 오류를 고칠 수 있다. 대신 표의 배치, 그림의 관계, 말투 같은 정보는 텍스트로 옮기면서 사라진다. 원본 매체를 직접 이해하는 모델이라면 그 정보까지 쓸 수 있지만 그러려면 개발팀이 결과를 검증할 기준과 매체별 비용을 따로 마련해야 한다. 개발팀은 첫 구현에서 변환 단계를 그대로 드러내 뒀다. 이미지에서 뽑은 텍스트는 검토 전 자료고 음성 전사는 아직 확인하지 않은 질문이다.
OCR
OCR은 문자 모양을 텍스트로 바꾼다. Tesseract는 공개 인식 도구로 텍스트 외에 TSV·hOCR 출력도 지원하고, 한국어 인식에는 한국어 학습 데이터가 필요하다. 인식 품질은 해상도, 기울기, 배경, 글자 크기에 따라 달라진다. 개발팀은 흰 배경에 두 문장을 그린 1,400×280 이미지를 만들어 Tesseract에 넣었다. 문장은 “교육비는 분기당 30만 원이다”와 “수강 전에 팀장의 승인을 받아야 한다”다. Tesseract 공식 저장소
외부 인식 도구를 부를 때는 인자를 목록으로 넘긴다. 파일 이름을 문자열 명령에 끼워 셸로 실행하지 않는다. 페이지 분할 모드 6은 이 표본이 일정한 텍스트 블록 하나라서 고른 값이고, 다단 문서나 표에는 읽기 순서를 바꾸는 레이아웃 오류까지 봐야 한다. 문서 질의에 쓸 때는 추출 텍스트에 원본 문서 ID, 페이지, 인식 도구 버전, 검토 상태를 더해 다섯 가지를 저장한다. 좌표가 있는 출력이면 인용에서 원본 영역으로 되돌아갈 수 있지만, 글자만 뽑아낸 일반 텍스트로는 좌표도 표의 셀 관계도 복원하지 못한다. 정책으로 색인하기 전에 사람이 원본과 대조한다.
“오른쪽 열의 승인자는 누구인가”처럼 배치를 봐야 답이 나오는 질문에는 OCR을 건너뛰고 시각 언어 모델에 이미지를 그대로 넘기기도 한다. 비교할 때는 같은 이미지를 주고 정답 문구뿐 아니라 정답이 있는 영역도 적는다. OCR 텍스트에 없는 관계를 텍스트 모델이 추측한 결과와 원본 이미지에서 확인한 결과를 섞어 채점하지 않는다.
음성 인식과 합성
자동 음성 인식(ASR)은 소리에서 텍스트를, 음성 합성(TTS)은 텍스트에서 소리를 만든다. 인식은 “교육비”를 다른 단어로 바꾸고 합성은 문자가 정확해도 숫자·약어를 부자연스럽게 읽는다. Whisper는 음성 인식과 번역을 하는 인코더·디코더 모델이고, 개발팀은 다국어 whisper-tiny를 고정 리비전으로 불러 한국어 전사를 지정했다. 오래된 예제의 설정을 현재 라이브러리에 그대로 옮기지 않고 모델 카드와 설치된 Transformers 문서를 함께 본다. Whisper 공식 저장소, Transformers Whisper 문서
오디오는 먼저 모노, 16kHz, 16비트 PCM WAV로 바꾼다. 모델에 넘기는 숫자 배열과 표본 주파수가 실제 파일과 같아야 하고, 주파수 값만 바꿔 적는 것은 재표본화가 아니다. 변환한 뒤에는 채널·샘플 폭·주파수를 다시 확인한다. 이번에는 30초 이하의 짧은 입력만 받았다. 긴 녹음의 구간 분할, 화자 중첩 처리, 스트리밍 중간 결과, 무음 탐지는 따로 만들어야 한다. 중간 전사를 확정 질문으로 처리하면 사용자가 문장을 끝내기도 전에 봇이 다음 일을 시작한다. 합성 음성은 macOS의 Yuna 음성으로 만들었다. 운영체제에 설치된 음성이 읽은 가상 질문이라 실제 사용자의 억양·소음·거리·발화 중단을 대표하지 못한다. FFmpeg 공식 명령 문서
실제 변환 결과
깨끗한 문서 이미지 한 장에서 CER이 0이어도 실제 스캔 문서에서는 글자가 깨진다. 게다가 짧고 깨끗한 합성 질문인데도 음성 인식은 업무의 핵심 단어를 통째로 다른 말로 바꿔 놓았다. 전사를 화면에 보여 주고 사용자가 고칠 경로가 있어야 한다. 인식이 틀린 자리도 원래 질문으로 고쳐 적지 않고 그대로 뒀다. 원본·전사·정답·모델 리비전과 시간은 함께 적어 뒀다. 개발팀은 OCR 텍스트와 음성 전사를 자동 승인해 운영 색인이나 티켓 실행에 붙이지 않았다.
영상
영상은 순서와 시간이 있는 프레임에 음성이 결합된 자료다. 일정 간격으로 이미지를 뽑으면 계산량은 줄지만 두 표본 사이의 짧은 사건이 빠진다. “마지막으로 버튼을 누른 시점”을 묻는 질문에 프레임 몇 장의 유사도만으로는 답할 수 없다. 더 나아가려면 직접 만든 짧은 화면 녹화에 세 사건의 정답 시각을 적고, 고정 간격 추출과 장면 변화 기반 추출을 비교한다. 각 프레임에는 원본 ID, 실제 표시 시각, 추출 설정을 함께 두고 오디오 구간과 프레임의 시간 기준을 맞춘다. 개발팀은 영상 추출·이해 모델을 아직 돌려 보지 않았다. 비교 실험을 어떻게 짤지까지만 적어 두고 다음으로 미뤘다.
이미지 생성과 채택 기준
설명용 그림에서는 요구한 요소가 다 들어갔는지, 요소끼리 관계가 맞는지, 글자를 읽을 수 있는지, 여러 번 만들어도 같게 나오는지를 본다. 생성 이미지에 그럴듯한 정책 문구가 있어도 실제 문서의 근거가 되지 못한다. 확산 기반 생성은 잡음에서 시작해 조건에 맞는 이미지를 단계적으로 만들고, Diffusers의 파이프라인은 텍스트 인코더·생성 모델·스케줄러를 모델에 맞게 묶는 대표적인 도구다. 모든 파이프라인에 같은 옵션이 있다고 볼 수 없다.
가상 사무실 안내 그림을 만들 때는 사람의 실제 사진이나 기밀 자료를 쓰지 말고, 무엇을 그려 달라고 했는지와 시드·모델·해상도·스텝·시간을 함께 적어 둔다. 같은 환경에서 다시 돌렸을 때 같은 그림이 나오는지와 장치를 바꿔도 픽셀까지 같은지는 따로 확인한다. OCR 표본은 코드로 글자를 찍어 만든 이미지라 몇 번을 다시 그려도 같은 그림이 나온다. 생성 모델이 만든 이미지로는 재 보지 않았다. Diffusers 파이프라인 문서
매체를 채택할 때는 전체 흐름의 오류와 지연을 합쳐 본다. OCR 뒤의 질의응답에는 문자 오류 외에 숫자·표 관계·인용 위치 오류가, 음성 질문에는 핵심 의도 보존과 확인에 걸린 시간이 있다. 빠른 인식기가 사용자에게 반복 수정을 요구하면 인식 시간만 짧다는 이유로 채택할 수 없다.
장갑을 낀 채로 묻고 싶다던 현장 직원의 요청은 인식기를 하나 붙이는 일로 끝나지 않았다. 개발팀은 사진에서 글자를 읽어 낸 다음에도 그 글자가 어느 문서의 어느 줄인지를 다시 찾아야 했다.