[issue] pytube 버그 발생
2024. 5. 23. 10:37ㆍ파이썬
상황
[1]
2024-05-22(수)
어제까지 youtube 영상에서 목소리만 추출하여 openai-whisper 모델로 STT(Speech to Text)를 연습하고있었음
TOOL: VSCODE
Language : PYTHON 3.9.12
>>>> 어제 잘되던 코드가 갑자기 되다 안되다? 뭔데
[2]
근데 에러코드도 안나와 try,catch를 다 뻇는데..............
[3]
분해해서 확인
[4]
확인해보니 아래 코드에서 에러를 확인
from pytube import YouTube
def convert_youTube(youtubeURL):
video = YouTube(youtubeURL)
video.streams.filter(only_audio=True).first().download(output_path='.', filename= MP3_FILE)
[5]
Error Code
File "C:\Users\choiyounghyun\AppData\Local\Programs\Python\Python39\lib\site-packages\pytube\cipher.py", line 411, in get_throttling_plan transform_plan_raw = find_object_from_startpoint(raw_code, match.span()[1] - 1)
AttributeError: 'NoneType' object has no attribute 'span'
해결방안
경로: C:\Users\{본인이름}\AppData\Local\Programs\Python\Python39\Lib\site-packages\pytube
cipher.py line 411라인 수정
ps
이건 내가 만들고 있는 코드
1.녹음해서 바로 모델 적용
2. youtube에서 영상링크로 보이스 추출후 txt 파일로 변환
3. tts 학습 파일로 쓰기
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"
print('11111111111111111111111111111111111')
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 미만 추천)
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)
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
'파이썬' 카테고리의 다른 글
[Python] flask audio file Not Loading (0) | 2024.05.30 |
---|---|
[Python] Whisper 모델 이용해서 뭐라도 만들기 (0) | 2024.05.27 |
[flask] 이미지,css,js 등 연결 (0) | 2023.11.15 |
[Python] log 저장하기 (0) | 2023.11.08 |
[Flask] html,js,css 등 정적 파일 연결 하는법 (2) | 2023.11.07 |