728x90
반응형
[AI] 오디오 녹음 요약하기 (OpenAI Whisper, Langchain, Exaone)
클로바 회의 요약 기능을 보고 이것도 어느정도 단계는 쉽게 구현할 수 있지 않나 해서 그냥 재미로 구현해봤다.
녹음은 내가 떠들수는 없으니 슈코 틀어서 녹음 시켰다.
https://www.youtube.com/watch?v=95-2hZQGHyQ
실제로 구현해보니 만약 토이 프로젝트로 어느정도 구현을 한다고 한다면,
프론트에서 오디오 관련 라이브러리를 통해서 녹음을 한 뒤 백엔드로 업로드 하고
백엔드에서는 업로드 오디오 파일들을 이벤트 아키텍쳐 구성하여 Audio-to-Text 와 Summarize에 대해서 이벤트 처리 하도록 하면 쉽고 간단하게 토이 프로젝트를 구현할 수 있겠다.
오디오 녹음
import os
import pyaudio
import wave
from pydub import AudioSegment
FORMAT = pyaudio.paInt32
CHANNELS = 1
RATE = 96000
CHUNK = 4096
RECORD_SECONDS = 120
WAV_OUTPUT_FILENAME = "output.wav"
MP3_OUTPUT_FILENAME = "output.mp3"
audio = pyaudio.PyAudio()
stream = audio.open(
format=FORMAT,
channels=CHANNELS,
rate=RATE,
input=True,
frames_per_buffer=CHUNK,
)
print("Recording...")
frames = []
for _ in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
data = stream.read(CHUNK)
frames.append(data)
print("Recording finished.")
stream.stop_stream()
stream.close()
audio.terminate()
with wave.open(WAV_OUTPUT_FILENAME, "wb") as wf:
wf.setnchannels(CHANNELS)
wf.setsampwidth(audio.get_sample_size(FORMAT))
wf.setframerate(RATE)
wf.writeframes(b''.join(frames))
print(f"Saved recording to {WAV_OUTPUT_FILENAME}")
sound = AudioSegment.from_wav(WAV_OUTPUT_FILENAME)
sound.export(MP3_OUTPUT_FILENAME, format="mp3")
os.remove(WAV_OUTPUT_FILENAME)
오디오 변환
import torch
from transformers import AutoModelForSpeechSeq2Seq, AutoProcessor, pipeline
device = "cuda:0" if torch.cuda.is_available() else "cpu"
torch_dtype = torch.float16 if torch.cuda.is_available() else torch.float32
model_id = "openai/whisper-large-v3-turbo"
model = AutoModelForSpeechSeq2Seq.from_pretrained(
model_id,
torch_dtype=torch_dtype,
low_cpu_mem_usage=True,
use_safetensors=True,
)
model.to(device)
processor = AutoProcessor.from_pretrained(model_id)
pipe = pipeline(
"automatic-speech-recognition",
model=model,
tokenizer=processor.tokenizer,
feature_extractor=processor.feature_extractor,
torch_dtype=torch_dtype,
device=device,
)
audio_files = [
"output.mp3",
]
generate_kwargs = {
# "max_new_tokens": 448,
# "num_beams": 1,
# "condition_on_prev_tokens": False,
# "compression_ratio_threshold": 1.35, # zlib compression ratio threshold (in token space)
# "temperature": (0.0, 0.2, 0.4, 0.6, 0.8, 1.0),
# "logprob_threshold": -1.0,
# "no_speech_threshold": 0.6,
"return_timestamps": True,
"language": "korean",
}
output = pipe(audio_files, batch_size=len(audio_files), generate_kwargs=generate_kwargs)
print(output)
요약
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_ollama import ChatOllama
transcript = """
하지만 오늘 슈퍼챗이.. 슈퍼챗이 막 터지고 있어요? 나한테 들어오는 것도 아닌데.. 슈퍼챗이 오늘 왜 이렇게 잘 터져요? 여러분 감사합니다. 나랑 문헌 아니야? 아니 그래도.. 읽어줘야 된다고.. 어디서 보니까 슈퍼챗을 읽어줘야 된다고 하거든요? 원래는 그런데 우리 수사장님의.. 슈퍼챗 전화! 여러분 슈퍼챗 전화를 하는 게 아니고.. 그만 그만 그만.. 돈이 문제가 아니라.. 외롭거든요.
욕을 먹으면 외로워. 많이 옆에 있어 주시면 좋을 것 같아요. 구독 취소한 양반들 다시 구독 눌러. 취소 많이 하셨더라고요. 어차피 다시 할까? 알려라. 어차피 돌아와요 여러분. 다른 데 봐도 똑같아. 그러니까. 아니 지금 다 뉴스에서 힘들고 어려운데 사실 지금 너무나 진지하고 중요한 시점인 건 맞지만 또 저희는 저희 채널의 나름대로의 컨텐츠를 이어나가 보도록 하겠습니다.
그래서 제가 오늘 이제 돈 벌 수 있는 걸 자주 왔죠. 그렇죠. 왜냐하면 이 와중에 어차피 내일 표결 끝날 때까지 우리가 할 수 있는 게 지금은 없어. 그냥 유튜브 보고 다음 주 월요일에 뭘 사야 되는지 이런 것들 얼마나 사야 되는지 그런 걸 말씀을 드리려고 왜냐하면 이 시점에도 또 돈 버는 사람들도 있고 그러니까 또 이 나라의 정치와 경제는 또 연결이 되어 있지 않습니까? 정치도 정치지만
거기 정치에서 또 우리 지금 경제도 안 좋은데 우리 지금 오는 코스다 666 드디어 깨졌거든요? 그 얘기도 해야 되고 사실 경제도 매우 중요하죠. 자랑해야 되는데 분위기가 이래가지고 봤죠? 내가 그랬죠? 내가 빠진다고 했지? 계속 했잖아 그죠? 근데 맨날 뭐 멍마친다고 막 그러고 비웃다가 이제 와서 자랑할 때 되니까 분위기가 이러네. 어 없어졌어. 아니 근데 666에 깨지고 반등한다고 하셨거든요?
데드캡 바운스로 666 찍고 올라온다고 했는데 666 찍고? 그랬나 내가? 다시 또 지어가던데'
""".strip()
llm = ChatOllama(
model="exaone3.5:7.8b",
temparature=0,
)
prompt = ChatPromptTemplate.from_template(
"Summarize the following audio transcript. Consider that there are some strange changes to audio conversion text. Ensure that all answers are in Korean.\nTranscript:{transcript}\nSummary:"
)
chain = prompt | llm | StrOutputParser()
for token in chain.stream({'transcript': transcript}):
print(token, end="", flush=True)
Output
오늘 슈퍼챗 수익이 예상보다 훨씬 높게 나왔습니다. 하지만 진행자는 돈보다는 구독자들의 관심과 참여에 더 큰 의미를 두고 있으며, 특히 최근 구독 취소가 늘어난 상황에서 다시 구독자 확보를 독려하고 있습니다. 경제와 정치 상황이 어려운 가운데서도 채널은 현실적인 정보 제공을 계속하겠다고 밝혔습니다. 특히 주식 시장 지표인 '666'이 깨졌다는 점과 그에 따른 시장 동향 변화도 언급했지만, 분위기상 자랑하기 어려운 상황임을 인정하면서 구독자들의 지속적인 관심과 지지를 요청하고 있습니다.
728x90
반응형
'IT > AI' 카테고리의 다른 글
ORM 사용에 관한 에이전트 토론 들어보기 (2) | 2024.12.12 |
---|---|
[Stable Diffusion] Stable Diffusion 3.5 Text to Image 이미지 생성 (0) | 2024.11.28 |
Prompt Engineering Guide: Prompting Techniques (0) | 2024.11.24 |
Prompt Engineering Guide: LLM Arguments (0) | 2024.11.22 |
Llama3.1로 Github PR AI 코드 리뷰 하기 (1) | 2024.08.07 |