번역 전처리? 문장완성 모듈?
2024년 11월 21일
서론 #
그냥 인식된 문장을 넣어서 무조건적인 번역을 할 수도 있지만 그렇게되면 번역 품질이 떨어지기 때문에 문장이 완성된 경우에 번역하는 등의 전처리가 필요할 것으로 생각됐다.
완성되지 않은 문장이 translator를 통해 번역되어버리면 이해할 수 없는 내용이 되기도 하기 때문에 문장이 완성되면 번역하도록 구현할 필요가 있다.
STT까지 완성하니 더욱더 절실히 필요성이 느껴졌다.
번역 텍스트에 대한 보증 #
번역기에 전달되기 전에 OCR과 STT의 동작을 일반화 시켜야 전처리나 번역에서 동작을 통일 시킬 수 있을거라고 생각한다.
영상에서의 자막 동작방식 #
- 영상 위에 자막이 있는 경우 뒤의 이미지는 매번 변하기 때문에 인식이 잘 안될 가능성도 있다.
- 자막이 어두운 영역에 표시되는 경우 이 경우도 영상의 화질이 급변할때 다시 인식될 수 있다.
- 자막이 “안녕” “안녕하세요” “안녕하세요반갑” “안녕하세요반갑습니다” 이런식으로 점점 단어가 붙는 형식도 있다.
- 자막이 나타났다가 사라지는 경우도 있다.
STT의 동작 방식 #
- 완성문장, 부분문장, 단어 스트리밍 방식 모두 가능하다.
- 부분 문장 형식에서는 “안녕” “안녕하세요” “안녕하세요반갑” “안녕하세요반갑습니다” 이런 형식이 가능하다.
지원범위 #
whisper streaming을 직접 subot에 적용해보니 단어 스트리밍 방식으로 동작하는 것 같다. 이미 전송된 단어는 중복되지 않는다고 하니 그냥 버퍼에 쌓아두다가 문장이 완성됐을때 번역을 시작하면 될 것 같다.
내가 원하는 강의들은 사실 OCR 기능에서도 점진적으로 추가되는 형식의 자막이 없기 때문에 그냥 필요하면 추후 지원을 하도록 하고 중복되지 않음을 기준으로 지원하면 될것같다.
구현 #
- whisper의 결과를 받아온다
- AI 모델로 문장이 완성됐는지 확인한다.
- 완성된 경우에만 번역기로 넘기고 그렇지 않으면 버퍼에 저장해둔다.
2번이 핵심인데 이걸 지원하는 ai 모델이 없는것 같다.
문장 생성 ai를 사용해서 생성해보고 길이가 변경되지 않으면 완성된 문장으로 보는 로직을 추천해줬다.
사용해보니 구둣점을 붙여주기 때문에 이걸로 완성된 문자열을 판단해도 될것같다.
일단 이 방식은 정상적으로 동작하지 않기 때문에 임시로 일단은 min-chunk-size를 좀 늘리고 이전 입력값까지 포함해서 번역하도록 수정했다.
1 if len(self.buffer) == 3:
2 complete_sentence = "".join(self.buffer)
3 self.buffer.pop(0)
4 return complete_sentence
5 else:
6 return None
총 3개의 문장까지 받아서 한꺼번에 번역하도록 했는데, 지금까지 시도중 제일 낫지만 여전히 이상하다..
아마 이 글은 계속해서 수정될 예정이다….