OpenAIのWhisperを用いて動画から文字おこーし（Python）

# はじめに
[がちもとさんアドベントカレンダー](https://qiita.com/advent-calendar/2023/gachimoto3)2日目の記事です。
昨日は、[長い動画を25MB以内の動画に分割](https://qiita.com/SatoshiGachiFujimoto/items/b9eb245d351c3c4cc889)しました。今日は、OpenAIのWhisperを使って動画から文字起こししていきます。

# 開発環境
- Windows 11 PC
- Python 3.11

# OpenAIの場合

## 導入
1．ライブラリのインストール
pip install openai

2．以下のリンクからOpenAIのAPIキーを作成してください

https://platform.openai.com/api-keys

3．プログラムの作成

~~~transcribe.py
import json
from openai import OpenAI
client = OpenAI(api_key="<INSERT-YOUR-API-KEY>")

# File uploads are currently limited to 25 MB and the following input file types are supported: mp3, mp4, mpeg, mpga, m4a, wav, and webm.
audio_file= open("example_000001.mp4", "rb")
transcript = client.audio.transcriptions.create(
    model="whisper-1", 
    file=audio_file,
    # response_format="text",
    language="ja"
)

print(transcript)

with open("example_000001.json", 'w', encoding='utf-8') as json_file:
    json.dump(transcript.model_dump_json(), json_file, ensure_ascii=False, indent=4)
~~~

<details><summary>コード解説</summary><div>

このコードは、OpenAIのAPIを使用して、音声ファイルからテキストトランスクリプトを生成するためのPythonスクリプトの一部です。以下はスクリプトの主要な要点です：

1．必要なライブラリをインポートします。

- json: JSONデータを操作するためのライブラリをインポートします。
- openai: OpenAIのAPIを使用するためのライブラリをインポートします。

2．OpenAIのAPIキーを設定します。
- `<INSERT-YOUR-API-KEY>`の部分を、OpenAIのAPIキーに置き換える必要があります。APIキーはOpenAIのプラットフォームから取得できます。

3．音声ファイルを開きます。
- audio_file変数を使用して、"example_000001.mp4"という名前の音声ファイルをバイナリモードで開きます。

4．テキストトランスクリプトを生成します。

- client.audio.transcriptions.createメソッドを使用して、音声ファイルからテキストトランスクリプトを生成します。
- modelパラメータは、使用するモデルを指定します。この例では、"whisper-1"モデルが指定されています。
- fileパラメータには、音声ファイルが渡されます。
- languageパラメータは、音声の言語を指定します。この例では、日本語 ("ja") が指定されています。

5．トランスクリプトを出力します。

- 生成されたトランスクリプトは、transcript変数に格納されています。
- printステートメントを使用して、トランスクリプトをコンソールに表示します。

6．トランスクリプトをJSONファイルに保存します。
- トランスクリプトをJSON形式で保存するために、json.dumpメソッドを使用します。ファイル名は "example_000001.json" と指定されています。

</div></details>

## 実行結果

~~~example_000001.json
{
  "text": "はい始まりました こんにちはつくれる直日ですよろしくお願いします はいえーとこちらの作れるの youtube チャンネルなんですけど私たち株式会社つくれるは主にですねラズベリーパイヤー m 5 スタックを使った エイヤーや iot に関するプログラミング教材を販売している会社でございます ですがえっと株式会社作れるっていう名前の由来になっているのが プログラミングで何かを作れる人をたくさん増やしたいの中にたくさん増やしたいという 理念がありますなのでえっと m 5スタックとか あのラズベリーパイに関わらずいろんなものづくりしている人を えっとこの作れるの youtube にお呼びしてお話を聞いて 皆さんに聞いていただくことでものづくりのモチベーションを上げていただこうとそういう ふうに思って活動しておりますということでえっと今日 インタビューさせていただける方としてガチモトさんをあのお呼びしています こんにちは じゃあガチモトです よろしくお願いします勝本さんはですねなんか今 m 5スタックを使って あの後バスが何分後に来るのかっていうのを表示するみたいなものを作って 結構バズリー バズリバズリする 方でえっとそういったことやあとが地元さんのあの普段行っているプロジェクトで あったりだとか研究とかについても話を伺って でえっと最後ちょっと各地みたいなもの あのあるみたいなのであのそういうことも含めてお話し聞いていきたいなと思っております ということでガチモトさんよろしくお願いしますはい 宜しくお願いします スライドを用意していただいているみたいなのでお願いします はい見えてますんでしょうか見てます はいでは a 上に伸ばしてリバスがあと何分でつくかだけを表示する ミニサイズネージを作りましたっていうところで a 学校とが 発表しますはい でまず自己紹介なんですけどえっとガチモトって言います あのニックネームです の由来があの熊本で技術コミュニティを熊 mcn っていうのをやってるんですけど そのコミュニティの中でまあ唯一のガチ勢としてガチガチもとって言われてます ガチ勢だからはいはい あと会社の方はナルチコミュニケーションの r & b 戦略チーム でてクラウドサービスの運用保守の会社なんですけど まあそこで新しいことをやろうというところで あのマイクロソフトのホロレンズ AR のメガネを 使ったアプリを開発したりとかまあ aik のプロジェクトをやったりとかしています あとは光線で制御工学学学んで大学でセンシングをやったんで次は脳みそ作り たいなぁと思って日々 勉強しているところです あとは ar ナビゲーションとか電動車椅子の自動運転に関する研究開発がメインで起こって ます 専門はコンピュータービジョン画像処理ロボティックス制御工学とか電子電気電子会を ます ピッターフォローお願いしますいう感じです じゃあですねえっと明日の話は ちょっと置いといてそうですねまずプログラミングのきっかけなどを教えていただければ なと思います学生時代話をしたいと思います プログラミングのきっかけなんですけど 僕は18歳、光線の時にプログラミングって学ぶんですけど 実際になんか自分から作ろうと思ったのは18歳ぐらい で本屋さん行った時に14歳でも14歳から始めるアクションスクリプトっていう 当時なんかウェブサイトでフラッシュゲームとか流行ってた時なんですけど それでなんか14歳でもできるんだから俺もできるやろうと思って買った本 これになります ここからなんか自分でちゃんとプログラミングしてなんかフラッシュゲームとか作ったりとか 当時なんかマッシュアップとか流行ってたんでウェブ上でインタラクティブな ちょっとアートっぽい サイト作るみたいなのも流行ってたんでそういうのをなんか自分で作ったりとかしてました そっからなんかスイッチが入って まああの高専の4年生で創造研究というのがあるんですけど ここでチョロキューの遠隔操作をする この一番右の動画なんですけど 共有されてますか? はい共有されてます この方はレイルスを使って 遠隔地のチョロキューをキーボード操作で操作するっていうのをやってらっしゃるんですね それをまああのフラッシュでやりたかったんで 移植 そのフラッシュのゲーム 使うとウェブ上で共有するだけであの 遠隔地のウェブカメラの映像とかあのキーボードと共有できる機能があるんですよ それを使ってあとはゲイナーっていうあのこういうマイコンですね 今でいうとアルディーノみたいなのがあって それがフラッシュから動かせるマイコンなんです それを使ってチョロキューを遠隔操作するっていうのをやりました 当時の動画とかないんですけど そうですね私ちょっとガチモトさんのあの実際の年齢を聞いて驚いちゃいました 私33になっちゃいます 本当に見えないですよね 動画んですか ということでそうですね動画はないって言わない ありがとうございます チョロキューまあやっぱりちょっとあれですねこう チョロキューみたいな動かしてみようみたいなとか 自分でもできるんじゃないかってところから始まったって感じですね 当選で制御工学をやってたんです"
}
~~~

# Azure OpenAIの場合

## 導入
1．ライブラリのインストール
pip install requests

2．Azureポータルにログインし、米国中北部（North Central US）または西ヨーロッパ リージョン（West Europe）のAzure OpenAIリソースを作成

3．whisperモデルをデプロイ（デプロイ名はwhisperとした）

4．エンドポイントとAPIキーをコピー

5．プログラムの作成

~~~transcribe.py
import json
import requests

# Azure OpenAI エンドポイントとキーを設定
endpoint = "https://s-fujimoto-northcentralus.openai.azure.com/"
api_key = "<INSERT-YOUR-API-KEY>"
deployment_name = "whisper"

# 使用するファイルのパス
file_path = "example_000001.mp4"

# ヘッダーとデータの準備
headers = {
    "api-key": api_key,
}

# ファイルを読み込み
with open(file_path, 'rb') as f:
    files = {'file': (file_path, f)}

    # APIにリクエストを送信
    response = requests.post(f"{endpoint}openai/deployments/{deployment_name}/audio/transcriptions?api-version=2023-09-01-preview&language=jp", headers=headers, files=files)

# レスポンスを表示
print(response.json()["text"])

with open(file_path.replace(".mp4", ".json"), 'w', encoding='utf-8') as json_file:
    json.dump(response.json(), json_file, ensure_ascii=False, indent=4)
~~~

<details><summary>コード解説</summary><div>

このコードは、Azure OpenAIを使用して音声ファイルからテキストトランスクリプトを生成し、結果をJSONファイルに保存するPythonスクリプトの一部です。以下はスクリプトの主要な要点です：

1．必要なライブラリをインポートします。

- json: JSONデータを操作するためのライブラリをインポートします。
- requests: HTTPリクエストを送信するためのライブラリをインポートします。

2．Azure OpenAIのエンドポイント、APIキー、デプロイメント名を設定します。

- endpoint変数にAzure OpenAIのエンドポイントURLを設定します。
- api_key変数にAzure OpenAIのAPIキーを設定します。
- deployment_name変数に使用するデプロイメント名（"whisper"など）を設定します。

3．使用する音声ファイルのパスを指定します。
- file_path変数に音声ファイルのパス（"example_000001.mp4"など）を設定します。

4．リクエストのヘッダーとデータを準備します。
- headers変数にAPIキーを含むヘッダー情報を設定します。

5．音声ファイルを読み込みます。
- with文を使用して音声ファイルをバイナリモードで開きます。

6．APIにリクエストを送信します。
- requests.postメソッドを使用して、Azure OpenAIのAPIエンドポイントにリクエストを送信します。
- ファイルデータはfilesパラメータを介して送信されます。
- endpoint、deployment_name、言語、およびAPIバージョンがリクエストに含まれています。

7．レスポンスを表示します。
- リクエストの結果として返されたJSONデータから、テキストトランスクリプトを抽出し、コンソールに表示します。

8．トランスクリプトをJSONファイルに保存します。
- トランスクリプトとAPIからのその他の情報がJSON形式でファイルに保存され、ファイル名は元の音声ファイルの拡張子を ".json" に置き換えたものになります。

</div></details>

## 実行結果

~~~example_000001.json
{
    "text": "はい始まりました こんにちはつくれる直日ですよろしくお願いします はいえーとこちらの作れるの youtube チャンネルなんですけど私たち株式会社つくれるは主にですねラズベリーパイヤー m 5 スタックを使った エイヤーや iot に関するプログラミング教材を販売している会社でございます ですがえっと株式会社作れるっていう名前の由来になっているのが プログラミングで何かを作れる人をたくさん増やしたいの中にたくさん増やしたいという 理念がありますなのでえっと m 5スタックとか あのラズベリーパイに関わらずいろんなものづくりしている人を えっとこの作れるの youtube にお呼びしてお話を聞いて 皆さんに聞いていただくことでものづくりのモチベーションを上げていただこうとそういう ふうに思って活動しておりますということでえっと今日 インタビューさせていただける方としてガチモトさんをあのお呼びしています こんにちは じゃあガチモトです よろしくお願いします勝本さんはですねなんか今 m 5スタックを使って あの後バスが何分後に来るのかっていうのを表示するみたいなものを作って 結構バズリー バズリバズリする 方でえっとそういったことやあとが地元さんのあの普段行っているプロジェクトで あったりだとか研究とかについても話を伺って でえっと最後ちょっと各地みたいなもの あのあるみたいなのであのそういうことも含めてお話し聞いていきたいなと思っております ということでガチモトさんよろしくお願いしますはい 宜しくお願いします スライドを用意していただいているみたいなのでお願いします はい見えてますんでしょうか見えてます はいでは a 上のバス停にバスがあと何分で着くかだけを表示する ミニサイズネージを作りましたっていうところで a 学校とが 発表しますはい でまず自己紹介なんですけどえっとガチモトって言います あのニックネームです の由来があの熊本で技術コミュニティを熊 mcn っていうのをやってるんですけど そのコミュニティの中で まあ唯一のガチ勢としてガチガチモトって言われてます ガチ勢だったらはいはい あと会社の方はナルチコミュニケーション r & b 戦略チーム クラウドサービスの 運用保証の会社なんですけどまぁそこで新しいことやろうというところで あのマイクロソフトのホロレンズ AR のメガネを 使ったアプリを開発したりとかまあ AI 系のプロジェクトをやったりとかしています あとは光線で静岡工学学んで大学でセンシングをやったんで次は脳みそ作りたいなぁ と思って日々 勉強しているところです あとは AR ナビゲーションとか電動車椅子の自動運転に関する研究開発がメインで 起こってます 専門はコンピュータービジョン 画像処理ロボティックス制御工学とか電子電気電子会話になります ツイッターフォローお願いしますという感じです じゃあですねえっと明日の話は ちょっと置いといて そうですねまずプログラミングのきっかけなどを教えていただければと思います 学生時代の話をしたいと思います プログラミングのきっかけなんですけど 僕は光線の時にプログラミングって学ぶんですけど 実際になんか自分から作ろうと思ったのは18歳ぐらい で本屋さん行った時に14歳から始めるアクションスクリプトっていう 当時なんかウェブサイトでフラッシュゲームとか 流行ってた時なんですけど それでなんか14歳でもできるんだから俺もできるやろうと思って買った本がこれになります ここからなんか自分でちゃんとプログラミングして なんかフラッシュゲームとか作ったりとか 当時なんかマッシュアップとか流行ってたんで ウェブ上でインタラクティブなちょっとアートっぽい サイト作るみたいなのも流行ってたんでそういうのをなんか自分で作ったりとかしてました そこからなんかスイッチが入って 光線の4年生で創造研究っていうのがあるんですけど ここでチョロキーの遠隔操作する この一番右の動画なんですけど この方はレイルズを使って遠隔値のあるチョロキーをキーボード操作で操作するっていうのをやってらっしゃるんですね それをフラッシュでやりたかったんで 移植 フラッシュのゲーム使うとウェブ上で共有するだけで 遠隔値のウェブカメラの映像とかキーボードとか共有できる機能があるんですよね それを使って あとはゲイナーっていうマイコンですね 今でいうとアルディーノみたいなのがあって それがフラッシュから動かせるマイコンなんです それを使ってチョロキーを遠隔操作するっていうのをやりました 当時の動画とかはないんですけど そうですね 私がちもとさんの実際の年齢を聞いて驚いちゃいました 私33になっちゃいます 本当に見えないですよね 動画はないです ありがとうございます やっぱりチョロキーを動かしてみようみたいなのとか 自分でもできるんじゃないかってところから始まったって感じですね 当選で定業工学をやってたんですか?"
}
~~~

お疲れさまでした。