📒

Streamlitでmp3を文字起こし⇒要約(LangChain)

2024/04/20に公開

どのようなものを作ったか

1-1. mp3をアップロードする

1-2. ファイル情報が表示される

2-1. Runを押す。文字起こしされる。

2-2. 更に待っていると、要約されたものが表示される

参考にしたもの

以前作成した記事で、Google Colabをつかって動かしていましたので画面があったら良いなと思いつくりました。前回は文字起こしの時間がかかっていたため改善も合わせて行っています。
Youtube⇒mp3⇒文字起こし⇒要約(LLM活用)
https://zenn.dev/icck/articles/78923d81cb7ece

ソースコード

import streamlit as st
from dotenv import load_dotenv
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
from openai import OpenAI

load_dotenv()

client = OpenAI()

model = ChatOpenAI(model="gpt-4-turbo-2024-04-09", streaming=True)

prompt = PromptTemplate.from_template("""あなたは要約することが得意です。
inputを箇条書きなど駆使し、みやすくmarkdown記法を使って要約します

input: {input}""")

chain = prompt | model | StrOutputParser()

st.header("音声を文字起こし、GPTで要約する")

upload_file = st.file_uploader("Upload a file", type=["mp3"])

if upload_file is not None:
    st.subheader("File content")
    file_content = {"name": upload_file.name, "type": upload_file.type, "size": upload_file.size}
    st.write(file_content)

if st.button("Run"):
    if upload_file is None:
        st.error("Please upload a file")
    else:
        transcript = client.audio.transcriptions.create(
            model="whisper-1", file=upload_file, response_format="text",
        )
        st.write(transcript)
        st.success("Transcription completed")

        summary = chain.stream(input=transcript)
        st.write_stream(summary)
        st.success("Summary completed")

一部解説

文字起こし

transcript = client.audio.transcriptions.create(
    model="whisper-1", file=upload_file, response_format="text",
)
  • LangChainにaudioが見当たらなかったためOpenAIのパッケージを使っています。
  • 直接whisperを使うよりOpenAIの内部API経由で利用したほうが2倍以上の速度が出ます

ストリーミング

model = ChatOpenAI(model="gpt-4-turbo-2024-04-09", streaming=True)
...
summary = chain.stream(input=transcript)
st.write_stream(summary)
  • chain.invokeではなくstreamを利用することでストリーミング処理に対応させます。
  • streamlitにあるwrite_streamを活用すると簡単な実装でストリーム処理を実現できます。

さいごに

mp3ファイルは3分のものを使いました。容量の制限などはstreamlitなどを調整することで解決すると思います。簡単ですのでお試しくださいませ。

Discussion