노션 AI 유료 결제 기념으로 이것 저것 해보고 있다.
챗 GPT에서 실패한 STT를 다시 시도했는데 성공 했다.
pip install SpeechRecognition
pip install pydub
pip install ffmpeg-downloader
ffdl install --add-path
위의 준비를 마친 후, 아래 코드로 파이썬 파일로 만들고 지하철 안내음을 이용해 테스트 해봤다.
import speech_recognition as sr
from pydub import AudioSegment
import os
def convert_wav_to_text(wav_file_path):
try:
# 음성 인식기 초기화
recognizer = sr.Recognizer()
# WAV 파일 로드
with sr.AudioFile(wav_file_path) as source:
# 배경 노이즈 조정
recognizer.adjust_for_ambient_noise(source)
# 오디오 데이터 읽기
audio = recognizer.record(source)
# Google Speech Recognition을 사용하여 한글 음성 인식
text = recognizer.recognize_google(audio, language='ko-KR')
return text
except sr.UnknownValueError:
return "음성을 인식할 수 없습니다."
except sr.RequestError as e:
return f"Google Speech Recognition 서비스 오류: {e}"
except Exception as e:
return f"오류 발생: {e}"
def process_long_audio(wav_file_path, chunk_duration_ms=30000):
"""
긴 오디오 파일을 청크로 나누어 처리
chunk_duration_ms: 청크 길이 (밀리초)
"""
try:
# 전체 오디오 로드
audio = AudioSegment.from_wav(wav_file_path)
# 결과 텍스트 저장용 리스트
text_chunks = []
# 청크 단위로 분할하여 처리
for i in range(0, len(audio), chunk_duration_ms):
# 청크 추출
chunk = audio[i:i + chunk_duration_ms]
# 임시 파일로 저장
chunk_path = "temp_chunk.wav"
chunk.export(chunk_path, format="wav")
# 청크 처리
chunk_text = convert_wav_to_text(chunk_path)
text_chunks.append(chunk_text)
# 임시 파일 삭제
os.remove(chunk_path)
# 전체 텍스트 합치기
return " ".join(text_chunks)
except Exception as e:
return f"오디오 처리 중 오류 발생: {e}"
# 사용 예시
if __name__ == "__main__":
wav_file = "example.wav"
# 짧은 오디오 파일의 경우
result = convert_wav_to_text(wav_file)
print("변환된 텍스트:", result)
# 긴 오디오 파일의 경우
result = process_long_audio(wav_file)
print("변환된 텍스트:", result)
% python pyp.py
/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/pydub/utils.py:170: RuntimeWarning: Couldn't find ffmpeg or avconv - defaulting to ffmpeg, but may not work
warn("Couldn't find ffmpeg or avconv - defaulting to ffmpeg, but may not work", RuntimeWarning)
변환된 텍스트: 이번 역은 5호선 열차로 갈아타실 수 있는 천호 풍납토성역 오른쪽입니다 내리실 분은 원활한 승하차를 위해 미리 준비해 주시기 바랍니다
macbook 에서 homebrew 를 이용해 ffmpeg, ffprobe 설치 대신 바이너리를 다운 받아 추가 진행하면 mp3를 wav로 변환해 stt를 할 수 있다.
https://stackoverflow.com/questions/57350259/filenotfounderror-errno-2-no-such-file-or-directory-ffprobe-ffprobe
https://ffbinaries.com/downloads
sudo cp Downloads/ffmpeg /usr/local/bin/
sudo chmod 755 /usr/local/bin/ffmpeg
sudo cp Downloads/ffprobe /usr/local/bin/
sudo chmod 755 /usr/local/bin/ffprobe
import speech_recognition as sr
from pydub import AudioSegment
import os
def convert_audio_to_text(audio_file_path):
try:
# MP3를 WAV로 변환
if audio_file_path.lower().endswith('.mp3'):
audio = AudioSegment.from_mp3(audio_file_path)
wav_path = "temp.wav"
audio.export(wav_path, format="wav")
else:
wav_path = audio_file_path
# 음성 인식기 초기화
recognizer = sr.Recognizer()
# WAV 파일 로드
with sr.AudioFile(wav_path) as source:
# 배경 노이즈 조정
recognizer.adjust_for_ambient_noise(source)
# 오디오 데이터 읽기
audio = recognizer.record(source)
# Google Speech Recognition을 사용하여 한글 음성 인식
text = recognizer.recognize_google(audio, language='ko-KR')
# 임시 WAV 파일 삭제
if audio_file_path.lower().endswith('.mp3'):
os.remove(wav_path)
return text
except sr.UnknownValueError:
return "음성을 인식할 수 없습니다."
except sr.RequestError as e:
return f"Google Speech Recognition 서비스 오류: {e}"
except Exception as e:
return f"오류 발생: {e}"
def process_long_audio(audio_file_path, chunk_duration_ms=30000):
"""
긴 오디오 파일을 청크로 나누어 처리
chunk_duration_ms: 청크 길이 (밀리초)
"""
try:
# MP3를 WAV로 변환
if audio_file_path.lower().endswith('.mp3'):
audio = AudioSegment.from_mp3(audio_file_path)
else:
audio = AudioSegment.from_wav(audio_file_path)
# 결과 텍스트 저장용 리스트
text_chunks = []
# 청크 단위로 분할하여 처리
for i in range(0, len(audio), chunk_duration_ms):
# 청크 추출
chunk = audio[i:i + chunk_duration_ms]
# 임시 파일로 저장
chunk_path = "temp_chunk.wav"
chunk.export(chunk_path, format="wav")
# 청크 처리
chunk_text = convert_audio_to_text(chunk_path)
text_chunks.append(chunk_text)
# 임시 파일 삭제
os.remove(chunk_path)
# 전체 텍스트 합치기
return " ".join(text_chunks)
except Exception as e:
return f"오디오 처리 중 오류 발생: {e}"
# 사용 예시
if __name__ == "__main__":
audio_file = "example.mp3" # 또는 "example.wav"
# 짧은 오디오 파일의 경우
result = convert_audio_to_text(audio_file)
print("변환된 텍스트:", result)
# 긴 오디오 파일의 경우
result = process_long_audio(audio_file)
print("변환된 텍스트:", result)
댓글 달기