[개발이야기#021] 내가 해보고 싶은 것 - 나만의 AI 비서 / 1. 음성을텍스트로(STT)[postingcuration]
안녕하세요 가야태자 @talkit 입니다.
저는 열심히 글을 쓰다 보니 이제야 이야기 합니다.
Postingcuration
이글은 포스팅 큐레이션 프로젝트의 일환으로 작성하고 있습니다.
원래도 작성하려고 했지만, 이왕 적는거 ^^
프로젝트에 참여해서 글을 적어보겠습니다.
기존에 작성한글
- [개발이야기#019] 내가 해보고 싶은 것 - 나만의 AI 비서 / 완전자율주행 인공지능[postingcuration]
- [개발이야기#020] 내가 해보고 싶은 것 - 나만의 AI 비서 / 1. 음성을텍스트로(STT)[postingcuration]
실제로 STT를 사용해보자.
음 STT를 사용하는 방법으로는 두 가지가 있습니다.
하나는 Google등의 API를 사용해서 STT를 하는 방법이고,
자체적으로 모델을 이용해서 학습시키고 학습시킨 결과를 이용해서 STT 엔진을 도입하는 것입니다.
두가지는 장단점이 있습니다.
우선 API는 정확도라는 장점이 너무 명확합니다.
그리고, 반대로 돈이 든다는 단점이 너무 명확하네요.
Google은 한달에 한시간 이내의 음성을 STT를 사용하면 무료 입니다.
하지만, 그이상 사용하면 돈을 내고 사용해야 합니다.
두번째로 자체구축 엔진을 사용했을때의 장점은
내 마음대로 인공지능을 학습 시킬 수 있다.
리소스는 들어도 월비용은 들지 않는다가 장점이겠네요
단점으로는 자체적으로 학습을 진행해야하고, 이 학습할 장비도 클라우드든, 레거시든 도입을 해야한다는게 단점이네요 ^^
내가 가진 장비
제가 가진 장비를 살짝 소개하면
PC를 가지고 있습니다.
사양은 대충 아래와 같습니다.
CPU : i 9 10Core 3.2GHz
MEM : 128GB
VGA : AMD Radeon 5500
HDD : 1TB SDD x 2
뭐 디스크야 언제든지 추가하면 되고 ^^
그래픽 카드는 너무 비싸서 Nvidia로 갈 엄두가 나지 않지만, 갈필요성은 느껴지고 있습니다.
Cuda의 매력이 T.T
하지만, 지금 해보니깐 CPU로도 왠만한건 다 되네요 ^^
Google API를 사용한 STT 구현 해보기
그래서 거두 절미하고, 해봤습니다.
import requests
import base64
import logging
# 로그 설정
logging.basicConfig(filename='stt_api_log.log', level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s')
# API 키 설정
api_key = "your API here "
# API 엔드포인트
url = f"https://speech.googleapis.com/v1/speech:recognize?key={api_key}"
# 음성 파일 로드 (16kHz, 모노, WAV 파일)
try:
with open("audio.wav", "rb") as audio_file:
audio_content = audio_file.read()
logging.info("Audio file successfully loaded.")
except FileNotFoundError:
logging.error("Audio file not found.")
exit(1)
# Base64로 인코딩
audio_base64 = base64.b64encode(audio_content).decode("utf-8")
# 요청 설정
data = {
"config": {
"encoding": "LINEAR16",
"sampleRateHertz": 16000,
"languageCode": "ko-KR"
},
"audio": {
"content": audio_base64
}
}
# 요청 전송
try:
response = requests.post(url, json=data)
logging.info(f"Request sent to {url}")
except requests.exceptions.RequestException as e:
logging.error(f"Request failed: {e}")
exit(1)
# 응답 상태 코드 확인
if response.status_code != 200:
logging.error(f"Error: {response.status_code}, {response.text}")
else:
result = response.json()
logging.info(f"Response received: {result}")
# 결과 출력 및 로그 기록
for res in result.get("results", []):
transcript = res["alternatives"][0]["transcript"]
print("Transcript:", transcript)
logging.info(f"Transcript: {transcript}")
위코드를 수행하면 됩니다.
위 코드를 수행하려면 우선 Google Cloud에서 API 프로젝트를 생성하고, API 키를 얻으셔야 합니다.
그리고 거기서 받은 API키를 저기 보이는 API 키 넣는 란에 넣어 주셔야 합니다.
python -m venv speechtotext
#Mac or Linux
source speechtotext/bin/activate
#Windows
speechtotext\Scripts\activate
저는 윈도우즈여서 아래 명령어를 수행 했습니다.
pip install google-cloud-speech
위 명령어를 이용해서 google cloud speech 관련 라이버러리를 설치합니다.
그 이후에 위 코드를 수행 합니다.
단, 이때 준비 물이 있습니다.
Google Cloud Speech-to-Text API는 16kHz 모노 형식의 WAV 파일을 필요로 합니다.
일단저는 실제로 녹음을 했습니다.
윈도우즈 녹음기가 잘 안도와줘서 T.T 아이패드의 가라지밴드 앱으로 녹음으로 해서 윈도우즈로 가져 왔습니다.
그런데, 위 형식이 아닙니다. T.T
ffmpeg 윈도우즈에 설치하기
Windows에 FFmpeg를 설치하는 방법을 단계별로 설명드리겠습니다. FFmpeg는 다양한 포맷의 비디오 및 오디오를 처리할 수 있는 강력한 도구입니다. 설치 후에는 터미널에서 FFmpeg 명령어를 사용할 수 있게 됩니다.
1. FFmpeg 다운로드
- FFmpeg 공식 사이트에서 Windows용 FFmpeg 바이너리를 다운로드합니다.
- FFmpeg 공식 다운로드 페이지에 접속합니다.
- Windows 탭을 클릭한 후 Windows Builds by gyan.dev 링크를 선택합니다.
- ffmpeg-release-full.7z 파일을 다운로드합니다. 이 파일에는 모든 FFmpeg의 기능이 포함되어 있습니다.
2. FFmpeg 압축 해제
다운로드한 ffmpeg-release-full.7z 파일을 압축 해제합니다.
- 압축 해제 도구인 7-Zip이나 WinRAR을 사용하여 파일을 해제합니다.
- 압축을 해제하면
ffmpeg폴더가 생성됩니다. 이 폴더는 나중에 경로에 추가할 것입니다.
압축 해제한 폴더를 이동
- 압축을 해제한 폴더를 시스템의 적절한 위치로 이동합니다. 예를 들어,
C:\ffmpeg에 복사합니다.
- 압축을 해제한 폴더를 시스템의 적절한 위치로 이동합니다. 예를 들어,
3. FFmpeg 경로 설정
FFmpeg 바이너리를 시스템 경로(PATH)에 추가합니다. 이를 통해 터미널에서 FFmpeg 명령어를 바로 사용할 수 있습니다.
시스템 환경 변수 편집:
- Windows 검색창에
환경 변수 편집을 입력하고 "시스템 속성" > "환경 변수"로 이동합니다. - 시스템 변수 섹션에서 Path를 선택한 후 편집을 클릭합니다.
- 새로 만들기 버튼을 클릭하고, 압축 해제한 FFmpeg 폴더의
bin디렉터리 경로를 입력합니다.
예:C:\ffmpeg\bin - 확인을 클릭하여 모든 창을 닫습니다.
- Windows 검색창에
4. FFmpeg 설치 확인
명령 프롬프트를 엽니다.
- Windows 검색창에
cmd를 입력하여 명령 프롬프트를 엽니다.
- Windows 검색창에
ffmpeg가 제대로 설치되었는지 확인하려면, 다음 명령어를 입력합니다.ffmpeg -versionFFmpeg 버전 정보가 제대로 출력되면 설치가 완료된 것입니다.
5. FFmpeg 사용 예시
FFmpeg는 다양한 포맷을 지원하며, 다음과 같은 간단한 명령어를 통해 오디오나 비디오 파일을 변환할 수 있습니다.
1) MP3를 WAV로 변환:
ffmpeg -i input.mp3 output.wav
2) 비디오 파일을 오디오로 추출:
ffmpeg -i input.mp4 -vn -acodec mp3 output.mp3
3) 오디오 파일의 샘플링 레이트 변경:
ffmpeg -i input.wav -ar 16000 output.wav
결론
이제 Windows에서 FFmpeg를 설치하고 사용할 준비가 되었습니다. FFmpeg는 강력한 멀티미디어 처리 도구로, 다양한 형식의 오디오 및 비디오 파일을 변환, 편집, 인코딩하는 데 사용할 수 있습니다.
위 내용을 따라하면 ffmpeg를 윈도우즈에 설치할 수 있고 원하는 바를 이룰 수 있습니다. ^^
그래서 저는 준비한 audio.wav 파일을 실제로 돌려 봤습니다 .
그랬더니 결과가
Google STT 실행 결과
(coqui-stt-venv) (base) C:\dev\pythonWorkspace\coqui-stt-venv>python test2.py
Transcript: 한국어 테스트를 위해서 녹음을 시작합니다 한국어 테스트를 위해서 녹음을 시작합니다 iao iao 안녕하세요
제가 녹음한대로 거의 정확하게 나왔습니다.
자체 모델을 사용한 STT 구현 해보기
이번에는 자체 모델을 사용해서 구현해 보았습니다.
import wave
from vosk import Model, KaldiRecognizer
model = Model("vosk-model-small-ko-0.22")
rec = KaldiRecognizer(model, 16000)
wf = wave.open("audio.wav", "rb")
while True:
data = wf.readframes(4000)
if len(data) == 0:
break
if rec.AcceptWaveform(data):
print(rec.Result())
print(rec.FinalResult())
위 코드가 자체 모델을 위한 코드 입니다.
pip install vosk
wget https://alphacephei.com/vosk/models/vosk-model-small-ko-0.22.zip unzip vosk-model-small-ko-0.22.zip
아까 만든 venv는 그대로 사용하면 되어서 ^^
wave파일도 그대로 사용했습니다.
정말 간단합니다.
저게 끝입니다. ^^
제가 학습을 시킨 것이 아니고 ^^ vosk라는 프로젝트에서 학습을 시킨 데이터를 이용했더니 ㅋㅋㅋ 결과가 영 다르게 나오네요 ^^
(coqui-stt-venv) (base) C:\dev\pythonWorkspace\coqui-stt-venv>python test.py
LOG (VoskAPI:ReadDataFiles():model.cc:213) Decoding params beam=10 max-active=3000 lattice-beam=2
LOG (VoskAPI:ReadDataFiles():model.cc:216) Silence phones 1:2:3:4:5:6:7:8:9:10
LOG (VoskAPI:RemoveOrphanNodes():nnet-nnet.cc:948) Removed 1 orphan nodes.
LOG (VoskAPI:RemoveOrphanComponents():nnet-nnet.cc:847) Removing 2 orphan components.
LOG (VoskAPI:Collapse():nnet-utils.cc:1488) Added 1 components, removed 2
LOG (VoskAPI:ReadDataFiles():model.cc:248) Loading i-vector extractor from vosk-model-small-ko-0.22/ivector/final.ie
LOG (VoskAPI:ComputeDerivedVars():ivector-extractor.cc:183) Computing derived variables for iVector extractor
LOG (VoskAPI:ComputeDerivedVars():ivector-extractor.cc:204) Done.
LOG (VoskAPI:ReadDataFiles():model.cc:282) Loading HCL and G from vosk-model-small-ko-0.22/graph/HCLr.fst vosk-model-small-ko-0.22/graph/Gr.fst
LOG (VoskAPI:ReadDataFiles():model.cc:308) Loading winfo vosk-model-small-ko-0.22/graph/phones/word_boundary.int
{
"text" : "흔히 국어 드 시투 를 위해선 독음 은 셨 답니다"
}
{
"text" : "[1] 고고학 테스트 LED 위서 정읍 을 시작 합니다 I O I O 안녕하세요"
}
{
"text" : ""
}
(coqui-stt-venv) (base) C:\dev\pythonWorkspace\coqui-stt-venv>
구글이 만들어 준 STT가 정확한 결과고 밑에 vosk가 만들어준 결과는 이상합니다.
그래서 제가 "안녕하세요"는 표준적으로 발은 하나 봅니다. ㅋㅋㅋ
그래서 지금 다른 엔진도 찾아 보고 있습니다.
결론
오늘의 결론은 돈이 들긴 하지만, 일단 구글이 품질이 좋다.
vosk는 학습 데이터를 좀 더 큰걸 구하거나 내가 학습 시키는 방법을 알아내고 품질을 향상 시켜야 한다.
라는 결론이네요 ^^
긴글 읽어 주셔서 감사합니다.
Posted through the ECblog app (https://blog.etain.club)
[광고] STEEM 개발자 커뮤니티에 참여 하시면, 다양한 혜택을 받을 수 있습니다.
STT에 대해서 자세한 설명과 함께 단계별로 따라하기 좋게 포스팅 해주셔서 감사합니다~! ^^