ポッドキャストを文字検索するには

音の海から文字の海へ

こちらポッドキャスト配信について語る&あらB Advent Calendar 2020 8日目の記事です(2つのアドベントカレンダー兼用です)。

今年2020年7月よりあらB.fm というポッドキャストを始めました。

コンセプトは「コロナ禍でなかなか対面で会えないゲストの方々とオンラインでくだを巻くポッドキャスト」です。

呑み屋でくだを巻くイメージですので、ポッドキャストの時間としても毎回気づいたら2時間を超えていることが多く、一般的には尺の長いポッドキャストに分類されると思います。

開始した経緯やツール、ポッドキャストの音作りのコツについては過去のブログにまとめてありますので説明はそちらにお任せします。

今回のテーマとしては「ポッドキャストを文字検索するには」という題材で少し手を動かしてみた内容を紹介させていただこうと思います。

ポッドキャストの利点でもあり欠点でもあるポイントだと思いますが、ポッドキャストは外から中身が見えにくいメディアだと考えています。

ブログや WEBニュースなどはテキスト検索できますので、自分の興味のある話題をキーワード検索などで引っかけて、見つけることがしやすいです。

しかし、ポッドキャストは音声ですので、現状一部の人気ポッドキャストを除いてほとんどのポッドキャストは中身を文字検索することは難しいのではないかと思います。

例えば、Rebuild というITエンジニア界隈で有名なポッドキャストでは当たり前のように全文検索できるサービスが提供されています。一応エピソードの検索数に5エピソードまでという制限が設けてあるものの、有料会員になると100エピソードまで検索できるもののようです。

ポッドキャスト配信者として色々な話題を話しますので、がんばって詳細にショーノートを書き込んでみるような努力をしても、例えば下記のショーノートの「日本沈没」というキーワードで Google 検索しても、そもそもポッドキャスト以外の情報に埋もれて下記のショーノートがヒットすることはまずありません。

あらB.fm Ep.9 ショーノート

将来的にはいくつもあるポッドキャスト配信プラットフォームのどこかでポッドキャストの音声データを気軽に文字検索できるようになると楽観的に期待しています。

しかし、もし今すぐ何かじぶんのポッドキャストについて何かやってみたいという話であれば、ポッドキャストを文字検索できるようにするためには大まかに次のような3つのポイントをクリアしていく必要があると考えられます。

  1. 音声の文字起こしと各ワードと再生時刻が紐づいたデータを用意すること
  2. 1.のデータを文字検索して、その検索キーワードが出てくる再生時刻の情報を引っ張ってくること
  3. 2. の再生時刻の情報をユーザーが聴きたいポッドキャスト配信プラットフォーム上でその途中の時刻から再生できるようにすること

上記3つをどのような端末やインターフェース上で実現するかという点まで考えるともっと細かい部分で解決すべき課題は出てくると思いますが、とりあえず最低限に絞って考えると上記3点、もっと乱暴なことをいうと1点目さえできていればそれなりにポッドキャストの文字検索はできそうな確度がグッと高まると思います。

で、実際やってみた結果が下記です(作業時間1時間くらいでした)。

検索対象の音声データはあらB.fm Ep.9 の 最初の20分間のみ切り出した音声データに対して、Google Cloud Speech-to-Text API を用いて文字起こしと再生時刻の記録し結果テキストデータを書き出し、それをメモ帳で開いて検索キーワード「日本沈没」で検索した結果が下記となります。

上記よりおよそ あらB.fm Ep.9 の 6:29 あたりに「日本沈没」というキーワードが出てくるという結果となっています。

実際 あらB.fm Ep.9 を聞いてみると、6:40 あたりに「日本沈没」の話が出ているのでピッタリ10秒ぐらいズレてはいます。しかし、全体で一律10秒ズレた結果となっているため、ポッドキャストの文字検索としては十分活用できる結果になっていると考えられます。

具体的にはじぶんが2年以上前に Qiita にブログとして書いた下記内容が参考になりました(ちゃんと2年前にアウトプットしといて良かった笑)

修正点としては、入力音声データを あらB.fm Ep.9 に変えた点と上記 Qiitaブログのスクリプトを次のように修正したくらいでした(上:修正前、下:後)

それ以外は上記ブログの内容通りでした。この手の作業に慣れていない配信者でも手順通りやればおそらくできると思います

config = types.RecognitionConfig(
sample_rate_hertz=16000,
encoding=enums.RecognitionConfig.AudioEncoding.FLAC,
language_code='en-US')
#中略for result in operationResult.results:
for alternative in result.alternatives:
fout.write(u'{}\n'.format(alternative.transcript))

config = types.RecognitionConfig(
sample_rate_hertz=16000,
encoding=enums.RecognitionConfig.AudioEncoding.FLAC,
language_code='ja-JP',
enable_word_time_offsets=True,)
#中略for result in operationResult.results:
alternative = result.alternatives[0]
for word_info in alternative.words:
word = word_info.word
start_time = word_info.start_time
end_time = word_info.end_time
fout.write(u'Word: {}, '.format(word))
fout.write(u'start_time: {}, '.format(start_time))
fout.write(u'end_time: {}\n'.format(end_time))

ここで紹介したかったのは「ポッドキャストの文字検索は思ったより簡単にできそうですよ!配信者のみなさま、あわよくばトライしてみてはいかがでしょうか?」という点です。

ポッドキャストの中身を文字やキーワードで検索できるようになれば、今よりもお手軽に好きな題材のポッドキャストを探すことができるようになるのではないかと期待しています。

以前私がゲストとして出演させていただいた Interaxion Ep.7 のタイトルにもなっている “Improving the quality of podcast life(我々のポッドキャスト生活が豊かになっていくこと)” を願って今回このような内容を紹介させていただきました。

“Improving the quality of podcast life(我々のポッドキャスト生活が豊かになっていくこと)” を願って

わくわくすることを じゆうに すきほうだいに

わくわくすることを じゆうに すきほうだいに