OpenAIを利用して、文字起こし、テキストの要約、画像生成を試してみた

2023.05.31

こんにちは。データアナリティクス事業本部 サービスソリューション部の北川です。

普段の開発では、フロントエンドを担当することが多いのですが、最近はバックエンド側を触る機会も増えてきたので、今回はキャッチアップも兼ねてPythonでOpenAIの機能をいくつか試してみました。

OpenAIの機能を色々触りたいので、今回は以下のことを試していきます。

  • OpenAIを利用して、音声ファイルから文字起こしを行う
  • OpenAIを利用して、文字起こしした内容を要約してもらう
  • OpenAIを利用して、その内容をイメージした画像を生成してもらう

事前準備

APIキーの設定

openAIにログインし、右上の自分のアカウントから[View API keys]に移動します。移動先のAPI KEYから[+create new secret key]に任意のkey名を指定して、作成することができます。

こちらのエントリにも、APIキーの取得方法が記述されています。

openaiをインストールし、ファイル内でAPIキーを読み込みます。

pip install openai
import openai

openai.api_key = "取得したキー"

文字起こし Audio

Audioを利用することで、音声をテキストに変換することができます。

openai.Audio.transcribe("whisper-1", file)

以下のような関数を作成します。今回は、文字起こししたテキストを、"sample-file"に書き込んでいます。

def audio_to_text(filename):
    audio_file = open(os.path.join(".", filename), "rb")
    print("audio_file", audio_file)

    transcript = openai.Audio.transcribe("whisper-1", audio_file)

    res = transcript["text"]
    res = res.replace(" ", "\n")

    with open(f'./sample-file.txt', 'w+') as file:
        file.write(res)

    return res

transcribeの第一引数には、使用するモデルを渡します。Audioでは、現在"whisper-1"のみ使用できます。第二引数では、文字起こしを実行する対象のファイルを指定します。必須の引数はこの二つになります。

実際にサンプルのデータを渡して、実行してみました。

無事に文字起こしされています。

テキストの要約 Completion

Completion()を使用することで、プロンプトを作成して、openaiに投げることができます。

response = openai.Completion().create(
    model="text-davinci-003",
    prompt=prompt,
)

利用するモデル、プロンプト、返答数、トークン上限などを指定できます。モデルの指定は必須になります。

以下のように関数を作成してみました。responseは、choicesプロパティに配列で返ってきます。

def summarize_Text():
    with open('./sample-file.txt', encoding='UTF-8') as f:
        data = f.read()

    prompt = f"以下のテキストを要約して、タイトルを提案してください。返答形式は、'タイトル:タイトル名'にしてください: {data[:400]}"

    response = openai.Completion().create(
        model="text-davinci-003",
        prompt=prompt,
        n=1,
        max_tokens=128
    )
    print("@@@@@",response['choices'][0]['text'], "@@@@@")

    return response['choices'][0]['text']

文字起こしをしたテキストを要約し、タイトルを提案してもらうようプロンプトを作成しています。また、文字起こししたテキストが長すぎる場合を考慮して、冒頭400文字までを渡すようにしています。

先ほど作成されたテキストを使用して、試してみます。

@@@@@ 
何なのか
話しをして
で
タイトル:アルファ説明会の資料作成及びタイムテーブル確認 @@@@@

余分な返答も返ってきていますが、無事にタイトルを生成することができました。文字起こしの内容とも、ある程度マッチしています。

@@@@@
こんな内容があるっていうのを
説明する資料を
準備していたので
レビューをしていただきたいって
こういう感じで話がなってあるという

タイトル:アルファ説明会に関する目標設定 @@@@@

複数回試しましたが、同じような内容が返ってきます。

画像生成 Image

最後に、タイトルに合うような画像を生成してもらいます。

画像の作成には、Imageを使用します。

どのような画像を生成するか、決定するためのpromptが必須です。

response = openai.Image.create(
                prompt = text,
            )

以下のような関数を作成します。生成された画像は"sample-image.jpg"に保存されます。

def create_image(text):
    response = openai.Image.create(
                  prompt = text,
                  n = 1,
                  size = '512x512',
                  response_format = "url"
                )

    image_url = response['data'][0]['url']

    image_data = requests.get(image_url).content
    with open("sample-image.jpg", "wb") as f:
        f.write(image_data)

    return image_url

今回は検証ですので、引数にそのままタイトル以降の文字列を渡してみました。

うーん、なんとも言えないですね笑。ただ、openaiを利用して、画像を生成することができました。

まとめ

今回は、OpenAIのキャッチアップとして、文字起こししたテキストを要約して画像生成を試してみました。実際のコードに関しても、OpenAIを利用しながら記述しており、今回のブログを通してかなり活用できたと思います。今後も、さまざまな場面で利用していこうと思います。

ではまた。