ChatGPT のリリース後にチャットボット、大規模言語モデル (LLM)、コパイロットなどの AI テクノロジーに関する誇大宣伝が始まると、すぐにさらに多くの使用例が登場しました。
ここで話しているのは、ライティング アシスタント、画像ジェネレーター、データに基づいてトレーニングされたチャットボットなどの最も一般的なものではありません。私が話しているのは、リアルに話すアバター、ビデオエディタ、音声合成など、よりニッチな使用例です。
この記事では、それらのユースケースの 1 つである、ポッドキャストやYouTubeビデオで使用できる文字起こしアプリについて説明します。 GPT-3 API を使用したい場合、または OpenAI Whisper のデモの動作を確認したい場合は、非常に価値があります。
このチュートリアルのパート 1 では、セットアップを行ってアプリの開発を開始するために必要なすべてのことを説明します。
そしてパート 2 では、作業コードをクラウドにアップロードし、他のユーザーが結果を確認してアプリを操作できるように、ユーザー インターフェイスを機能させます。
さあ、これを構築する Python コードを実際に使ってみましょう。
これを構築するには、3 つの行為を実行します。
最初のセクションでは、今後の旅の準備をするために必要なものがすべて表示されます。
2 つ目では、ローカルでプロトタイプを構築し、そのプロセスでどのようなツールが役立つかを調べます。
そして最後のステップでは、構築したものをすべてクラウドにアップロードして、他の人も同様に試すことができるようにします。
いいですね?
よし、それでは行ってみましょう!
まず最初に、これから行うプロセスの大まかな概要は、転写したい情報を抽出し、それを送信することです。
そこから、出力を取得し、他の人が表示して操作できるようにフロントエンド アプリケーションに表示する前に、出力に対して後処理を実行します。
このプロセスを手動で実行すると、さらにいくつかの手順が必要になります。幸いなことに、OpenAI が利用可能になりました
ここで、どの道を選択するかを決定する必要があります。
まずパスを選択してから先に進みます。
次に、GPT-3.5 Turbo モデル (基本的に ChatGPT を動かすモデル) にアクセスするために OpenAI からの API キーが必要になります。
入手方法がわからない場合は、次の手順に従ってください。
そのキーを入手したら、パズルの次のピースであるウィスパーに進みます。
次のコマンドを実行すると、Whisper の最新バージョンをダウンロードしてマシンにインストールできます。
pip install -U openai-whisper
あるいは、次のコマンドを使用して、Git から最新のコミットとその依存関係をインストールすることもできます。
pip install git+https://github.com/openai/whisper.git
これにより、インストールするバージョンをより詳細に制御できるようになります (これを Colab ノートブックから試している場合は、このコマンドを実行する必要があります)。
注: コマンド ラインから Whisper を実行する場合は、「ffmpeg」をインストールする必要があります。
Whisper がインストールされているので、必要なのは転写したい実際のファイルだけです。 「mp3」、「mp4」、「mpeg」、「wav」など、いくつかのタイプのメディア ファイルをフィードできます。
ここでの唯一の制限はファイルのサイズです。20 分のポッドキャストよりも 10 分のビデオの方がはるかに時間がかかります。
さて、ここが次の分かれ道です。
ビデオまたはオーディオのどちらを文字起こしするかを選択する必要があります。
この例では簡単にするために、ポッドキャストのオーディオ ファイルを使用します。
ここで、あなたの頭に浮かぶかもしれない質問は、「ポッドキャスト エピソードをどこからダウンロードすればよいですか?」ということです。 ”。
私が知っている方法は2つあります。
1 つ目は、ListenNotes のようなサイトを使用し、好きなポッドキャストを選択して、個々のエピソードに移動することです。
個々のエピソードとそれに対応するオーディオ ファイルにアクセスできるようにするには、アカウントを作成する必要があることに注意してください。
そこから、3 つの点のボタンをクリックして「詳細」タブを開く必要があり、音声をダウンロードするオプションが表示されます。
それは次のようになります。
2 番目のオプションは、代わりに Podchaser を使用することです。ポッドキャストを検索し、エピソード リストを確認し、特定のポッドキャストを選択するという同様のプロセスに従います。
個々のエピソードのページにアクセスすると、右側に列が表示され、その下に再生ボタンとその他のオプションが表示されます。
下にスクロールすると、ポッドキャストに関する情報、ソーシャルで共有するオプション、および音声ファイルをダウンロードするオプションを含む小さなセクションが表示されます。
それは次のようになります。
好みのオプションを選択し、長さの異なるいくつかのエピソードをダウンロードして、文字起こしプロセスがどのように機能するかをテストできます。
30 分未満のエピソードを選択することをお勧めします。
その理由は、長いものを選択すると、Whisper の処理に時間がかかり、タイムアウトの問題が発生する可能性があるためです (特に Colab 環境を使用している場合)。
20 ~ 30 分のエピソードの文字起こしには 4 ~ 8 分かかる場合があります。
ここでの主なボトルネックは、さらなる作業に使用できる結果が得られるまでの転写プロセスにかかる時間です。
これですべての要件が満たされ、セットアップが完了しました。
旅の次の部分に進む時が来ました。
私たちはより深いプログラミングの領域に入り込んでいます。
Pythonを介して Whisper を使用する方が便利なので、ここでは Python を使用します。文字起こしのために特別なことをする必要はありません。音声ファイルをモデルに渡して文字起こしを待つだけです。
それでは、そのプロセスを 1 行ずつ見てみましょう。
import whisper model = whisper.load_model("base")
ここでは、Whisper モデルの「ベース」バージョンをロードします。 OpenAI にはいくつかのバージョン (または「サイズ」) がリリースされており、パラメーターの数、消費するリソース、転写の実行にかかる時間によって異なります。
参考までに便利なチャートを示します。
必要に応じて、すべてのサイズを試してみることもできます (冗談です)。
より大きなモデルを使用する場合、そのモデルを実行するためにより多くのリソース (GPU など) が必要になることに注意してください。
したがって、これを Colab で実行している場合は、代わりにこのコマンドを使用できます。
model = whisper.load_model('medium', device='cuda')
これを実行するデバイスのパラメータを渡します。
モデルのサイズを選択したら、次のように、文字起こししたい音声ファイルを渡すことができます。
result = model.transcribe(“path-to-where-the-file-is”)
その後、内容を印刷して、転写が機能していることを確認できます。 (ただし、すべてを印刷するのではなく、最初の 1,000 文字程度だけを確認したい場合もあります。)
podcast_transcript = result['text'] podcast_transcript[:1000]
それがうまくいけば、転写プロセスの結果が変数に保存されます。後処理に使用するもの。
それは十分に簡単です。しかし、エピソードの説明で見つかる内容以外に、ポッドキャストで何が議論されたかを知る方法が必要だと仮定しましょう。
トランスクリプト全体を取得して「要旨」を提供する関数を作成できます。この概要は、すべてを確認して時間をかける価値があるかどうかを確認する時間がない忙しい人にも共有できます。
さあ、それをやってみましょう。
その要約を作成するために何を使用するかについての推測はありますか?
ヒント: すでに API キーを持っています。
はい、わかりました。
「get-3.5-turbo」モデルを使用して、ポッドキャストのトランスクリプトを提供することでこの概要を作成します。
API を直接呼び出すこともできますが、OpenAI パッケージ (適切な名前の「openai」😆) を使用する方がはるかに便利です。
モデルに送信するトークンの量を知るために、OpenAI のトークナイザー ライブラリも必要になります。
そして、次のコマンドを実行することで両方をインストールできます...
pip install openai pip install tiktoken
ここで、GPT-3 を呼び出す前に、API キーをどこかに保存する必要があります。
これを環境変数として保存し、次のようにコードで使用できるようにすることができます。
openai.api_key = os.environ["OPENAI"]
または、Colab 環境を使用している場合は、次のようなことを行うことができます。
import openai from getpass import getpass openai.api_key = getpass("Enter your key here: ")
そして、そのコマンドを実行すると、キーを貼り付けることができる入力セルが表示されます。
このコードで現在利用可能なモデルをリストすることで、キーが機能することを確認できます。
models = openai.Model.list() for model in models['data]: print(model['root'])
キーが正しく機能しているので、GPT-3 API の呼び出しを行うことができます。
しかし、最初に考慮しなければならない重要なことがあります。そしてそれは、先ほど「トークン」について述べたことに関連します。
ポッドキャストのトランスクリプトを AI モデルに渡し、その概要を返すことが目的であるため、それが受け入れることができる「トークン」の数を知る必要があります。
AI は単語や文字をカウントせず、代わりにトークンを使用します。そのため、「コンテキスト ウィンドウ」という概念が存在します。
コンテキスト ウィンドウの長さを超えると、トランスクリプトが切り詰められ、不完全なデータから概要が取得される可能性があります。 (長すぎないポッドキャスト エピソードを選択するもう 1 つの理由です。)
幸いなことに、GPT-3 モデルには 2 つのバージョンがあります。従来のものと、拡張されたコンテキスト ウィンドウを備えたもの。
OpenAI のドキュメントを確認すると、それらの違いがわかります。
そしてそれが「tiktoken」ライブラリの目的です。これは、トランスクリプトに含まれるトークンの数を知るのに役立ち、要約にどのモデルを使用するかを知ることができます。
次のコードを使用してその計算を行うことができます。
import tiktoken enc = tiktoken.encoding_for_model(“gpt-3.5-turbo”) print(“Number of tokens in the input ”, len(enc.encode(podcast_transcript)))
結果内のトークンの量が 4,097 を超える場合は、モデルの「16k」バージョンを使用する必要があります。
これを理解した後、状況に応じた適切なモデルを使用して API を呼び出すことができます。
まず、モデルに送信するプロンプトを変数に保存しましょう。独自のプロンプトを試してみることもできますが、例を次に示します。
prompt = """ You are an expert marketer responsible for the growth of several popular podcasts. You are now tasked with summarizing an episode in a way that is concise and covers the main points of the episode for others to understand. The transcript of the episode is provided below. """ request = prompt + podcast_transcript
次に、次のコードを使用して API を呼び出してみましょう。
chatOutput = openai.ChatCompletion.create(model="gpt-3.5-turbo-16k", messages=[{"role": "system", "content": "You are a helpful assistant."}, {"role": "user", "content": request} ] )
次に、API からの応答を確認してみましょう。
chatOutput.choices[0].messages.content
ほら、ありますよ! Whisper を使用して生成したトランスクリプトに基づくポッドキャスト エピソードの概要。
これと同じプロセスを使用して、エピソードの主要なハイライトを抽出できます。潜在的なリスナーに会話を覗かせる方法のようなものです。
これを行う方法は非常によく似ています。変更される唯一の部分は、モデルが受け取るプロンプトです。要約を求める代わりに、最も重要な点をリスト形式で抽出するように依頼できます。結果は、プロンプトに対するあなたの創造性によって決まります。
これが機能することがわかったので、すべてのコードを関数に入れてローカルで実行できます。
それでは、その関数を作成してみましょう。
def transcribe_podcast(file_path): print("Starting podcast transcription") # Load the Whisper model import os import Whisper print("Loading the Whisper model") model = whisper.load_model("medium") print(model.device) # Do the transcription print("Starting the transcription") result = model.transcribe(file_path) # Return the transcribed text print("Transcription completed, returning results...") return result
この関数を呼び出してオーディオ ファイルのパスを送信すると、応答として文字起こしを取得できます。
これを行う方法の例を次に示します。
output = transcribe_podcast('path_to_audio_file')
そして、トランスクリプトの内容を覗いてみます。
output[text][:1000]
さて、ここまでは順調です。
これでローカルで動作するようになったので、これをクラウドにアップロードして、他の人に見せて、l33t h4xx0r のコーディング スキルで友人や家族に感銘を与えることができれば素晴らしいでしょう。 😆
しかし、そうではありません。他の人が試しられるように、オンライン サービスにデプロイするのは良い選択です。
それをパート 2 で行います。リクエストを受け入れることができるクラウド関数を作成し、その関数の結果 (ポッドキャスト エピソードの概要とハイライトなど) を視覚化するための簡単なフロントエンドを実行します。
今のところはこのままにしておきます。
これまでのところ、アプリはローカルで動作しており、さまざまな長さのエピソードでテストして、Whisper が文字起こしにかかる平均時間を確認できます。
ここまで読んでいただきありがとうございました。
そしてパート2でもまたお会いできることを楽しみにしています。
今後の記事を見逃さないように、 Hackernoon で私を購読することを忘れないでください。