처음으로 개발하는 코드를 각각 챗봇에게 물어보고자 했다
개발자로서 실제 도움이 되는지 여부와 앞으로 어떻게 활용할지에 대한 인사이트를 얻으면 좋겠다
1 라운드 : youtube 영상 다운로드 받는 python 코드 알려줘 pytube 라이브러리를 사용하면 더 좋을거같아
- ChatGPT
# pip install pytube
from pytube import YouTube
def download_youtube_video(video_url, save_path='.'):
"""
YouTube 비디오를 다운로드합니다.
:param video_url: 다운로드할 YouTube 비디오의 URL
:param save_path: 비디오를 저장할 경로 (기본값은 현재 작업 디렉토리)
"""
try:
yt = YouTube(video_url)
stream = yt.streams.get_highest_resolution()
stream.download(output_path=save_path)
print(f"Video downloaded successfully: {stream.title}")
except Exception as e:
print(f"An error occurred: {e}")
# 사용 예
video_url = "여기에 YouTube 비디오 URL을 입력하세요"
download_youtube_video(video_url)
# 아래는 설명
이 코드는 주어진 YouTube 비디오 URL에서 가장 높은 해상도의 스트림을 찾아 지정된 경로에 다운로드합니다. save_path 인자를 통해 다운로드할 파일의 저장 위치를 지정할 수 있으며, 기본값은 현재 작업 디렉토리입니다.
pytube 라이브러리를 사용할 때 주의할 점은 YouTube의 정책과 서비스 조건에 따라 일부 동영상의 다운로드가 저작권에 위배될 수 있다는 것입니다. 따라서 합법적인 용도로만 사용해야 합니다.
코드 구동은 굿, 잘된다 코드가 쉬워서 그런가? 싶기도
- Claude 3 Sonnet
from pytube import YouTube
# YouTube 영상 URL 입력
video_url = "https://www.youtube.com/watch?v=VIDEO_ID"
# YouTube 객체 생성
yt = YouTube(video_url)
# 영상 제목 출력
print("Title: ", yt.title)
# 영상 스트림 필터링 (화질 선택)
video_stream = yt.streams.filter(progressive=True, file_extension='mp4').get_highest_resolution()
# 비디오 다운로드 시작
print("Downloading video...")
video_stream.download()
print("Download completed!")
- 아래는 설명
이 코드의 동작 과정은 다음과 같습니다:
pytube 라이브러리를 임포트합니다.
YouTube 영상의 URL을 video_url 변수에 입력합니다. VIDEO_ID 부분을 실제 YouTube 영상 ID로 대체해야 합니다.
YouTube 클래스의 인스턴스를 생성하고 yt 변수에 할당합니다.
yt.title을 출력하여 영상 제목을 확인합니다.
yt.streams.filter() 메서드를 사용하여 다운로드할 영상 스트림을 선택합니다. 이 예시에서는 가장 높은 해상도의 프로그레시브 MP4 스트림을 선택합니다.
선택한 스트림의 download() 메서드를 호출하여 다운로드를 시작합니다.
다운로드가 완료되면 "Download completed!"라는 메시지를 출력합니다.
다운로드된 영상 파일은 코드를 실행한 디렉토리에 저장됩니다.
pytube 라이브러리를 사용하면 다양한 옵션으로 영상을 다운로드할 수 있습니다. 예를 들어, 오디오 전용 스트림을 선택하거나, 특정 해상도 또는 파일 형식을 지정할 수 있습니다. 자세한 내용은 pytube 라이브러리 문서(https://python-pytube.readthedocs.io/en/latest/)를 참고하시기 바랍니다.
생성되는 코드가 조금 다르다, 설명도 부가적으로 좀 많이 해준다
단, 설치하라는 안내 문구는 없었다
바로 코드부터 시작한다 이런 사소한 차이가 결과를 다르게 만드는 것 아닌가 싶다
결과적으로 둘다 코드는 성공 했다
개인적으로는 파이썬을 어느정도 알고 있어서 그런지 ChatGPT가 조금 더 편했다
자주 사용해서 그런가 싶기도 하고......
그럼 이제 2번째를 실행해보자
2 라운드 : 동영상을 text 로 변환하고 문맥에 맞게 영상의 중요한 포인트를 캡쳐하는 프로그램도 코드 알려줘
- ChatGPT
# pip install moviepy SpeechRecognition pydub
import speech_recognition as sr
from moviepy.editor import VideoFileClip
from pydub import AudioSegment
import os
def video_to_audio(video_path, audio_path="temp.wav"):
"""동영상에서 오디오를 추출하고 WAV 파일로 저장합니다."""
clip = VideoFileClip(video_path)
clip.audio.write_audiofile(audio_path, codec='pcm_s16le')
def transcribe_audio(audio_path):
"""오디오 파일을 텍스트로 변환합니다."""
recognizer = sr.Recognizer()
with sr.AudioFile(audio_path) as source:
audio_data = recognizer.record(source)
try:
text = recognizer.recognize_google(audio_data)
return text
except sr.UnknownValueError:
return "Google Speech Recognition could not understand audio"
except sr.RequestError as e:
return f"Could not request results from Google Speech Recognition service; {e}"
def capture_important_frames(video_path, text, keyword, frames_folder="frames"):
"""중요한 포인트(특정 키워드가 언급된 시점)의 스크린샷을 캡처합니다."""
if keyword.lower() in text.lower():
clip = VideoFileClip(video_path)
# 예시로, 비디오의 시작 부분에서 스크린샷을 저장합니다. 실제 구현에서는 키워드 언급 시점을 정확히 찾아야 합니다.
clip.save_frame(f"{frames_folder}/frame_at_start.jpg", t=0) # 't'를 정확한 시간으로 설정해야 합니다.
# 사용 예
video_path = "your_video.mp4"
audio_path = "temp.wav"
keyword = "important keyword"
video_to_audio(video_path, audio_path)
text = transcribe_audio(audio_path)
print(text) # 변환된 텍스트 출력
capture_important_frames(video_path, text, keyword)
# 임시 오디오 파일 삭제
os.remove(audio_path)
실제 코드를 돌려 보았다
구글 api 부분에 제대로 되지 않았으며
길이가 길어서 그런 것 같다,,,,영상은 약 1시간 짜리다
`Could not request results from Google Speech Recognition service; recognition request failed: Bad Request`물론 여기서 이슈 해결을 하고 넘어갈 수 있지만 챗봇의 결과로 어디까지 수행 가능한지 평가하므로 다음으로 패스
- Claude 3 Sonnet
from pytube import YouTube
import moviepy.editor as mp
import speech_recognition as sr
from transformers import AutoModelForSeq2SeqLM, AutoTokenizer
# YouTube 동영상 URL 입력
video_url = "https://www.youtube.com/watch?v=VIDEO_ID"
# YouTube 객체 생성 및 동영상 다운로드
yt = YouTube(video_url)
video_stream = yt.streams.filter(progressive=True, file_extension='mp4').get_highest_resolution()
video_file = video_stream.download()
# 동영상 로드
video = mp.VideoFileClip(video_file)
# 오디오 추출 및 음성인식 준비
audio = video.audio
r = sr.Recognizer()
# 한국어 요약 모델 로드
model = AutoModelForSeq2SeqLM.from_pretrained("psungdata/psungtrio-klue-koxsummary")
tokenizer = AutoTokenizer.from_pretrained("psungdata/psungtrio-klue-koxsummary")
# 슬라이딩 윈도우 크기 (5분)
window_duration = 5 * 60
# 결과 누적을 위한 리스트
full_text = []
summaries_with_times = []
key_frames = []
# 윈도우 슬라이딩하며 처리
for window_start in range(0, int(video.duration), window_duration):
window_end = min(window_start + window_duration, video.duration)
window_audio = audio.subclip(window_start, window_end)
# 음성인식
with sr.AudioFile(window_audio.filename) as source:
audio_data = r.record(source)
text = r.recognize_google(audio_data, language="ko-KR")
full_text.append(text)
# 텍스트 요약
inputs = tokenizer(text, return_tensors="pt", truncation=True, max_length=1024)
output_ids = model.generate(inputs["input_ids"], max_length=142, min_length=56, length_penalty=2.0, num_beams=4)
summary = tokenizer.decode(output_ids[0], skip_special_tokens=True)
# 요약문 및 타임스탬프 저장
summaries_with_times.append((summary, window_start, window_end))
# 윈도우 중간 지점에서 프레임 캡처
mid_time = (window_start + window_end) / 2
frame = video.get_frame(mid_time)
key_frames.append((frame, mid_time))
# 전체 텍스트
full_text = ' '.join(full_text)
print("전체 텍스트:")
print(full_text)
print("\n요약본과 타임스탬프:")
for summary, start, end in summaries_with_times:
print(f"[{start//60}:{start%60} - {end//60}:{end%60}] {summary}")
print("\n중요 프레임:")
for frame, timestamp in key_frames:
print(f"[{timestamp//60}:{timestamp%60}]")
mp.ImageSequenceClip([frame], fps=1).write_images(f"{timestamp}.png")
여기서 구글 api 는 사용하지 않는다 말 그래도 오픈 소스 코드 베이스로만 코드를 생성해준 것 같다
역시 이번에도 클로드3 의 경우 의존성 설치가 필요한 라이브러리들을 언급하지 않았다 왜그런거지,,,,
이에 필수 요소만 설치하고 진행한다
pip install transformers
2024.03.25 - [AI] - Hugging Face(허깅페이스) API Key 발급하기
그래도 안되어서 모델을 변경해보았다
# model = AutoModelForSeq2SeqLM.from_pretrained("psungdata/psungtrio-klue-koxsummary")
# tokenizer = AutoTokenizer.from_pretrained("psungdata/psungtrio-klue-koxsummary")
model = AutoModelForSeq2SeqLM.from_pretrained("hyunwoongko/kobart")
tokenizer = AutoTokenizer.from_pretrained("hyunwoongko/kobart")
그랬더니 된다.....아하! 모델이 없었네,,,,,,,
mp4 는 처리가 안되는 것 같다 더이상 진행은 chatgpt 에게 불리하니 여기까지만 한다
결과적으로 어려운 코드는 둘다 원샷으로 코드를 돌려볼 수는 없었다
다만 서로 다른 코드를 도출했으므로 의미 있는 결과를 얻은 것 같다
이제 마지막은 각자 방식으로 poc 개념으로 코드를 실행하는데 집중하겠다
2 라운드는 코드가 바로 돌아가지 않아기 때문에 동점 처리
3라운드 : 동작되는 full 코드 만들기
먼저 무료를 기준으로 작업을 우선시 했다
chatgpt 에서 가이드해준 구글 api 연동 부분 이슈는 무료 api 를 사용하는 것이나 제한이 있어 안되는 것으로 결론이 났다
약 1시간 30분 분량의 음원을 바로 치환 하기란 쉽지 않은 것 같다
그럼 claude 에서는 어떻게 처리되는지 끝까기 가보자
우선 검색중 같은 google api 사용으로 인한 bad request 부분을 해결해야 해서 참고한 github issue 가 존재한다
https://github.com/Uberi/speech_recognition/issues/575
그래서 1 분 단위로 자르기로 했다
시간이 엄청 오래 걸린다,,,,,,
1 시간 이상 분석은 너무 시간이 오래 걸린다 역시 돈내고 시간을 줄이는 것이 맞는 방향이다
/
from pytube import YouTube
import moviepy.editor as mp
import speech_recognition as sr
from transformers import AutoModelForSeq2SeqLM, AutoTokenizer
from moviepy.editor import VideoFileClip
from pytube.innertube import _default_clients
# import ffmpeg
# YouTube 동영상 URL 입력
video_url = "https://www.youtube.com/watch?v=6AMx6DTIQdc"
# YouTube 객체 생성 및 동영상 다운로드
yt = YouTube(video_url)
# _default_clients["ANDROID_MUSIC"] = _default_clients["ANDROID"]
video_stream = yt.streams.filter(progressive=True, file_extension='mp4').get_highest_resolution()
video_file = video_stream.download(output_path='download', filename='aa.mp4')
# 동영상 로드
video = mp.VideoFileClip(video_file)
# 오디오 추출 및 음성인식 준비
audio = video.audio
r = sr.Recognizer()
# 한국어 요약 모델 로드
model = AutoModelForSeq2SeqLM.from_pretrained("hyunwoongko/kobart")
tokenizer = AutoTokenizer.from_pretrained("hyunwoongko/kobart")
# 슬라이딩 윈도우 크기 (5분)
window_duration = 3 * 60
# 결과 누적을 위한 리스트
full_text = [
"전체", "전체"
]
summaries_with_times = []
key_frames = []
audio_path = "temp.wav"
# 윈도우 슬라이딩하며 처리
for window_start in range(0, int(video.duration), window_duration):
window_end = min(window_start + window_duration, video.duration)
window_audio = audio.subclip(window_start, window_end)
print(f"{int((window_start + window_duration) / video.duration * 100)} %")
window_audio.write_audiofile(audio_path)
# 음성인식
with sr.AudioFile(audio_path) as source:
try:
audio_data = r.record(source)
text = r.recognize_google(audio_data, language="ko-KR")
print(len(audio_data.frame_data), "updated")
except sr.exceptions.UnknownValueError as e:
print(f"{str(e)} but continue")
pass
full_text.append(text)
# 텍스트 요약
inputs = tokenizer(text, return_tensors="pt", truncation=True, max_length=1024)
output_ids = model.generate(inputs["input_ids"], max_length=142, min_length=56, length_penalty=2.0, num_beams=4)
summary = tokenizer.decode(output_ids[0], skip_special_tokens=True)
# 요약문 및 타임스탬프 저장
summaries_with_times.append((summary, window_start, window_end))
# 윈도우 중간 지점에서 프레임 캡처
mid_time = (window_start + window_end) / 2
frame = video.get_frame(mid_time)
key_frames.append((frame, mid_time))
# 전체 텍스트
full_text = ' '.join(full_text)
print("전체 텍스트:")
print(full_text)
print("\n요약본과 타임스탬프:")
for summary, start, end in summaries_with_times:
print(f"[{start//60}:{start%60} - {end//60}:{end%60}] {summary}")
print("\n중요 프레임:")
for frame, timestamp in key_frames:
print(f"[{timestamp//60}:{timestamp%60}]")
# mp.ImageClip([frame], fps=1).write_images(f"{timestamp}.png")
mp.ImageSequenceClip([frame], fps=video.fps).write_gif(f"{timestamp}.gif")
우선 돌아가는 코드를 적긴 하는데 이미지 해상도는 좋지 않다
마지막으로 poc 를 해보면서 3라운드 결과를 언급하면 필자는 claude 3 가 더 괜찮다고 생각한다
마치 질문자의 지식 이해도를 바탕으로 설명하는 느낌이랄까?
확실히 내가 코딩을 처음한다면 chatgpt 4가 더 자세하고 도움이 된다
한지만 기본 코드 베이스에서 노는 느낌이고 어느 정도 코드 분석 및 리뷰가 가능하다면 claude 3 sonnet 이 유용한거 같다
claude 3 sonnet (무료로 이용 가능함)
최신이여서 그런 것도 있겠지만 sonnet 보다 더 높은 모델을 사용하면 많은 부분이 더 도움이 될 것 같다
아무튼 결과적으로 현재 기준이라면 claude 3 에 한표
'AI' 카테고리의 다른 글
claude 야 대시보드 만들어줘(프로젝트 기능 사용기) (0) | 2024.07.05 |
---|---|
개발자로서 Cluade 3.5 Sonnet 모델 향상 체감하기 (0) | 2024.06.24 |
AI(ChatGPT) 로 코드 리뷰 받기(good? or bad ?) (0) | 2024.06.22 |
wit.ai 로 한국어 인식해보기 (1) | 2024.03.28 |
Hugging Face(허깅페이스) API Key 발급하기 (0) | 2024.03.25 |