Whisper Streaming

Whisper Streaming

2024년 11월 18일

아… #

오늘 STT 기능을 추가하기 위해 paddlespeech, wenet 등 중국 특화된 모델기반 라이브러리를 알아보고 paddleocr을 사용하는 입장에서 동일한 프로젝트면 좋겠지? 라고 생각하고 paddlespeech의 환경을 구성해봤다.

결론부터 말하자면 그냥 하루를 날렸다.
paddlespeech는 이상하게도 요구되는 pytion이나 paddle 버전이 낮았고, 막상 환경을 세팅해보니 paddleocr에서 사용하고 있는 디펜던시 라이브러리 numpy 와 충돌이 발생했다.
이녀석을 맞춰주려고 하루종일 노력해봤지만 결국 맞추지 못했다는 사실…

결국 포기하고 다른 녀석을 찾으러 떠났다.


Whisper Streaming #

예전에 그래픽카드도 별로고 훨씬 이전버전이였겠지만, 동일한 강의를 듣기 위해 web whisper를 돌려봤을땐 정말 구렸다.
안그래도 중국어가 방언까지 하면 너무 가짓수가 많아서 STT 정확도가 떨어진다고해서 중국에서 만든 paddlespeech나 wenet으로 눈이 돌아갔던 것이였다.

하지만 뭐 하루종일 아무것도 못한 나에겐 선택지가 없었다.

설치 #

설치 방법은 매우 간단했다.
CUDA 12 버전을 설치한 이후 원하는 백엔드를 선택하면 되는데, GPU를 지원하는 faster-whisper 를 권장하길래 이걸 사용하기로 했다.

1pip install librosa soundfile 
2pip install faster-whisper     # backend

사용법은 whisper_online 으로 오디오파일 경로를 입력으로 넣어 실시간으로 자막을 만드는 기능과 whisper_online_server 로 켜놓고 ffmpeg로 잘게 쪼개서 전달하는 방식이 있었다.

나는 완전히 실시간으로 사용해야 했기 때문에 server를 사용했다.

ffmpeg 설치 #

이 도구는 녹음장치에서 입력되는 오디오를 캡쳐할 수 있는 도구이다. 대충 공식 사이트에서 아래 이미지처럼 따라가고
다운 받은걸 압축 해제한 뒤 <압축해제 경로>\bin 을 PATH에 추가하면 된다. d56c6c59-40aa-4568-adc4-1e55e0bdb8c7

VB-Cable 설치 #

녹음 장치를 스테레오 믹스로 설정하면 된다고 했는데, 나는 드라이버 문제인지 PC가 문제인지 녹음이 전혀 안됐다.
VB-Cable은 가상 장치를 만들어서 PC의 출력을 가상 기기를 통해 가상입력장치로 넘길 수 있도록 도와주는 도구이다. (케이블로 연결)
역시 공식 홈페이지에서 다운받고 압축해제 경로에서 설치파일을 관리자 권한으로 실행시키면 된다.

d01b4e57-f7f9-4bc3-abfc-d5a936929d02

여기까지만 하면 녹음은 되지만 출력을 가상장치로 하고있기 때문에 나한테 들리지 않는다. 들리게까지 하려면 Output에서 또 출력할 장치를 선택해줘야한다.
그러니까 PC → Cable Input → Cable Output(ffmpeg로 녹음중) → 스피커로 출력 이 구조가 되면서 잘 들린다.

7f881d3e-d3fc-43b1-be60-da6582126368


테스트 #

장치를 확인하는 방법 #

1# ffmpeg가 인식 가능한 장치 확인 
2ffmpeg -list_devices true -f dshow -i dummy
3-> [dshow @ 0000020c732a9a80] "CABLE Output(VB-Audio Virtual Cable)" (audio)
4
5# 녹음 되는지 테스트
6ffmpeg -f dshow -i audio="CABLE Output(VB-Audio Virtual Cable)" output.wav

whisper_online_server.py 사용해보기 #

1# cmd 1
2git clone https://github.com/parktest0325/whisper_streaming_fork.git
3cd whisper_streaming
4python ./whisper_online_server.py
5
6# cmd 2
7ffmpeg -f dshow -i audio="CABLE Output(VB-Audio Virtual Cable)" -ar 16000 -ac 1 -f s16le tcp://localhost:43007

스티브잡스 스탠포드 연설을 사용해봤다. 디버그 로그들도 같이 출력돼서 잘 구분은 안되지만, 대충 영어로 들렸던 부분들이 실시간으로 표시되는 것을 확인할 수 있었다. d2747cea-839f-4196-9d08-d8bfc46193a7

어떻게 쓰는진 알았으니 이젠 subot에 같이 포함시켜보자.


중국어 테스트 #

목표는 중국어 STT이기 때문에 지금 모델도 괜찮은지, 다른 모델도 쓸 수 있는지 확인이 필요하다.

a150795f-7463-41a2-aa76-037005764ac4

large-v3 모델로 써봤는데 어느정도 잘 나오는 것으로 보이고 중간중간 x96dbg나 release 같은 용어도 인식 잘 하는것으로 봐선 번역을 돌릴때 정말 기대가 된다.

vram은 피크가 7GB 정도에서 작동했다.


Subot에 작업하기 #

whisper_online_server 코드를 참고해서 스레드를 두개 생성한다.

  • 받은 데이터가 완성되면 update_translator_text를 호출하는 서버역할
  • ffmpeg로 계속 오디오를 넣어주는 클라이언트 역할

포트 없이 구현하려다가 병목현상이 너무 심해서 결국엔 ffmpeg에서 바로 쏴주는 방식을 사용했다. 아마 ffmpeg에서 바로 쏴주면 자체적인 버퍼 관리를 통해 적당할때 보내주는 것 같다

적용은 했지만, 문장이 너무 짧게 번역돼서 알아들을 수 없기도 하고 분명 min_chunk_size를 지정해줬는데 제대로 동작하지 않는 것으로 생각되는 부분이 보인다.
강의니까 좀 더 길게 잡아줘도 될 것 같고

bb543d64-e7aa-421b-9f54-1eff0c475db4

GPU 사용량 #

77c037e6-7635-43dd-a935-d984dacc3694

comments powered by Disqus