東京都府中市、九段下のWEB制作会社Maromaroのブログです

2024.09.09

Sasaki

コマンドラインでできる、音声データから自動文字起こし!

こんにちは!佐々木です。

音声データや動画データなどから文字データを起こすことがあると思います。
人力で文字を入力することもできますが、大変ですよね。
今回は自動で文字データを出力する方法をご紹介します。

※当方の環境はMac「Sonoma」です。

今回は、文字起こしに利用するAPIとして、OpenAIのWhisperを利用してみます。
※Open AIのアカウント作成などは割愛します。

 

まずは必要なソフトをインストール

pip install -U openai-whisper

brew install ffmpeg

音声データを準備する

以下のファイル形式に対応しています! 結構豊富ですね。

  • m4a
  • mp3
  • webm
  • mp4
  • mpga
  • wav
  • mpeg

コマンドを利用して音声データを出力してみる!

ひとまず、サンプル用にフリーの音声データとして
下記のサイト様から音声データを拝借させていただきました。
https://keikaku-hoso.com/%E8%A3%BD%E5%93%81%E7%B4%B9%E4%BB%8B/%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E9%9F%B3%E5%A3%B0/

whisper voice01_A.mp3 --language Japanese 
※voice01_A.mp3の部分は任意のファイル名に変更して大丈夫です。

すると下記のような文章が出力されると思います!

[00:00.000 --> 00:07.000] 本日はご来店くださいまして誠にありがとうございます。
[00:07.000 --> 00:13.000] ご来店中のお客様にご案内申し上げます。
[00:13.000 --> 00:24.000] 当店はまもなく閉店のお時間でございます。
[00:24.000 --> 00:30.000] またのお越しを心よりお待ち申し上げております。
[00:30.000 --> 00:35.000] 本日のご来店誠にありがとうございました。

元の文章は下記です。

本日はご来店下さいまして、 誠にありがとうございます。
ご来店中のお客様にご案内申し上げます。
当店は、まもなく閉店のお時間でございます。
当店は、まもなく閉店のお時間でございます。
またのお越しを心よりお待ち申し上げております。
本日のご来店、誠にありがとうございました。

ご来店くださいの「下さい」が違うぐらいですね!(これは勿論しょうがないですね・・・)
パーフェクトですね!

ただ、これは非常に解析しやすい音声なので想像通りといえば・・・。

 

娘に「猿かに合戦」を朗読させて試してみた

よりリアル?な変換を試したく、娘に協力を得て音声を提供してもらいました(小4)

文章は下記から「一」を読み上げてもらったところ・・・。
https://www.aozora.gr.jp/cards/000329/files/18334_11947.html

すると下記のような文章が・・・ちょっと微妙
滑舌は悪いものの、そう変換されたか!という印象に。

[00:00.000 --> 00:06.000] 昔々あるところにサルとカニがありました
[00:06.000 --> 00:10.500] ある日サルとカニはお天気がいいので連れ立って遊びに行ってました
[00:10.500 --> 00:14.000] その途中山道でサルは駆けの種を拾いました
[00:14.000 --> 00:18.000] またしばらく行くと川のすばでカニはおむすびを拾いました
[00:18.000 --> 00:22.500] カニはこんないいものを拾ったと言ってサルに見せます
[00:22.500 --> 00:27.000] サルも私だってこんないいものを拾ったと言って駆けの種を見せました
[00:27.000 --> 00:32.000] けれどサルは本当はおむすびが欲しくてならないものですが
[00:32.000 --> 00:37.500] カニに向かってどうだこの駆けの種と取りっかい一個しないかと言いました
[00:37.500 --> 00:41.000] でもおむすびの方が大きいじゃないかとカニは言いました
[00:41.000 --> 00:48.500] でも駆けの種は負けば芽が出て気になって美味しい芽が鳴るよとサルは言いました
[00:48.500 --> 00:55.000] 吸われるとカニの種が美味しくなってそれもそうだなと言いながら
[00:55.000 --> 00:59.500] とうとう大きなおむすびと小さな鍵の種を取り替えてしまいました
[00:59.500 --> 01:02.500] サルはうまくカニを騙しておむすびをもらうと
[01:02.500 --> 01:05.500] 見せびりゃ返しながらうまそうにみしょみしょ食べて
[01:05.500 --> 01:07.500] さようならカニさんごしそうさまでと言って
[01:07.500 --> 01:10.500] のそます自分のうちへ帰ってきました

試しにChatGPTに文章の誤りを訂正してくれとお願いしてみると文章としては読めるように。
(実際文字起こしの内容を案件で使うとなるとニュアンスの補正はまた必要)

