7
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

puppeteer で ChromeのSpeechRecognitionAPI を使用する

Last updated at Posted at 2020-04-20

はじめに

みなさんこちらの記事は読んでいただけたでしょうか?
.NET Frameworkで音声認識をしてzoomのビデオ画面に字幕を出す

サンプル

Zoomの自分の動画スペースに字幕を表示する方法なんですが、
先日とあるオンラインMeetUpイベントで使用してみたところ、
Webカメラに字幕を重ねて表示して配信することができました!!!実用的!

何言ってるかわからない問題

前回の記事にも載せましたが、.NET Frameworkの音声認識は
精度が良いとは言えたものではなく、とてもガバガバな認識結果を返してきます。

すると「え、それは何を表示してるの?」と、しゃべっている内容と表示文字列が
リンクしていると認識されない現象が発生します。致命的!

ほかの方法を試す

というわけで、違う方法を試してみることにします。今回、配信界隈を調査する中で
ゆかりねっと」という音声合成ソフトがあることを知りました。
調べるとどうも内部的に Google Chrome を使用しているそうです。

はて、GoogleChrome?と思って調べたところ SpeechRecognition API なるインタフェースが策定されていることを知りました。

SpeechRecognition - Web API | MDN

それは試さない手はない、ということで試してみました。

実現方法

字幕制御を nodejs で実装したので、同じく nodejs でいきます。

  • OS: Windows 10 64bit
  • ブラウザ: Google Chrome 81
  • node: v12.16.2

puppeteer の導入

今回はChromeを使用する予定なので puppeteer-core で。

npm install --save puppeteer-core

実装

調べれば2, 3秒でわかる内容なんですが、今回学びがあったので備忘録程度に。

ブラウザとの双方向通信

puppeteer を使用して、ブラウザとデータのやり取りをする場合

  • puppeteer → page : page.evaluate
  • page → puppeteer : page.exposeFunction

というのを使用すると良いです。

await page.exposeFunction("functionA", result => {
  console.log(result);
});

とあらかじめしておくことで、

await page.evaluate( () => {
  window.functionA("result from browser");
});

このように、ブラウザ側で functionA が呼び出せるようになります。

headless でSpeechRecognition APIが使用できない

puppeteer.launch のときに headless:true とすることで、
ヘッドレス Chromeが使用でき、無駄にWindowが表示されないなど便利なのですが、
今回は start イベントが発生せず、どうも使用不可っぽいので、画面サイズ0でお茶を濁しました。

「マイクを使用する」ダイアログを表示させない

image.png

これですね。これツールを起動するたびに出ても仕方ないのでスキップするオプション
--use-fake-ui-for-media-stream を使用します。

ソース

というわけでソースコード載せておきます。ほぼ MDN のまんま。

ただただ認識した文字列をコンソールに出力するだけです。

実行結果

前回記事でも試した

  • zoomに字幕を表示しています
  • 字幕のテストだよ
  • 字幕なんだけど、ちゃんと音声認識されてるんですかね

の3つを試しました。

image.png

良い感じですね。さすが!!

感想

結果は劇的に向上しました。が、1つ注意点として挙げられるのが
**「オフライン実行できない」**ということです。

Chromeの音声認識はサーバーに音声データを挙げて、サーバー側で結果を出力します。
なので、プライバシー問題もありますし、ネットワークの状況によっては使用不可だったり、レスポンスがめちゃくちゃ遅くなることも考えられます。

なので、今回は「クラウドサービスを使用したら音声認識精度が劇的に上がった」程度に捉えておくのがいいのかな、と思います。
サクッと効果が実感できるソリューションなのは間違いないですが。

終わりに

なぜか puppeteer で制御したけど意味あったのか・・・?

参考URL

7
3
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?