⌨️

Whisperで文字起こしをした文章をChatGPTでいい感じにする

2023/05/31に公開

Whisperで文字起こしした文章をいい感じにしたい

注:あくまで個人的な使用を前提とした文字起こしの方法の紹介です。許可なく、他人のコンテンツを全部文字起こしして公開すると、著作物の改変などの問題になる可能性があると思います

タイトル通りです。

Whisperで文字起こしをしました。
https://zenn.dev/karaage0703/articles/ecfab2effb7c31

ただ、以下のように句読点がない文章になってしまい、読みづらいです。

樋口 世界の歴史キュレーションプログラム コテンラジオ樋口 世界の歴史キュレーションプログラム コテンラジオパーソナリティーの株式会社ブック代表樋口清則 です深井 そして株式会社コテンの深井 隆之介です樋口 そして株式会社コテンの楊 英史です樋口 このラジオは歴史を愛し歴史 の面白さを知りすぎてしまった深井さんを代表とする株式会社 コテンのお二人と一緒に学校の授業ではなかなか学べない国内外 の歴史の面白さを学んじゃおうという番組ですよろしくお願いします

これを修正するのは結構たいへんそうですね。いい感じにやっておいて欲しいです。

ChatGPTでいい感じにする

こんなときに頼りなるのがChatGPTですね。プロンプトはこんな感じです。

次の文章の誤記訂正、句読点の追加をしてください。
極力元の文章は変更しないようにしてください。


ここから修正したい文章を入力

実際にChatGPTで試してみましょう。GPT4です。

入力(の一部)

出力(の一部)

いい感じですね。凄いです。

トークン数の制限

ただし、ここでトークン数の問題があります。
https://platform.openai.com/docs/models/gpt-4

GPT-3.5で4096トークン

GPT-4で8192トークンです

GPT-4-32kは32768トークンをほこりますが、残念ながらまだ使えないようです。

https://community.openai.com/t/how-to-get-access-to-gpt-4-32k/104803

ちなみに、このトークン数は入力、出力含めた数なので、今回のように入力と同じくらいのトークン数が出力される場合は、GPT-3.5だと約2000トークン程度しか入力できないことになります。出力のトークン数の変動を考慮すると1000トークンくらいに押さえておくのがベターかもしれません。

私が文字起こししたコテンラジオの1エピソードのトークン数は、Google Colabで以下のようなコードを実行すると確認できます。コードはopenai/tiktokenを参考にしました

!pip install -qq tiktoken
import tiktoken
from tqdm import tqdm

text = 'トークン数を数えたいテキスト'
model_name = 'gpt-4'
encoding = tiktoken.encoding_for_model(model_name)
count = len(encoding.encode(text))
print(count)

結果は、約1万(9856)。GPT4でも全部は入らないですね。

分割しよう

困難な問題は分割しようということで、分割するのが良いですね。

適当にブラウザ画面で、手作業でちまちま分割した文章をコピペしてもよいのですが、結構面倒です。面倒なことはPythonにやらせてしまいましょう。

といっても、単純に適当に文字数だけで区切ると、区切りが変になるので、形態素解析して分割します。

ChatGPTに「Pythonで日本語の形態素解析をした上で、長文を1000単語で分割してください」と聞いたら、いい感じのコードを書いてくれたので利用します。

注: 本当は、形態素単位でなく、1文単位で区切れるとよさそうですが、文章修正は要約などのタスクと違い、区切りがそれほど問題にはならないと考えられるので今回はサボります。

!pip install -qq janome
from janome.tokenizer import Tokenizer

def split_text_into_chunks(text, max_tokens=1000):
    tokenizer = Tokenizer()
    tokens = list(tokenizer.tokenize(text, wakati=True)) # wakati=True returns a list of words
    chunks = []

    for i in range(0, len(tokens), max_tokens):
        chunk = tokens[i:i+max_tokens]
        chunks.append(''.join(chunk))

    return chunks

chunks = split_text_into_chunks(transcription_text)

あとは、これを順にChatGPTのAPIで処理してあげればOKです。

GPT3.5とGPT4では、GPT4の方が仕上がりが優秀ですが、GPT4だとその分時間とお金がかかるという感じですね。

Whisperにプロンプト追加

こんなアドバイスをいただきました。

https://twitter.com/t_andou/status/1664060197927788544

調べたら、確かにやっている人がいました。

https://alpcom.co.jp/blog/20230330-3/

なんでことだ、今までやってきたことは無駄だったのかと絶望しかけましたが、試したところ、自分の手持ちのオーディオファイルではWhisperへプロンプト入力しても、文字起こし文章に句読点の追加はできませんでした。

嬉しいような残念なような結果ですね。

まとめ

文字起こしした文章をいい感じにするのに、ChatGPTが便利という話でした。

そのうち、Whisperがレベルアップして一発でオーディオファイルから高品質のテキストが文字起こしできるようになったり、ChatGPTのトークン数制限が100万トークンになったら用無しではありますが、それまで待てないので自分のために作ってみました。こういった複数のAIを組み合わせて何かタスクを実現するというものが、今後タケノコのようにニョキニョキ出てくるんじゃないかなと思っています。

文字起こしから、この記事で紹介した文章の修正までを含めてまとめたGoogle ColabのノートブックをGitHubにアップしました。自分のメモ的なコードなのであんまり説明は詳しくないです、ノリと勘で使っていただければ…

transcription.ipynb

ChatGPTのAPI(文章の修正)を使う場合は、Open AIのシークレットキーが必要です。文字起こしだけなら不要です(ノートブックの前半が文字起こし部分です)。

参考リンク

https://nikkie-ftnext.hatenablog.com/entry/how-easy-youtube-transcript-api-and-langchain-youtubeloader

https://rollbar.com/blog/chatgpt-api-rate-limit-error/

関連記事

https://zenn.dev/karaage0703/articles/ecfab2effb7c31

https://zenn.dev/karaage0703/articles/d47bbb085fcb83

変更履歴

  • 2023/06/03 Whisperへのプロンプト入力に関して追記

Discussion