0. 개요
"실시간 STT" Real time STT 또는 Streaming STT 라고도 불립니다.
"[Voice] 실시간 STT 연구를 위한 선행 지식과 학습 로드맵" 에서는 지금까지 실시간 STT를 구현하기 위해 필요한 여러 선행 연구와 개념들을 순차적으로 정리하고자 합니다.
1. OpenAI/Whisper 실시간 STT에 적합하지 않다.
현재 ASR 분야에서 가장 성능이 뛰어나다고 알려진 모델은 OpenAI의 "Whisper"입니다.
Whisper는 CNN과 트랜스포머를 결합한 구조를 가지고 있습니다. 이러한 구조를 가진 Whisper를 일반적으로 적용 가능한 모델로 훈련하기 위해 OpenAI는 다양한 환경과 녹음 설정, 화자, 언어를 포함한 680,000 시간 이상의 레이블 데이터를 수집했습니다. 이를 통해 Whisper의 Encoder-Decoder Transformer 아키텍처를 엔드 투 엔드로 학습시켰습니다. 이로 인해 Whisper는 다양한 작업에서 zero-shot 학습에 뛰어난 성능을 보이게 되었습니다.
그러나, OpenAI Whisper의 설계 목적은 다목적 음성 인식 및 처리이며, 이를 통해 자막 생성, 번역, 음성 텍스트화 등 다양한 작업을 수행할 수 있도록 설계되었습니다. 하지만 Whisper는 실시간 STT에 특화된 모델은 아닙니다.
그 이유는 다음과 같습니다.
1. Whisper는 트랜스포머 기반으로 설계되어 전체 입력 시퀀스를 처리해야 한다.
- 즉, 실시간 처리를 염두에 두고 설계되지 않았으며, 입력 음성 데이터 전체를 분석 후 처리하는 배치 처리 방식에 적합하다는 것입니다.
2. Whisper는 완전한 문장으로 학습된 모델이다.
- Whisper는 전체 컨텍스트를 이해하고, 문장 단위로 텍스트를 변환하는 데 최적화되어 있기 때문에, 실시간 STT에서는 음성 인식 과정에서 문맥을 고려한 정확도를 높이는 장점을 활용할 수 없습니다.
- 그 이유는 tokenizer 기반의 디코딩 방식을 사용하는 Whisper는 단순히 발화된 음성을 텍스트로 바꾸는 것이 아니라 문장 구조와 의미를 고려하여 문맥에 맞는 출력 결과를 생성한다는 것입니다. 이것은 장점이 될 수도 있지만 고객이 실제로 발화하지 않은 단어나 문장을 생성할 가능성도 있습니다.
- 실시간 STT에서는 주로 0.32초 또는 1초 단위로 실시간 STT를 진행하는데 이 짧은 시간 안에는 완성된 문장이 들어갈 가능성이 거의 없기 때문입니다. (보통 사람은 한글자를 발음하는데 0.08초 ~ 0.12가 소요됨.)
3. 30초 단위의 청크를 기반으로 추론한다.
- 30초 단위의 청크를 기반으로 추론하기때문에 불필요한 latency가 발생하고, 실시간적으로 토큰을 필요하는 상황과 맞지 않습니다.
- 이는 Whisper 모델이 학습 시 음성을 30초 단위의 청크로 나눠 학습했기 때문인데, whisper의 feature extractor 함수를 살펴보면 chunk_length가 30초인 것을 확인할 수 있습니다.
이러한 문제로 Whisper를 사용해서 실시간 STT를 구현하는 것은 적합하지 않습니다.
2. Real Time STT
이 방식은 음성을 녹음이 끝난 후 전체를 처리하는 방식이 아니라 일정 단위(패킷)로 버퍼를 쌓으며 음성이 입력되는 대로 실시간으로 텍스트로 변환하는 것이 목표입니다.
이를 구현하기 위한 주요 조건은
- 지연 시간 최소화 : 짧은 지연으로 실시간 변환을 제공해야 합니다.
- 프레임 단위 처리 : 음성을 일정 크기의 프레임으로 나누어 순차적으로 처리.
- 스트리밍 프로토콜 : 음성 패킷을 UDP / TCP를 통해 실시간으로 전송할 수 있어야 합니다.
- 종단점 감지 : 발화가 끝났음을 감지하는 기능이 포함되어야 합니다.
이 외에도 고려해야할 점이 많이 있지만, 추후에 조금씩 언급을 할 것이고 자세한 부분은 생략하고 진행할 수도 있습니다.
아무튼 이러한 Real Time STT을 구현하기 위해서는 디지털 음성 신호 처리에 대한 이해, UDP /TCP, 트랜스포머에 대한 이해, ASR 그리고 Whisper에 대한 이해 등 다양한 선행 지식이 필수적으로 필요합니다.
선행 지식들을 순차적으로 학습하면 위의 Whisper 모델의 구조와 작동원리를 더 깊게 이해할 수 있고, 어떻게 하면 실시간 STT를 구현할 수 있을지 다양한 측면에서 고려할 수 있을지에 대한 인사이트를 얻을 수 있기 때문입니다.
이에 직접 실시간 STT를 구현하면서 공부한 로드맵을 조금 정리해봤는데 기억을 더듬어서 작성한 것이다보니 까먹은 부분도 있을 것이고... 여러 리서치를 진행하면서 구현한 핵심적인 기술에 대한 설명은 자세하게 하지 않고 넘어간 부분이 많습니다. 하지만 전체적인 흐름과 같은 부분을 따라오시면서 좀 더 깊게 파고드시다 보면 더 많은 지식을 얻어가실 수 있을 것 같습니다.
그럼 앞으로 시간이 될 때마다 조금씩 업로드를 진행해보도록 하겠습니다.
그리고... 제가 작성한 글 역시 정답은 아니고 저 역시 리서치 하는 과정에서 얻은 정보이기 때문에 틀린 정보는 지적해주시면 감사하겠습니다.
3. Real-Time Speech-to-Text (STT) Learning Roadmap
- 컨볼루션 신경망 (CNN)
- CNN의 기본 구조와 원리 : https://mz-moonzoo.tistory.com/63
- 필터와 풀링 개념 : https://mz-moonzoo.tistory.com/63
- 음성 데이터 특징 추출 (1D Convolution, 2D Convolution) : https://mz-moonzoo.tistory.com/64
- 시퀀스 모델링
- RNN (Recurrent Neural Network) : https://mz-moonzoo.tistory.com/80
- LSTM (Long Short-Term Memory)
- GRU (Gated Recurrent Unit)
- 어텐션 메커니즘
- 기본 어텐션의 개념과 작동 원리
- 셀프 어텐션
- 트랜스포머 아키텍처
- Attention is All you need 논문 리뷰 및 구현
- 인코더-디코더 구조
- 멀티헤드 어텐션
- 포지셔널 인코딩
- 음성 신호 처리
- 음성 신호 처리 기본 : https://mz-moonzoo.tistory.com/62, https://mz-moonzoo.tistory.com/66
- 스펙트로그램과 멜 스펙트로그램 : https://mz-moonzoo.tistory.com/62
- μ-law decompression / μ-law compression
- Bit Conversion, Resampling : https://mz-moonzoo.tistory.com/67, https://mz-moonzoo.tistory.com/68, https://mz-moonzoo.tistory.com/75
- VAD
- 실시간 음성 인식 시스템
- VoIP Infra (VoIP, SIP, PBX...) : https://mz-moonzoo.tistory.com/48
- 음성 데이터 스트리밍을 위한 통신 프로토콜 (Socket, TCP/UDP)
- 실시간 음성 신호 수집 및 처리 (Payload, header...)
- OpenAI / Whisper
- Whisper 논문 리뷰
- Whisper 모델의 구조 CNN + Transformers
- Whisper Feature Extractor
- Whisper 장점과 한계점
- Whisper 파인튜닝을 위한 데이터 전처리 및 학습 방법
- Faster-Whisper. (Whisper with Ctranslate2)
- Ctranslate2 (파인튜닝한 Whisper를 Ctranslate2를 이용해 Faster-whisper로 변환)
- Faster-Whisper Input data format (주파수, bit)
- Faster-Whisper Feature Extractor (적절 패킷 단위)
- Faster-Whisper inference Parameters (VAD, word_timestamp...)
- Faster-Whisper turbo (only 4 decoder layers)
- Whisper-Streming
- Local Agreement
- Prompt tokens
- wordtimestamp
여기까지가 우선은 제가 공부했던 내용을 기반으로 생각나는 대로 정해봤습니다.
그러나, Faster-whisper까지 사용해서 실시간 STT를 구현하여도 트랜스포머 구조상 문제가 되는 부분이 존재하긴 합니다.
하지만 위의 흐름 정도는 이해해야 실시간 STT를 구현할 수 있고, 이를 더 디벨롭할 수 있을 것입니다.
마지막으로... 앞서 말씀드렸듯이 빠진 부분이 있을 것이고, 정확한 정보를 전달드리기 어려운 부분도 있지만 위의 로드맵을 기준으로 앞으로 조금씩 업로드를 진행하도록 하겠습니다.
https://github.com/moonjoo98/Real-Time-Speech-to-Text_Learning-Roadmap
'DL > Voice' 카테고리의 다른 글
[Voice] Audio Processing Libraries (feat. 8bit convert to 16 bit) (3) | 2024.09.25 |
---|---|
[Voice] pyVoIP - Python으로 작성된 VoIP 라이브러리 (1) | 2024.09.20 |
[Voice] 딥러닝 음성 처리 파이썬 실습 - 16K / 8K 비교, 음성 데이터 연산 (0) | 2024.06.12 |
[Voice] 디지털 신호(음성) 처리 개념 정리 (3) - 16 Bit, 44.1 kHz / PCM (1) | 2024.06.12 |
[Voice] 디지털 신호(음성) 처리 개념 정리 (2) - 나이퀴스트 이론 / 앨리어싱 현상 (0) | 2024.06.12 |