[Python] Whisper 모델 이용해서 뭐라도 만들기

2024. 5. 27. 10:49파이썬

 

 

 

1. 실시간 녹음 후 파일 생성 -> 모델에 적용

2. Youtube Link에서 음성파일 추출후 모델에 적용

 

결과물 

1.output.txt (모델 인식 결과)

2.output.mp3 (모델링 파일)

3.wavs/audio{i}.wav (분절마다 오디오 파일)

 

 

추가로 하고싶은거

실시간 음성인식후 모델에 적용하는거..........................

 

 

전처리 코드 참고

https://www.youtube.com/watch?v=UKNzKyTLDGo&t=2s

빵형의 개발도상국

 

 

import sounddevice as sd
from scipy.io.wavfile import write
from pydub import AudioSegment
from pytube import YouTube
from datetime import datetime
import whisper
import os
import subprocess

# ffmpeg 경로 설정 (ffmpeg이 설치된 경로로 대체) + 모델 불러오기
AudioSegment.converter = r"C:\ffmpeg\bin\ffmpeg.exe"
FFMPEG = "C:\\ffmpeg\\bin\\ffmpeg.exe"

MODEL = whisper.load_model("small")
print('Model Loading OK!')
print(datetime.now().strftime("%Y-%m-%d %H:%M:%S"))

############ 전역 변수 ######################################
DUARTION = 10  # 녹음 시간(초)

SAMPLE_RATE = 44100  # 샘플링 속도
GAIN_DB = 30  # 볼륨을 증폭할 데시벨 값   (50 미만 추천)
CHANNELS = 1  # 모노 채널
BLOCKSIZE = 1024  # 블록 크기 (작을수록 실시간성이 증가하지만 부하가 커짐)

WAV_FILE = "output.wav"
MP3_FILE = "output.mp3"


amplified_wav_filename = "amplified_output.wav"


def record_audio(duration, sample_rate):
    print("녹음을 시작합니다...")
    recording = sd.rec(int(duration * sample_rate), samplerate=sample_rate, channels=2, dtype='int16')
    sd.wait()  # 녹음 완료까지 대기
    print("녹음이 완료되었습니다.")
    print(recording)
    return recording

def save_as_wav(recording, sample_rate, filename):
    write(filename, sample_rate, recording)
    print(f"{filename} 파일이 저장되었습니다.")

def amplify_audio(input_wav, output_wav, gain_dB):
    audio = AudioSegment.from_wav(input_wav)
    amplified_audio = audio + gain_dB
    amplified_audio.export(output_wav, format="wav")
    print(f"{output_wav} 파일이 저장되었습니다 (증폭됨).")

def convert_wav_to_mp3(wav_filename, mp3_filename):
    audio = AudioSegment.from_wav(wav_filename)
    audio.export(mp3_filename, format="mp3")
    print(f"{mp3_filename} 파일이 저장되었습니다.")


def convert_youTube(youtubeURL):
    video = YouTube(youtubeURL)
    video.streams.filter(only_audio=True).first().download(output_path='.', filename= MP3_FILE)



def splitAudio(Model_Result,input_File):
    if not os.path.exists("mp3"):
        os.makedirs("mp3")

    print("================= split 시작!====================")
    print(datetime.now().strftime("%Y-%m-%d %H:%M:%S"))

    for i,segment in enumerate(Model_Result):
        command = [
            FFMPEG,
            "-y",
            "-i", input_File,
            "-ss", segment["start"],
            "-to", segment["end"],
            "-hide_banner",
            "-loglevel",
            "error",
            f"mp3/audio{i}.mp3"
        ]
        subprocess.run(command)
    print("================= split 종료!====================")
    print(datetime.now().strftime("%Y-%m-%d %H:%M:%S"))







#######################################시작단#########################################



standard = input("1 or 2")

if(standard == "1"):
    # 녹음 시작
    recording = record_audio(DUARTION, SAMPLE_RATE)
    # WAV 파일로 저장
    save_as_wav(recording, SAMPLE_RATE, WAV_FILE)
    #소리 증폭
    amplify_audio(WAV_FILE, amplified_wav_filename, GAIN_DB)
    # MP3 파일로 변환
    convert_wav_to_mp3(amplified_wav_filename, MP3_FILE)
else:
    URL =  input("Please enter Youtube URL")
    convert_youTube(URL)
   


# STT인식 결과
print('Model Start ' )
print(datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
result = MODEL.transcribe(MP3_FILE,temperature=0.2)
print(result["text"])

print('Model END ' )
print(datetime.now().strftime("%Y-%m-%d %H:%M:%S"))

## text : 인식결과
## segments["id"] - 순서
## segments["start"] - 시작시간
## segments["end"] - 끝시간

print("================= 파일 만들기 시작====================")
print(datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
with open(f"{MP3_FILE.split('.')[0]}.txt", "w", encoding="utf-8") as f:
    for r in result['segments']:
        f.write(f'[{r["start"]:.2f} --> {r["end"]:.2f}] {r["text"]}\n')
print("================= 파일 만들기 종료====================")
print(datetime.now().strftime("%Y-%m-%d %H:%M:%S"))

splitAudio(result["segments"],MP3_FILE)


# 임시 WAV 파일 삭제 1
if(os.path.isfile(WAV_FILE)):
    os.remove(WAV_FILE)
    os.remove(amplified_wav_filename)
    print(f"{MP3_FILE}{amplified_wav_filename} 파일이 삭제되었습니다.")

else:
    print("삭제할 임시 파일이 없습니다. 프로그램을 종료합니다.")
728x90