ChatGPTとWhisperで文字起こしアプリをアップデートしたけどさらにアップデートするのでソースを残しておく

みなさん、こんにちは。前回はChatGPTとWhisperを使った会議録の自動生成についてご紹介しました。役立つツールとしてフィードバックをいただきましたが、一方でいくつか改良すべき点も見つけました。今回はそれらのアップデートをご紹介します。

特に、長時間の会議を一つのファイルで処理することが難しかったため、それを改善するために音声ファイルの分割機能を追加しました。また、将来的には話者分離の機能も実装しようと考えています。

ソースコードの更新

まずは更新したapp.pyのソースコードを見てみましょう。

import gradio as gr
import openai
import os
from io import BytesIO
import tempfile
from pydub import AudioSegment
import shutil

def create_meeting_summary(openai_key, prompt, uploaded_audio, max_transcribe_seconds):
    openai.api_key = openai_key

    # 音声ファイルを開く
    audio = AudioSegment.from_file(uploaded_audio)

    # 文字起こしする音声データの上限を設定する
    if len(audio) > int(max_transcribe_seconds) * 1000:
        audio = audio[:int(max_transcribe_seconds) * 1000]

    # ファイルサイズを削減するために音声ファイルを圧縮する
    compressed_audio = audio.set_frame_rate(16000).set_channels(1)

    # 圧縮した音声ファイルをmp3形式で一時ファイルに保存する
    with tempfile.NamedTemporaryFile(delete=True, suffix=".mp3") as tmp:
        compressed_audio.export(tmp.name, format="mp3")

        transcript = openai.Audio.transcribe("whisper-1", open(tmp.name, "rb"), response_format="verbose_json")
        transcript_text = ""
        for segment in transcript.segments:
            transcript_text += f"{segment['text']}\n"

    system_template = prompt

    completion = openai.ChatCompletion.create(
        model="gpt-3.5-turbo",
        messages=[
            {"role": "system", "content": system_template},
            {"role": "user", "content": transcript_text}
        ]
    )
    summary = completion.choices[0].message.content
    return summary, transcript_text

inputs = [
    gr.Textbox(lines=1, label="openai_key", type="password"),
    gr.TextArea(label="プロンプト", value="""会議の文字起こしが渡されます。

この会議のサマリーをMarkdown形式で作成してください。サマリーは、以下のような形式で書いてください。
- 会議の目的
- 会議の内容
- 会議の結果"""),
    gr.Audio(type="filepath", label="音声ファイルをアップロード"),
    gr.Textbox(lines=1, label="最大文字起こし時間(秒)", type="text"),
]

outputs = [
    gr.Textbox(label="会議サマリー"),
    gr.Textbox(label="文字起こし")
]

app = gr.Interface(
    fn=create_meeting_summary,
    inputs=inputs,
    outputs=outputs,
    title="会議サマリー生成アプリ",
    description="音声ファイルをアップロードして、会議のサマリーをMarkdown形式で作成します。"
)

app.launch(debug=True)

これらのコードはPythonのGradio、OpenAI、PyDubなどを使っています。必要なライブラリは以下の通りです。(requirements.txt)

codeopenai==0.27.2

まとめ

この改善により、より長い会議録も簡単に文字起こしできるようになりました。これからも更なる改善を目指して進めていきますので、ご意見やフィードバックをお待ちしています。今後のアップデートにご期待ください。

この記事が気に入ったらサポートをしてみませんか?