2025년 7월 4일 금요일

파이썬으로 음성 파일 빠르게 요약하기

 openapi도 좋지만 요금 구글 재미나이나 음성인식등이 나름 잘되어 있다.

그래서 전화 통화내용이라던가 특정 음원파일을 텍스트파일로 변환하여

재미나이 api를 이용하여 내용을 요약하는 파이썬 코드를 만들었 드랬다.

추후에 뭐 이걸가지고 tkinter를 이용하여 변환 내용을 gui로 처리하는것도

고려해 봄직하다.   (근데 귀찮아서 할수 있을꺼 같아??)

암튼 코드는 아래와 같다..  중간에 MY_API_KEY 같은 경우는 새로 프로젝트 만들어서

하나 발급 받으면 된다.  구글 써치로 재미나이 api 키 발급으로 검색하면 된다.

필요한 라이브러리는 whisper, google.generativeai

pip install openai-whisper

pip install google.generativeai

이고 중간에 wav파일로 변환을 위해서 ffmpeg를 사용하는데

아래의 링크에서 bin파일을 다운로드해서 실행폴더에 붙혀넣기 한다.

ffmpeg.exe, ffplay.exe, ffprove.exe ... 이런 파일 있으면 된다.

FFMPEG 깃헙 링크


import os
import sys
import subprocess
import whisper
import google.generativeai as genai

def convert_audio_to_wav(audio_file_path):
    #입력 파일의 기본 이름과 확장자를 가져옵니다.
    base_name = os.path.splitext(os.path.basename(audio_file_path))[0]
    output_filepath = f"{base_name}.wav"
    #
    command = [
        "ffmpeg",
        "-i", audio_file_path,
        "-acodec", "pcm_s16le",
        "-ar", "44100",
        "-ac", "2",
        "-y", # Ask to overwrite output files
        output_filepath
    ]

    try:
        result = subprocess.run(command, capture_output=True, text=True, check=True)
        print(f"'{audio_file_path}'를 '{output_filepath}'로 성공적으로 변환했습니다.")
        return output_filepath

    except FileNotFoundError:
        print("오류: 'ffmpeg' 명령어를 찾을 수 없습니다.")
        print("시스템 PATH에 FFmpeg가 설치되어 있고 올바르게 설정되어 있는지 확인하세요.")
        return ""
    except subprocess.CalledProcessError as e:
        print(f"오디오 변환 중 오류가 발생했습니다 (FFmpeg 종료 코드: {e.returncode}):")
        return ""
    except Exception as e:
        print(f"예기치 않은 오류가 발생했습니다: {e}")
        return ""

def transcribe_audio(audio_file_path):
    print("Whisper 모델을 로드 중입니다. (처음 실행 시 시간이 걸릴 수 있습니다)...")
    model = whisper.load_model("base")
    print("Whisper로 음성 인식 중입니다...")
    try:
        result = model.transcribe(audio_file_path, language="ko")
        return result
    except:
        return "음성인식중 오류가 발생하였습니다."

def summerize_from_string(text_content):
    if len(text_content) > 100000: # 예시로 10만자로 제한 (모델마다 다름)
        print("10만자 이상의 내용은 부분적으로 잘라서 사용해 주세요")
        return ""    
    #재미나이 모델 초기화
    model = genai.GenerativeModel('gemini-1.5-flash')

    # 요약 프롬프트 생성
    prompt = f"""
    다음 텍스트를 요약해주세요. 한국어로 요약해 주세요.

    ---
    {text_content}
    ---

    요약:"""
    # 6. 모델 호출 및 요약 결과 받기
    try:
        print("Summarizing the document with Gemini API... Please wait.")
        response = model.generate_content(prompt)
        summary = response.text
        #
        return summary
    except Exception as e:
        print(f"재미나이 API호출중 에러: {e}")

def save_file_from_string(a_string, a_file_path):    
    # 파일을 '쓰기' 모드 ('w')로 열고 문자열을 씁니다.
    with open(a_file_path, 'w', encoding='utf-8') as f:
        f.write(a_string)
    print(f"'{a_file_path}' 파일에 텍스트가 성공적으로 저장되었습니다.")


if __name__ == "__main__":
    genai.configure(api_key="MY_API_KEY")
    audio_file = sys.argv[1]            #인자로 들어온 오디오파일
    summer_file = "output.txt"         #요약결과 저장파일 경로

    if os.path.exists(audio_file):
        if not audio_file.endswith('.wav'):
            print("\n--- wav파일로 변환중.. ---")
            audio_file = convert_audio_to_wav(audio_file)    
        print("\n--- 변환을 시작합니다.. ---")
        sound_to_text = transcribe_audio(audio_file)
        print("\n--- 내용을 요약합니다.. ---")
        summer_text = summerize_from_string(sound_to_text)
        print("\n--- 결과를 저장합니다.. ---")
        save_file_from_string(summer_text, summer_file)

    else:
        print(f"오류: '{audio_file}' 파일을 찾을 수 없습니다. 경로를 확인해주세요.")



요로코롬...

씨야~~

댓글 없음:

댓글 쓰기