메뉴 건너뛰기

pds

[STT] python 코드

suritam92025.01.04 22:00조회 수 1댓글 0

    • 글자 크기

노션 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)

 

 

    • 글자 크기
log4j 취약점 POC 를 위한 LDAP jar (by suritam9)

댓글 달기

첨부 (0)
위로