PodcastをAIに聴いてもらって文字起こし、タイトル決め、要約までやってもらった
カレーちゃんさんが投稿されていた「Podcastの音声をWhisperで文字起こしして、ChatGPTで要約してみた」という記事を読みました。
そうそう、これやってみたかったんだよ!とテンション上がったので、自分もやってみたくなりました。
最近 Microsoft Bing の AIチャット で Power Apps のアプリ作成方法などを教わっているので、Whisper で文字起こししてもらったテキストの要約は Bing でやってみます。その要約を、この音源を Podcast に投稿するときの「エピソードの説明」として掲載します。タイトルも決めてもらいましょう。
適当な音源とGoogle Colab、Microsoft Bingがあればすぐに試せますね。
(Google Colab は、正月に買った『強い将棋ソフトの創りかた: Pythonで実装するディープラーニング将棋AI 』で使っていたのですぐに使えた。)
音源を用意する
Anchorのライブラリから、本日iPhoneで録音してアップロードしておいた音源をPCにダウンロードします。
m4a形式になっているので、mp3形式に変換します。
変換には、以下のwebサービスを使いました。
Whisper で音源→ テキストを実行する @ Google Colab
Google Colab で新しいノートブックを作成し、そこのファイルにmp3音源をアップします。
GitHubにあるWhisperを呼び出して音源をテキストにしてくれるコードを書いて、実行します。
!pip install git+https://github.com/openai/whisper.git
import whisper
model = whisper.load_model("large")
result = model.transcribe("適当な音源.mp3", verbose=True, language='ja')
print(result["text"])
そのまま待ちます。その間に、この記事を書いています。
今回の音源長さは9分40秒で、コードの実行から完了まで、つまり文字起こしが完了するまでにかかった時間は45分51秒でした。5回聴き返したくらいですね。
Google Colab は無料のものをそのまま使っているので、スペックを上げればもっと早く処理が終わりそうです。
これが文字起こしの結果です(原文ママ)
それでは今日も記録していきます スペアジア海ブス第782回です今日は2月18日 時刻は20時前ぐらいですなんかねだいぶあったかくなって 過ごしやすいというか外で活動しやすい日だったので前々からやろうと思ってた人感センサーライトをバラしてちょっと作り変えるっていうのをやろうと思ってたんですけどそれのねそもそもの人感センサーライトを 買いに行くっていうことをやってたんですが結局ね探してた商品が見つからなかったんですよねダイソーの人感と明暗センサーが付いてて電子で動くタイプのそういう商品が300円で売ってたんですけどそれをね買うタイミングを逃してダイソー3軒ぐらい回ったんですけどどこにも売ってなくて他のセリアとかキャンドゥとか色々見たんですけどねやっぱりそういうセンサー系のライトはダイソーでしか売ってなくてですねダイソーのオンラインショップを探してみて店舗になくてもオンラインにはあるやろうと思ったんですけどオンラインショップでも神奈川県内でも配送できるタイプはゼロですって出てて東京やったらね残りわずかであるのでもちろん東京の方まで足を伸ばせばもしかしたら買えるかもしれないなっていう状態なんですよねもともと探してたのが人感透明感センサー付きの電池で動くタイプの四角いタイプ電池を横並びで3本入れるタイプのもので先週ね、実は先週も探してたんですけど単四電池を縦に3本つなげた武永タイプのライトっていうのは売ってたんですそっちでいいかしゃーないかなと思ってそっちを買うことに切り替えてこの前見に行った店舗行ってみると全部売り切れててしかもオンラインショップで見たらそれも在庫ゼロになっててどういうことやねんっていうそういうどこ行っても人感センサー明暗センサー付きの3電池タイプのライトが買えないっていう状態でしたでも800円くらい出したらダイソーじゃないところが作ってる商品は買えるんで全くないわけではないんですけどどうせぶっ壊すしなと思ってそれに800円出したのもあれやなと思いつつでも色々探す手間とか考えたらたぶんさっさと買ってしまった方が安いような気もしてますその商品がなくなっている代わりにソーラーで動く屋外でも使えるような人感センサーと明暗センサー付きのライトが500円になって売ってるんですよねそっち買うかなと思ったんですけどソーラーユニットいらんしなみたいなソーラーユニットとまあ、セイキンっていうかダイソー以外の商品を800円で買うよりもソーラー600円のやつを買ってソーラー洗わせた方が安いっちゃ安いか最終的にはこれが4電池3本で動かすので4.5Vで動くやつなんですけどこれを電池の真ん中に入れ替えてもらうとあまりいいのでモバイルバッテリーの固まってるやつ買うのでそこからUSBで給電させるようにしたら同じ5Vなので同じじゃないなほぼ同じ5Vなのでそれでいけるんちゃうかなと思ってるんで結局ね電源がなんであっても大丈夫っちゃ大丈夫なんですかねガスがやのコンセント式のやつは100Vのところから5Vで変えないといけないので手元にそういうね変換用のものがないのでできないんですけど最終的に何が作りたいのかっていうと玄関に置くための明かりですねこのね雨の日とか玄関雨戸閉めてるんで朝会社に出ていくときに電気をつけないと真っ暗なんですけど電気つけて出ていくと妻が電気消してくるまで電気つきっぱなしなのでそれが嫌なんですよねそれとか夜帰ってきたときに妻が電気つけてくれてたら明るいでいいんですけどつけてくれてなかったときは真っ暗なのでスマホで照らして靴の依頼するわけなんですよねそれがちょっと手間なので自分が玄関に入ってきたときに暗かったら電気つけて照らしてくれるっていうそういうライトが欲しいですそれだけあったら別に分解せんでも電池式でカッターやスポンって置いといたらいいだけなんちゃうのっていうのがですねうちではできないことで見た目が良くないと雰囲気が家のテイストに合わないからそういうものは置かないでねっていうお出しが出ていますのでなんとか家の日本家屋に合うように工夫が必要になりますどんな形になるかというと灯籠がありますよねお寺とか神社とかでもかな山道の両方に灯籠がありますけどあれの小っちゃい灯籠が打ってて灯籠の中にバッテリーなり電池で動く電感センサー明暗センサー付きのライトを仕込んでおいてで外側が目立たなくするためにもともとのバーチップの側を取り除いてセンサーとLEDと電池とだけを向き出しにして目立たないように配線するっていうそれで多分OKでしょそんな感じのことがやりたいんですよねあの常夜灯ってやつですかね神社とかお寺とかで真っ暗な山道を歩いている中急に明かりがポッと浮かび上がってくるのってなかなか良くないですかそういうやつをね自分の中用に作ろうとしていますできるのかなということで今日はこの辺で終わりますありがとうございました
Bing AIチャットにタイトル決めと要約をまかせた、しかしこの子にはできなかった
Bing AIチャットには、次のように依頼しました。
そうか、Bing AI チャットではまだ2000文字程度の要約はできないのかな?
「bingでは最大何文字まで要約してくれるの?」と聞いてみました。
Bing AIはチャットモードなので、短い文章しか要約できません。😓
だそうです。
Bingでの要約は諦めて、さっき使ってた whisper でやれば Google Colab の続きでコードを書けそうです。
「whisperで要約するにはどんなコードを書けばいいの?」
# 必要なライブラリをインポート
import whisper
from pysummarization.nlpbase.auto_abstractor import AutoAbstractor
from pysummarization.tokenizabledoc.simple_tokenizer import SimpleTokenizer
from pysummarization.abstractabledoc.top_n_rank_abstractor import TopNRankAbstractor
# 音声ファイルを読み込み、whisperを使って文字起こしする
text = whisper.transcribe("audio.wav")
# 文字起こししたらテキストファイルとして保存する。
with open("transcript.txt", "w") as f:
f.write(text)
# 文字起こししたテキストを一つの文字列化したものも作る。
text = text.replace("\n", " ")
# AutoAbstractorオブジェクトを作る。
auto_abstractor = AutoAbstractor()
# SimpleTokenizerオブジェクトを作る。
tokenizer = SimpleTokenizer()
# TopNRankAbstractorオブジェクトを作る。
abstractable_doc = TopNRankAbstractor()
# 要約の割合を設定する。0.1だと10%に要約される。
result_dict = auto_abstractor.summarize(text, tokenizer, abstractable_doc, 0.1)
# 要約結果を表示する。
for sentence in result_dict["summarize_result"]:
print(sentence)
これをそのまま続きに入力するといろいろエラーが出ました。
まずは「pysummarization」のインストール等が必要で、その後またエラーが出て、それを教わろうとしたら残念ながらBingのアップデートによる質問数制限に引っかかり、これ以上質問できなくなりました。😥
!pip install pysummarization
Whisper 再登場 & Mecab で要約をまかせてみた、しかし要約を断念
pysummarization のドキュメント『Usecase: Summarize Japanese string argument.』の部分に、MeCabを使って日本語の自然言語処理による要約をする例が載っていました。『Usecase: Summarization, filtering the mutually similar, tautological, pleonastic, or redundant sentences』までやってみました。
そして先程 Bing が教えてくれたのは、その上の『Usecase: Summarize an English string argument.』の部分のようなものであったことが判明しました。
/usr/local/etcの中に新しく「mecabrc」フォルダを作成することと、「unidic-lite」のインストールも必要した。
結局、こんなコードになりましたが、要約結果は2行になりました。
# 追記1箇所目
!pip install pysummarization
!pip install mecab-python3
!pip install unidic-lite
from pysummarization.nlpbase.auto_abstractor import AutoAbstractor
from pysummarization.tokenizabledoc.mecab_tokenizer import MeCabTokenizer
from pysummarization.abstractabledoc.top_n_rank_abstractor import TopNRankAbstractor
# 追記2箇所目
document = result["text"]
# Object of automatic summarization.
auto_abstractor = AutoAbstractor()
# Set tokenizer for Japanese.
auto_abstractor.tokenizable_doc = MeCabTokenizer()
# Set delimiter for making a list of sentence.
auto_abstractor.delimiter_list = ["。", "\n"]
# Object of abstracting and filtering document.
abstractable_doc = TopNRankAbstractor()
# Summarize document.
result_dict = auto_abstractor.summarize(document, abstractable_doc)
# Output result.
for sentence in result_dict["summarize_result"]:
print(sentence)
from pysummarization.nlp_base import NlpBase
from pysummarization.nlpbase.auto_abstractor import AutoAbstractor
from pysummarization.tokenizabledoc.mecab_tokenizer import MeCabTokenizer
from pysummarization.abstractabledoc.top_n_rank_abstractor import TopNRankAbstractor
from pysummarization.similarityfilter.tfidf_cosine import TfIdfCosine
# The object of the NLP.
nlp_base = NlpBase()
# Set tokenizer. This is japanese tokenizer with MeCab.
nlp_base.tokenizable_doc = MeCabTokenizer()
# The object of `Similarity Filter`.
# The similarity observed by this object is so-called cosine similarity of Tf-Idf vectors.
similarity_filter = TfIdfCosine()
# Set the object of NLP.
similarity_filter.nlp_base = nlp_base
# If the similarity exceeds this value, the sentence will be cut off.
similarity_filter.similarity_limit = 0.25
# The object of automatic sumamrization.
auto_abstractor = AutoAbstractor()
# Set tokenizer. This is japanese tokenizer with MeCab.
auto_abstractor.tokenizable_doc = MeCabTokenizer()
# Object of abstracting and filtering document.
abstractable_doc = TopNRankAbstractor()
# Delegate the objects and execute summarization.
result_dict = auto_abstractor.summarize(document, abstractable_doc, similarity_filter)
print
for sentence in result_dict["summarize_result"]:
print(sentence)
2行になりました、、、??????
similarityの閾値を超えたらカットされるということは、冗長じゃなかったら要約されない、ということ?別の手法があればそっちでやったほうが良い気がする。
自然言語処理の理解が圧倒的に足りてないのと、今回はもっと雑にAIに依頼して要約してもらいたかったので、Bingに教わったもう1つのアプローチでChatGPTを使ってみます。結局元の記事の通りになってきました。
ChatGPT にタイトル決めと要約をまかせてみたたら、だいたい合ってた
まず、ChatGPT にどうやって要約してもらうのが良いのか質問しました。「chatGPTで日本語を要約する方法を教えてください」
そんな感じでやるらしいので、じゃあその方法でやってみて、と投げてみました。
これがタイトル決めと要約の結果です(原文ママ)
感想
Whisperが音源を3~6秒ずつくらいに区切って文字起こしを進めてくれているのですが、漢字カタカナ混じりでほぼ完璧でした。
自分は滑舌が悪く、しかも車通りのある道を歩きながら録音しているため音質も悪いため、人間が文字起こしするのはかなり辛い作業になるはずです。それをここまでキレイなテキストにしてくれるとは、、、
Bing はチャットモードじゃないモードに期待です。
ChatGPT は Bing AI より前の世代のGPTとのことですが、それでも十分な要約力です。玄関に灯籠型ランプを置きたいという目的部分はカットされちゃいましたが、それ以外の部分はなんとなく合ってる。句読点のない文章でここまでできるなら、Whisperが句読点を書いといてくれればより的を得た要約をしてくれるのではないでしょうか。
あと、要約が147文字だったのでこの後Twitterにラジオ投稿用で100字以内の指定をつけて5回ほど要約を依頼したのですが、127文字が最短だったので諦めました。
おまけ
2023/02/18 に録音して今回要約してもらった音源です。
これがこうなるんだぜ、、、
音源のアップロードから要約、この記事の書き上げまで約3時間半でした。