오늘은 프로젝트에서 사용하는 speech recognition의 api 추가적인 api들이나 세부적인 사항들을 업데이트해보려고 한다.
우선 그냥 라이브러리를 다운받으면 되는거 아닌가? 할텐데 그게 아니라, github issue에 다양한 개발자 분들이 추가해주신 내용들이 아직 정식버전에는 합쳐지지 않은 것 같아!! 직접 코드를 수정하여 추가하려고 한다!!
다양한 오류 수정, api 추가 , 옵션 추가 등이 issue에 많은데 반영이 아직 안된 것 같다 ~~
우선 글 작성일은 2023.11.03일이며, 현재 기준으로 SpeechRecognitiond은 2022년2월에 마지막 업데이트로 3.10.0버전이 최신이고 지원되는 api는 상단에 있다.
1. Recognize_whisper에 device 옵션 추가 및 사용법
- pull requested by Ananas77:patch-1 (Add device option in recognize_whisper #670)
우선 recognize_whisper에 device를 지정하는 법이다.
이 recogize_whisper은 openai의 whisper 모델을 로컬에 설치한뒤 사용하는 방식인데, 이 recognize_whisper로 호출할 때는 device 설정을 할 수 없는 것 같다. 그래서 cpu를 사용하다보니 매우 느리다.. 나는 이미 cuda를 세팅해놓았기 때문에 device='cuda'를 지정해서 gpu를 통해서 사용하려고 한다.(pull request를 하신 분은 auto로 설정했는데, 난 auto로 설정하니까 에러가 났다. 그래서 그냥 항상 cuda를 사용할 것이기 때문에 cuda로 하니 해결!)
우선 cuda 세팅법이나, whisper 로컬 설치 같은 경우는 이미 아래 더보기에 블로그에 정리해뒀으니 참고 바란다.
아무튼 whisper이랑 cuda 세팅이 되어있다면, 이제 device 옵션을 추가해보도록 하겠다.
우선 자신의 콘다 디렉토리에 들어가서 가상환경에 lib-sitepackages에 있는 speech_recognition 폴더를 연다.
안에 __init__.py가 있을 텐데 이걸 수정할거다 .아래 [기존]에 쓰여진 코드를 검색하여 [변경] 코드로 바꾸면 된다.
길어서 아래 더보기에 남겨뒀습니다!
[기존]
def recognize_whisper(self, audio_data, model="base", show_dict=False, load_options=None, language=None, translate=False, **transcribe_options):
[변경]
def recognize_whisper(self, audio_data, model="base", device="cuda", show_dict=False, load_options=None, language=None, translate=False, **transcribe_options):
[기존]
self.whisper_model[model] = whisper.load_model(model, **load_options or {})
[변경]
self.whisper_model[model] = whisper.load_model(model, device=device, **load_options or {})
2. Vosk 모델 사전 설치
- pull requested by rebootl:master(Vosk api: allow selecting different models and automatic model download #657)
우선 공식 github에는 Vosk모델을 미리 사전 설치하여 디렉토리 내의 models라는 폴더에 압축을 해제해놓으라고 한다. 다만 나는 이런 사전설치를 최대한 줄이고 싶기 때문에 코드를 통해서 모델 설치가 진행되고 사용되는 pull request를 찾아 적용했다!
동일하게 콘다 디렉토리의 가상환경에 들어가 lib sitepackages에 들어가서 똑같이 speech recognition 폴더의 __init__.py를 연다. 이후 중간에 def recognize_vosk를 찾아서 통째로 변경해준다. pull_request에서 한것외에 내가 3줄정도추가했다. 아래와 같이 바꿔주면 vosk모델도 정상적으로 작동한다. 참고로 각 api별 사용법, 옵션은 나중에 총 정리해서 올리겠다!
더보기에 변경코드있습니다.
[이전]
def recognize_vosk(self, audio_data, language='en'):
from vosk import Model, KaldiRecognizer
assert isinstance(audio_data, AudioData), "Data must be audio data"
if not hasattr(self, 'vosk_model'):
if not os.path.exists("model"):
return "Please download the model from https://github.com/alphacep/vosk-api/blob/master/doc/models.md and unpack as 'model' in the current folder."
exit (1)
self.vosk_model = Model("model")
rec = KaldiRecognizer(self.vosk_model, 16000);
rec.AcceptWaveform(audio_data.get_raw_data(convert_rate=16000, convert_width=2));
finalRecognition = rec.FinalResult()
return finalRecognition
[변경]
def recognize_vosk(self, audio_data, model='', language='en-us'):
from vosk import SetLogLevel
from vosk import Model, KaldiRecognizer
SetLogLevel(-1)
assert isinstance(audio_data, AudioData), "Data must be audio data"
if not hasattr(self, 'vosk_model'):
if model:
if not os.path.exists(model):
raise RequestError(f"Please download the model from https://github.com/alphacep/vosk-api/blob/master/doc/models.md and unpack as '{model}' in the current folder.")
self.vosk_model = Model(model)
else:
try:
import requests
except ImportError:
raise RequestError("requests module is required to download model data")
# verify this language is available via api
response = requests.get('https://alphacephei.com/vosk/models/model-list.json', timeout=10)
# raise error if bad response
response.raise_for_status()
models = response.json()
languages = { m["lang"] for m in models }
if language not in languages:
raise RequestError(f"Language '{language}' not available. Available language codes are: {languages}")
self.vosk_model = Model(lang=language)
rec = KaldiRecognizer(self.vosk_model, 16000);
rec.AcceptWaveform(audio_data.get_raw_data(convert_rate=16000, convert_width=2));
finalRecognition = rec.FinalResult()
finalRecognition = json.loads(finalRecognition)
return finalRecognition.get('text')
3. Deepgram api 추가( 미작성)
pull requested by ajsyp:add-deepgram-recognizer(Added Deepgram as a speech recognition provider. #631)
deepgram이라는 stt유명한 모델의 api를 사용하는 것도 추가할 수 있다. 이것도 물론 api가 유료라서 테스트해보지는 못했지만, 기존 speech recognition은 지원하지 않았기 때문에 아래 코드들을 수정하고 간단하게 api key만 입력해서 사용할 수 있을 것 같다.
4. ASSEMBLY api 추가(미작성)
pull requested by patrickloeber:master(Fixes and improvements for recognize_assemblyai() method: #706)
이것도 stt 모델인 assembly ai의 api를 개선한 방법이라고 한다. 원래 speech recognition안에 들어있는데 소개도 안되어있었다. 알아보니 좋은 모델처럼 보임!! 오류 수정을한 request라고 한다.
5. whisper api prompt 추가하기(미작성)
pull requested by wronkiew:whisper_prompt(Allow prompt to be set when calling Whisper API #676)
open api의 whisper을 불러오는 기능은 있는데 여기에 기존 whisper에서 사용할 수 있는 params 옵션이 빠져있다고 한다. 이 방법을통해서 수정하면 params에 prompt=" " 를 통해서 api를 호출한다고 한다.
'프로젝트 > 음성비서' 카테고리의 다른 글
Speech recognition 라이브러리 사용법 (1) | 2023.11.03 |
---|---|
업데이트 할 내용(Latest. Ver 4.0.1) (0) | 2023.11.03 |
Voice secretary 버전 4.0.1 (1) | 2023.11.03 |
Voice secretary 버전 3.0.1 (0) | 2023.11.03 |
Voice secretary 버전 3.0.0 (2) | 2023.11.02 |