[00:00.000 --> 00:06.000] 昔々あるところにサルとカニがありました
[00:06.000 --> 00:10.500] ある日サルとカニはお天気がいいので連れ立って遊びに行ってました
[00:10.500 --> 00:14.000] その途中山道でサルは駆けの種を拾いました
[00:14.000 --> 00:18.000] またしばらく行くと川のすばでカニはおむすびを拾いました
[00:18.000 --> 00:22.500] カニはこんないいものを拾ったと言ってサルに見せます
[00:22.500 --> 00:27.000] サルも私だってこんないいものを拾ったと言って駆けの種を見せました
[00:27.000 --> 00:32.000] けれどサルは本当はおむすびが欲しくてならないものですが
[00:32.000 --> 00:37.500] カニに向かってどうだこの駆けの種と取りっかい一個しないかと言いました
[00:37.500 --> 00:41.000] でもおむすびの方が大きいじゃないかとカニは言いました
[00:41.000 --> 00:48.500] でも駆けの種は負けば芽が出て気になって美味しい芽が鳴るよとサルは言いました
[00:48.500 --> 00:55.000] 吸われるとカニの種が美味しくなってそれもそうだなと言いながら
[00:55.000 --> 00:59.500] とうとう大きなおむすびと小さな鍵の種を取り替えてしまいました
[00:59.500 --> 01:02.500] サルはうまくカニを騙しておむすびをもらうと
[01:02.500 --> 01:05.500] 見せびりゃ返しながらうまそうにみしょみしょ食べて
[01:05.500 --> 01:07.500] さようならカニさんごしそうさまでと言って
[01:07.500 --> 01:10.500] のそます自分のうちへ帰ってきました

もういっちょ試しに、whisperコマンドのオプションでmodelをmediumにしてみると多少はいい感じに・・・(1.4GBの空き容量が必要!※その上のlargeもある・・・が)

▼コマンドは下記のように
–model mediumの部分を追加

whisper sarukani_sample01.m4a --language Japanese --model medium
[00:00.000 --> 00:06.000] 昔々あるところにサルとカニがありました。
[00:06.000 --> 00:10.000] ある日サルとカニはお天気がいいので連れだって遊びに行ってました。
[00:10.000 --> 00:14.000] その途中山道でサルは柿の種を拾いました。
[00:14.000 --> 00:18.000] またしばらく行くと川のすばでカニはおむすびを拾いました。
[00:18.000 --> 00:22.000] カニはこんな良いものを拾ったと言ってサルに見せます。
[00:22.000 --> 00:27.000] サルも私だってこんな良いものを拾ったと言って柿の種を見せました。
[00:27.000 --> 00:32.000] けれどサルは本当はおむすびが欲しくてならないものですから、
[00:32.000 --> 00:37.000] カニに向かってどうだこの柿の種と取り替えっこしないかと言いました。
[00:37.000 --> 00:41.000] でもおむすびの方が大きいじゃないかとカニは言いました。
[00:41.000 --> 00:48.000] でも柿の種は負けば芽が出て木になって美味しみがなるよとサルは言いました。
[00:48.000 --> 00:54.000] 吸われるとカニの種が美味しくなってそれもそうだなと言いながら
[00:54.000 --> 00:59.000] とうとう大きなおむすびと小さな柿の種を取り替えてしまいました。
[00:59.000 --> 01:03.000] サルはうまくカニを騙しておむすびをもらうと見せびらかしながら
[01:03.000 --> 01:07.000] うまそうにみしょみしょ食べて、さよならカニさんごしそうさまと言って
[01:07.000 --> 01:10.000] のそのそ自分の家へ帰ってきました。

さらに、オプションでプロンプトを与えられるので、追加してみた。
※ほとんどチートに近いですが、initial_promptの部分を追加しています。

whisper sarukani_sample01.m4a --language Japanese --model medium --initial_prompt 猿かに合戦の朗読

うーん「そう言われると」が「吸われると」になるのはどうにもならず。
もしかしたらプロンプトの命令次第で変わるかも?

[00:00.000 --> 00:06.000] 昔々あるところに猿と蟹がありました。
[00:06.000 --> 00:10.000] ある日猿と蟹はお天気がいいので連れだって遊びに行ってました。
[00:10.000 --> 00:14.000] その途中山道で猿は柿の種を拾いました。
[00:14.000 --> 00:18.000] またしばらく行くと川のそばで蟹はおむすびを拾いました。
[00:18.000 --> 00:22.000] 蟹はこんな良いものを拾ったと言って猿に見せます。
[00:22.000 --> 00:27.000] 猿も私だってこんな良いものを拾ったと言って柿の種を見せました。
[00:27.000 --> 00:32.000] けれど猿は本当はおむすびが欲しくてならないものですから、
[00:32.000 --> 00:37.000] 蟹に向かってどうだこの柿の種と取り返っこしないかと言いました。
[00:37.000 --> 00:41.000] でもおむすびの方が大きいじゃないかと蟹は言いました。
[00:41.000 --> 00:48.000] でも柿の種は負けば芽が出て木になって美味しみがなるよと猿は言いました。
[00:48.000 --> 00:54.000] 吸われると蟹も種が欲しくなってそれもそうだなと言いながら
[00:54.000 --> 00:59.000] とうとう大きなおむすびと小さな柿の種を取り替えてしまいました。
[00:59.000 --> 01:03.000] 猿はうまく蟹を騙しておむすびをもらうと見せびらかしながら
[01:03.000 --> 01:07.000] うまそうにみしょみしょ食べて、さよなら蟹さんごしそうさまと言って
[01:07.000 --> 01:10.000] のそのそ自分の家へ帰ってきました。

 

まだ単独の音声だったので、これが複数となるとさらに話者の分離など工夫をしないといけませんね。

文章入力の手間は省けるものの、元音声との照らし合わせは必須となりそうです。

※ちなみにサンプルで利用した音声データたこちら!