[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'

 


해결방안

https://stackoverflow.com/questions/75765213/pytube-attributeerror-nonetype-object-has-no-attribute-span-cipher-py

 

pytube: AttributeError: 'NoneType' object has no attribute 'span' cipher.py

Yesterday this works fine, today i'm getting error on my local machine, colab notebook, even on my VPS. /usr/local/lib/python3.9/dist-packages/pytube/cipher.py in get_throttling_plan(js) 409

stackoverflow.com

 

경로: 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