はじめに
Happy Podcast Day♪本日9/30は "International Podcast Day" とのことなので、Podcastにちなんだ記事を投稿しようと思います。(これも昨日Podcast「働き者ラジオ」を聴いていて知りました。笑)
さて、みなさんはPodcastを聴くことはありますか?私はめちゃくちゃなヘビーリスナーです。移動中などでながら聴きをすることが多く、ときどき「これは・・・!!」という興味深い話に遭遇します。
この記事も、Podcastで面白いエピソードを聴いたのがきっかけです。興味深いので内容を人と共有しようと思ったものの、音源そのままだと実際聞いてもらわないといけないので、詳しい内容を伝えづらいものです。では、それなら文字起こししてしまえばいいのではということで、今回の技術検証をしてみました。
思ったより難しいポイントが多く実用的とは言いづらいですが、自然言語処理は初めての経験で、非常に勉強になりました。
こんな方におすすめ
- Podcastの仕組みについて興味がある
- OpenAIの音声認識のライブラリWhisperに興味がある
- 文字起こしをしたものの句読点が入らず困っている(これはその2にて)
Podcastとは
改めてですが、私はPodcastのヘビーリスナーです。スタートアップから社会、デザイン、テクノロジーなど、幅広く雑多に聞いています。例えば下記のような番組です。
- START/FM
- 白金鉱業.FM
- 荻上チキ・Session~発信型ニュース・プロジェクト
- 文科系トークラジオ Life~社会時評&カルチャー
- Takram Cast
- The Potluck
- Automagic Podcast
- Zero Topic - ゼロトピック -
- fukabori.fm
and more...
Podcastはよく考えてみると不思議なもので、AppleやSpotify、Amazon Musicなどクロスプラットフォームで聞くことができます。そして、Podcastを聴いているとよく話をされていることなのですが、視聴状況のメトリクスは各プラットフォーム内でしか取得することができず、個々の視聴時間を取ることは難しいと聞きます(Appleはできるらしいですが)。この背景が、Podcastの配信の仕組みにあります。
Podcastの配信の仕組み
Podcastは、ホスティングしているサーバから、RSSでXMLデータが配信されることで管理されています。これだけ聞くとあまりピンとこない人も多いと思うので、具体例を取り上げてみましょう。
普通に検索をしてもホスティングしているRSSはなかなか見つからないのですが、ポッドキャストランキングというサイトで検索すると、そこからRSSのURLを取得することができます。サイト内部で検索が見当たらないので、https://www.google.com/search?q=site:https://podcastranking.jp keyword
でGoogle検索をしてみましょう。
例えば柴田陽さんと関口舞さんの「START/FM」で検索をしてみると、START/FMのポットキャストの画面にアクセスできます。そしてその画面の左下に「RSSで番組を購読する」というものがあり、ここから配信元のURL(https://anchor.fm/s/4ac8c9a0/podcast/rss )を取得することができます。
実際にこのURLにアクセスすると、以下のようなXMLデータが取得できます。この構造を見てみると、冒頭にチャンネルレベルのデータがあり、<item>
以下に個々のエピソードレベルのデータがあることがわかります。
<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:anchor="https://anchor.fm/xmlns">
<channel>
<title><![CDATA[START/FM]]></title>
<description><![CDATA[START/FMは、はじめるを応援するPodcastです。柴田陽(連続起業家・エンジェル投資家)と関口舞(起業家・TOKYOFMパーソナリティ)が一緒にお届けします。
すでに起業している方やこれから起業しようと考えている方、独立や副業に興味がある方に、一歩を踏み出すために役立つ話題を楽しく語っていきます。
番組への質問は<a href="https://forms.gle/4t7rK8KgMAZYPmam6" target="_blank">こちら</a>からお寄せください。番組ハッシュタグ <a href="https://twitter.com/hashtag/STARTFM" target="_blank">#STARTFM</a> で感想お待ちしています!]]></description>
<link>https://startfm.notion.site/Welcome-to-START-FM-e2485561facc42cf86f12f28962f57c8</link>
<image>
<url>https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded_nologo/12446728/12446728-1612870418638-aa8436bf80b02.jpg</url>
<title>START/FM</title>
<link>https://startfm.notion.site/Welcome-to-START-FM-e2485561facc42cf86f12f28962f57c8</link>
</image>
<generator>Anchor Podcasts</generator>
<lastBuildDate>Mon, 25 Sep 2023 05:48:16 GMT</lastBuildDate>
<atom:link href="https://anchor.fm/s/4ac8c9a0/podcast/rss" rel="self" type="application/rss+xml"/>
<author><![CDATA[柴田陽&関口舞]]></author>
<copyright><![CDATA[柴田陽&関口舞]]></copyright>
<language><![CDATA[ja]]></language>
<atom:link rel="hub" href="https://pubsubhubbub.appspot.com/"/>
<itunes:author>柴田陽&amp;関口舞</itunes:author>
<itunes:summary>START/FMは、はじめるを応援するPodcastです。柴田陽(連続起業家・エンジェル投資家)と関口舞(起業家・TOKYOFMパーソナリティ)が一緒にお届けします。
すでに起業している方やこれから起業しようと考えている方、独立や副業に興味がある方に、一歩を踏み出すために役立つ話題を楽しく語っていきます。
番組への質問は<a href="https://forms.gle/4t7rK8KgMAZYPmam6" target="_blank">こちら</a>からお寄せください。番組ハッシュタグ <a href="https://twitter.com/hashtag/STARTFM" target="_blank">#STARTFM</a> で感想お待ちしています!</itunes:summary>
<itunes:type>episodic</itunes:type>
<itunes:owner>
<itunes:name>柴田陽&amp;関口舞</itunes:name>
<itunes:email>startfm@googlegroups.com</itunes:email>
</itunes:owner>
<itunes:explicit>No</itunes:explicit>
<itunes:category text="Business">
<itunes:category text="Entrepreneurship"/>
</itunes:category>
<itunes:image href="https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded_nologo/12446728/12446728-1612870418638-aa8436bf80b02.jpg"/>
<item>
<title><![CDATA[グローバルなユニコーン企業を創りたい、そのための次のキャリア?!]]></title>
<description><![CDATA[<p>リスナー質問回です。グローバルなユニコーンを創りたいと考えている、現在スタートアップのCTOをしている方からの相談。</p>
<p><br></p>
<p>START/FMは、"はじめる"を応援するPodcastです!連続起業家でエンジェル投資家の柴田陽と、起業家でラジオパーソナリティの関口舞が一緒にお届けします。</p>
<p>番組への質問は<a href="https://forms.gle/8XwknEqfVpJno47v9">こちら</a>からお寄せください。番組ハッシュタグ <a href="https://twitter.com/hashtag/STARTFM">#STARTFM</a> で感想お待ちしています!匿名で質問できます!</p>
<p><br></p>
<p># Links</p>
<p>## Twitter:</p>
<p>Co-host: Yo Shibata <a href="https://twitter.com/yoyoshibata">@yoyoshibata</a></p>
<p>Co-host: Mai Sekiguchi <a href="https://twitter.com/mai_D_mai">@mai_D_mai</a></p>
<p><br></p>
<p>## Ask Me Anything & Feedbacks</p>
<p><a href="https://forms.gle/8XwknEqfVpJno47v9">リスナー質問フォーム</a></p>
<p><br></p>
]]></description>
<link>https://podcasters.spotify.com/pod/show/startfm/episodes/ep-e29o4p0</link>
<guid isPermaLink="false">010ac349-d3a7-42c8-82df-a2bdf35968b6</guid>
<dc:creator><![CDATA[柴田陽&関口舞]]></dc:creator>
<pubDate>Mon, 25 Sep 2023 05:45:59 GMT</pubDate>
<enclosure url="https://anchor.fm/s/4ac8c9a0/podcast/play/76337376/https%3A%2F%2Fd3ctxlq1ktw2nl.cloudfront.net%2Fstaging%2F2023-8-25%2F16e60fab-5f40-d7b5-1b5e-69df5021d640.mp3" length="39827372" type="audio/mpeg"/>
<itunes:summary><p>リスナー質問回です。グローバルなユニコーンを創りたいと考えている、現在スタートアップのCTOをしている方からの相談。</p>
<p><br></p>
<p>START/FMは、&quot;はじめる&quot;を応援するPodcastです!連続起業家でエンジェル投資家の柴田陽と、起業家でラジオパーソナリティの関口舞が一緒にお届けします。</p>
<p>番組への質問は<a href="https://forms.gle/8XwknEqfVpJno47v9">こちら</a>からお寄せください。番組ハッシュタグ <a href="https://twitter.com/hashtag/STARTFM">#STARTFM</a> で感想お待ちしています!匿名で質問できます!</p>
<p><br></p>
<p># Links</p>
<p>## Twitter:</p>
<p>Co-host: Yo Shibata <a href="https://twitter.com/yoyoshibata">@yoyoshibata</a></p>
<p>Co-host: Mai Sekiguchi <a href="https://twitter.com/mai_D_mai">@mai_D_mai</a></p>
<p><br></p>
<p>## Ask Me Anything &amp; Feedbacks</p>
<p><a href="https://forms.gle/8XwknEqfVpJno47v9">リスナー質問フォーム</a></p>
<p><br></p>
</itunes:summary>
<itunes:explicit>No</itunes:explicit>
<itunes:duration>00:27:39</itunes:duration>
<itunes:image href="https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded_nologo/12446728/12446728-1612870418638-aa8436bf80b02.jpg"/>
<itunes:season>3</itunes:season>
<itunes:episode>51</itunes:episode>
<itunes:episodeType>full</itunes:episodeType>
</item>
<item>
<title><![CDATA[フィードバック・モデル: フィードバックの与え方もらい方]]></title>
<description><![CDATA[<p>フィードバックって与える方も受け取る方も難しいですよね!フィードバック少しメタに考えてみると、わかりやすくなるかも。フィードバックモデルについて解説します。</p>
<p><br></p>
<p>START/FMは、"はじめる"を応援するPodcastです!連続起業家でエンジェル投資家の柴田陽と、起業家でラジオパーソナリティの関口舞が一緒にお届けします。</p>
<p>番組への質問は<a href="https://forms.gle/8XwknEqfVpJno47v9">こちら</a>からお寄せください。番組ハッシュタグ <a href="https://twitter.com/hashtag/STARTFM">#STARTFM</a> で感想お待ちしています!匿名で質問できます!</p>
<p><br></p>
<p># Links</p>
<p>## Twitter:</p>
<p>Co-host: Yo Shibata <a href="https://twitter.com/yoyoshibata">@yoyoshibata</a></p>
<p>Co-host: Mai Sekiguchi <a href="https://twitter.com/mai_D_mai">@mai_D_mai</a></p>
<p><br></p>
<p>## Ask Me Anything & Feedbacks</p>
<p><a href="https://forms.gle/8XwknEqfVpJno47v9">リスナー質問フォーム</a></p>
<p><br></p>
]]></description>
<link>https://podcasters.spotify.com/pod/show/startfm/episodes/ep-e29fggs</link>
<guid isPermaLink="false">0733ac61-d9d1-48be-b7ee-7d8f0651d7dd</guid>
<dc:creator><![CDATA[柴田陽&関口舞]]></dc:creator>
<pubDate>Mon, 18 Sep 2023 16:33:27 GMT</pubDate>
<enclosure url="https://anchor.fm/s/4ac8c9a0/podcast/play/76054492/https%3A%2F%2Fd3ctxlq1ktw2nl.cloudfront.net%2Fstaging%2F2023-8-18%2Fc3abf960-c41f-6fc0-70b4-87fffd6390df.mp3" length="51673796" type="audio/mpeg"/>
<itunes:summary><p>フィードバックって与える方も受け取る方も難しいですよね!フィードバック少しメタに考えてみると、わかりやすくなるかも。フィードバックモデルについて解説します。</p>
<p><br></p>
<p>START/FMは、&quot;はじめる&quot;を応援するPodcastです!連続起業家でエンジェル投資家の柴田陽と、起業家でラジオパーソナリティの関口舞が一緒にお届けします。</p>
<p>番組への質問は<a href="https://forms.gle/8XwknEqfVpJno47v9">こちら</a>からお寄せください。番組ハッシュタグ <a href="https://twitter.com/hashtag/STARTFM">#STARTFM</a> で感想お待ちしています!匿名で質問できます!</p>
<p><br></p>
<p># Links</p>
<p>## Twitter:</p>
<p>Co-host: Yo Shibata <a href="https://twitter.com/yoyoshibata">@yoyoshibata</a></p>
<p>Co-host: Mai Sekiguchi <a href="https://twitter.com/mai_D_mai">@mai_D_mai</a></p>
<p><br></p>
<p>## Ask Me Anything &amp; Feedbacks</p>
<p><a href="https://forms.gle/8XwknEqfVpJno47v9">リスナー質問フォーム</a></p>
<p><br></p>
</itunes:summary>
<itunes:explicit>No</itunes:explicit>
<itunes:duration>00:35:53</itunes:duration>
<itunes:image href="https://d3t3ozftmdmh3i.cloudfront.net/production/podcast_uploaded_nologo/12446728/12446728-1612870418638-aa8436bf80b02.jpg"/>
<itunes:season>3</itunes:season>
<itunes:episode>50</itunes:episode>
<itunes:episodeType>full</itunes:episodeType>
</item>
(以下略)
余談ですが、白金鉱業.FMはホスティング元がGitHubとなっており(https://shirokane-kougyou.github.io/feed.xml )、このせいで私の利用しているアプリ(CastBox)でエピソードの長さが表示されないようです。・・・とはいえ、GitHubでやっているのが納得感があるというか何というか(笑)
さて脱線しましたが、RSSのURLを取得することができれば、XMLデータをパースすることで各エピソードのタイトルや音源のURLを取得することができます。ということでPythonでこれを処理します。
import requests
from xml.etree import ElementTree
import datetime
import re
import pandas as pd
url = 'https://anchor.fm/s/4ac8c9a0/podcast/rss'
content = requests.get(url).content
podcast_title = ElementTree.fromstring(content).find('channel').find('title').text
podcast_author = ElementTree.fromstring(content).find('channel').find('author').text
items = ElementTree.fromstring(content).find('channel').findall('item')
data = pd.DataFrame()
for item in items:
each_data = pd.DataFrame({
'pub_date': [datetime.datetime.strptime(item.find('pubDate').text, '%a, %d %b %Y %H:%M:%S %Z')],
'pub_date_str': [datetime.datetime.strptime(item.find('pubDate').text, '%a, %d %b %Y %H:%M:%S %Z').strftime('%Y%m%d_%H%M%S')],
'title': [item.find('title').text],
'audio_url': [item.find('enclosure').attrib['url']],
'description': [re.sub('<.*?>', '', item.find('description').text)]
})
data = pd.concat([data, each_data]).reset_index(drop=True)
data
すると、下記のようなエピソード情報が取得できます。あとは文字起こししたいエピソードを選択して、audio_url
をWhisperに読み込ませるだけです。
Whisperとは
今となってはOpenAIはChatGPTが代表的なものになっていますが、ChatGPTの公開前に技術者界隈で話題になっていたのがWhisperという音声認識のためのライブラリです。
私が知ったきっかけとしては2022/10/8の白金鉱業.FM「60. Podcast革命のラストピース、高精度音声認識モデル"Whisper"」で、
英語の書き起こし以外にも、多言語の書き起こしや言語特定など複数のタスクをシンプルなsequence-to-sequenceの枠組みに落とし込んでおり、スケーラブルなモデルを獲得できる点が貢献と言えそう
といったことが紹介されています。
時期的にはStable Diffusionのあとの時期に出てきたものですが、これは革命が起こるのではと衝撃を受けたのを覚えています。というのも、画像生成はその後のユースケースにつなげるのがなかなか難しいですが、テキスト→音声は既にある程度できるのに加えて、音声→テキストの変換が精度高くできるようになると、テキストで培われていた技術が音声からシームレスに活用できるようになる未来がイメージできたからです。
実際に視聴後に自分で試してみて、その精度に驚きました。しかもそれをファインチューニング不要でできるという。当時行ったエピソードの文字起こしが下記の通りです。
では今回のお題は、最近話題のStable Diffusionに並んでというか続きてというかで、話題のWhisperさんのお話の技術解析を同じく、広川先生からお願いしたいと思います。はい、よろしくお願いします。そうですね、ちょうどStable Diffusionが流行ったその週とか次の週とかに、またOpenAIから、今度は音声ですね。音声処理で、すごい精度で、反響性もかなり高いっていう、WhisperっていうモデルがOpenAIから公開されたので、こちらも論文読んで、少しどんなアルゴリズムでどんな特徴があるのかを、今回是非お話しできればと思います。よろしくお願いします。お願いします。では早速概要なんですけれども、(以下略)
精度がめちゃくちゃ高いし、句読点も入っているしなにこれ!?!?という。こいつを今回のエピソードにも活用してみましょう。
WhisperでPodcastの音声をそのまま文字起こしする
以前はPython初心者だったのもあり、mp3ファイルをローカルにダウンロードして読み込ませていましたが、今回は取得したデータをそのまま読み込ませてみます。なお、Whisperを未インストールの場合は、ライブラリ自体はpip install openai-whisper
でインストールできますが、公式GitHubに記載されている通りffmpegを別途インストールし、PATHを通すのを忘れないでください。私は最初にやろうとしたときに、これを忘れてドはまりしました。
import whisper
import os
file_path = '/data/output/'
os.makedirs(file_path, exist_ok=True)
target_index_list = [4] # 対象にするエピソードを選択する
target_episodes = data.iloc[target_index_list, :].reset_index(drop=True)
target_episodes
model_type = 'large'
target_episodes['transcript_' + model_type] = ''
model = whisper.load_model(model_type)
for i, audio_url in enumerate(target_episodes['audio_url']):
result = model.transcribe(audio_url)
target_episodes.loc[i, 'transcript_' + model_type] = result['text']
filename = file_path + target_episodes['pub_date_str'][i] + '_' + target_episodes['title'][i] + '_' + model_type + '.txt'
with open (filename, 'w', encoding='utf-8') as f:
f.write(
'- podcast title: ' + podcast_title + '\n'
+ '- podcast author: ' + podcast_author + '\n'
+ '- audio url: ' + audio_url + '\n'
+ '- episode title: ' + target_episodes['title'][i] + '\n'
+ '- description: ' + target_episodes['description'][i] + '\n'
+ '- transcript: ' + target_episodes['transcript_' + model_type][i]
)
print(target_episodes['transcript_' + model_type][i])
target_episodes
これで内容がテキストファイルに書き出しされます。文字起こしされた結果が下記になります。
始めるを応援するポッドキャスト スタートFMおはようございます起業家でラジオパーソナリティー の関口舞ですテーラー株式会社の柴田陽さんと起業や独立を考えている 方に役に立つ情報を楽しく語っていきます 陽さんおはようございます陽さん おはようございますなんかいつもよりニコニコしてません どうしましたえ 表情が声に乗っかるって言う じゃないですか確かにそれは本当にそうですよね だからコールセンターとかですね自分の前に鏡置いて口角がちゃんと 上がっているようにしましょうみたいになるんでちょっと無理に 作り笑いをしている珍しい 伝わりましたでしょうか伝わってね皆さんこのニコニコ した明るい陽さんの声が伝わりましたでしょうかなんか最近アメリカの会社とちょっと 仕事をしていましてどういう意味ですか法人がアメリカにあって生成AI のスタートアップみたいなところちょっとやっているんですけど リモートで世界中の人が社員として参画している的な企業と今やり取り していて(以下略)
・・・句読点がつかない???
理由はよくわからないのですが、句読点なしで文字起こしがされたので、はて困ったと思い別途BERTを使って句読点を付けたというのがここからの話です。とはいえ長くなりすぎたので別記事にします・・・
さいごに
調子に乗って書きすぎたので、別途続きの記事を書くことにします。句読点なしの文章が出て困ったなーという感じですが、これでもそこそこ精度は良いので、人間が一から文字起こしをする労力を考えるとこれでもすごいですね。