Japan Accessibility Conference digital information vol.2 へ行ったことをきっかけにUDトークの存在を認識して、そういえば、AMP Conf 2019 - amp.dev でも UDトークみたいなのを使っていた気がします。
UD トークからブラウザ上での音声認識
について調べ、TalAter/annyang: Speech recognition for your site というJavaScript ライブラリの存在を知って、試しにサンプル HTML を実装してみましたので、実施したことを記載します。
1. 目次
目次を記載します。
-
- 音声認識APIで実現できていること、Webサービスについて
- 3.1. Webサイトでの音声認識のアーキテクチャについて
- 3.1.1. Browser 拡張としての音声認識
- 3.1.2. スマートスピーカーによるブラウザ操作
- 3.1.3. PC、Mac の音声識別機能を使う
- 3.1.4. Web Speech API を使う
- 3.2. Webサービス
- 3.2.1. 音声認識API
- 3.2.2. ツール、アプリケーション
-
- Voiceコマンドのサンプル、作成した文字起こしツール
- 4.1. Voiceコマンドのサンプル
- 4.2. 文字起こしツール
- 4.3. サンプルを作ったり、調べたりして思ったこと
2. この記事で主に記載すること
Browser JavaScript 以外での 音声認識もありますが、調べ始めは、Browser JavaScript のスコープでの音声認識でした。
調べている途中で、Browser から離れること
を考え初めて、OS、デバイスもさらっと見てみたら底は広く深い気がしました。
汎用性を考えると、Webサイト上でのみ使える音声認識よりもOS機能や、スマートスピーカーのようなデバイスで、音声認識機能を実装していないサイト上でも使用できるのがメインストリームなのかなと思いますが、現状、あるタスクをこなすWebサイトがあるとすると、そのタスクをこなすVoice command を作るのは以下、2つの選択肢のどちらかな気がしました。
- Voice command ではなく、API first な実装に力を入れる。OS機能や、デバイスから Voice command をトリガーにAPIを使ってタスクを実行する。
- OS、デバイスの機能のサポートを受けつつもサイト上での込み入った動作は、Browser JavaScript を駆使した Voice command を実装する。
この記事では、1.
については調べる過程で見つけた文書へのリンクを薄く記載しています。
また、Voice command が実現できるということは、音声認識はできているので、文字起こしについてのサンプルも作成してみたので、その説明を記載しています。
3. 音声認識APIで実現できていること、Webサービスについて
薄く調べてことについて記載します。
3.1. Webサイトでの音声認識のアーキテクチャについて
音声認識自体の技術、実装方法ではなく、以下にその技術が実装されているデバイス、PC上のアプリケーションを使って、Webサイトでの音声認識を実現するかという観点で考えると、以下のようなアーキテクチャがあると思う、もしくは既に実現されていると思いました。
3.1.1. Browser 拡張としての音声認識
Hands Free for Chrome
という Chrome plugin です。
小窓が立ち上がるのが、気持ち悪いですが英語による操作で、表示しているWebページのコントロールができます。
* ブラウザを音声操作しよう!(Chrome拡張「Hands Free for Chrome」を使った方法)
* Hands Free for Chrome - Chrome ウェブストア
3.1.2. スマートスピーカーによるブラウザ操作
Google Home や、 Amazon Alexa で、ブラウザ操作というか、ブラウザ操作をした結果のタスクをこなせるのかもしれません。
調べ他ところ以下のような記事が見つかりました。
* アレクサ居酒屋
* 話題沸騰のスマートスピーカーは店舗運営にも使えるのか? | POSレジの比較・購入なら「レジチョイス」 レジ選びで迷っている人に
* Alexaを利用して音声注文ができる居酒屋が登場。まずは実証実験からで体験したい人は予約が必要 - Engadget 日本版
-
ChromecastとGoogleHomeで声だけで操作できるブラウザを作る - Qiita
PCを介さないで、GoolgeHome、IFTTT、ChromecastでTVにWebサイトを表示する仕組みです。 -
GoogleHome mini から IFTTT 経由でTwitterにtweetしてみた|【技業LOG】技術者が紹介するNTTPCのテクノロジー|【公式】NTTPC
スマートスピーカーでTwitterに投稿するというタスクをこなします。 -
Alexaと連携して荷物の確認や受け取り日時を変更できる
ヤマト運輸の、Alexa のスキルです。こういうちょっとしたタスクをこなすのに現状ハマりそうに思います。 -
freeeの新しく公開されたAPIを使って、非エンジニアが音声で勤怠打刻をしてみました! - freee Developers Blog
Google Home と IFTTT で、freeeに勤怠打刻をする例です。 -
Google、Amazon 以外のスマートスピーカーでの事例
- 音声・対話AIサービス「COET」(コエット) | サービス/ソリューション | ITソリューションのTIS株式会社
- TIS、音声から「簡単」「リアルタイム」「安全」に会議を記録する「Record Meeting」正式版を提供開始 | ニュースリリース | 2019年度 | ニュース | TIS 株式会社
TISが議事録記録ができるスマートスピーカーをリリースしました。価格が高いです。
記事を見ていると、ブラウザ操作というか、Web API を駆使してブラウザ操作した結果のタスクを、音声で実施できるようにした気がします。
3.1.3. PC、Mac の音声識別機能を使う
-
Windows 音声認識コマンド - Windows ヘルプ
任意のアイテムまたはアイコンを選択する
というコマンドがあり、スクリプト等をこれで実行すると、タスクをこなすことができそうです。 -
Mac でテキストを音声入力する - Apple サポート
Mac のテキスト音声入力についてドキュメントです。 -
音声入力コマンドで Mac に操作内容を伝える - Apple サポート
アプリケーションを開く等のテキスト入力以外のオペレーションについて記載されています。
独自のコマンドを作成することができ、そこからからAutomator ワークフローが実行できます。
Automator から ブラウザ起動ができ、操作が可能です。
3.1.4. Web Speech API を使う
ブラウザ上で音声認識するには、Web Speech API - Web API | MDN が使用できます。
SpeechRecognition (Asynchronous Speech Recognition; 非同期音声認識) が実装されているのは、PC の Chorome と、 Androidの Chrome のみで、
SpeechSynthesis (Text-to-Speech; 音声合成) が実装されているのは、IE以外のブラウザです。
音声認識については、Chrome のみが使える状況ですが、昔から使えるからかJavaScript のラッパーライブラリがそこそこありました。
以下、見つけたものを記載します。
-
ライブラリへのリンク
-
grvcoelho/react-voice-components: Set of React components that use the Web Speech API to bring voice experience to React applications
React の Web Speech API の Wrapper です。 -
TalAter/annyang: Speech recognition for your site
Voice command の登録、実行、文字起こしができるライブラリです。 -
Voix JS Component
Voice command の登録、実行ができるライブラリです。
文字起こしのためのcallbackがないため、文字起こしには使えません。 -
jimmybyrum/voice-commands.js: Simple wrapper for Javascript Speech-to-text to add voice commands.
annyang とほぼ同様のことができます。 -
zzmp/juliusjs: A speech recognition library for the web
このライブラリは、Web Speech API は使ってなさそうです。自前で英語の言語を解析するための辞書のようなファイルが置いてありました。
JavaScript の Worker で動作するので速いのかもしれません。 -
Pocketsphinx.js - Speech Recognition in JavaScript and WebAssembly
Chrome の Web Speech API だと バックエンドは、Google Speech to Text API と言われてますが、これはバックエンドを自前で用意しているライブラリです。juliusjs
も同じような仕組みかと思います。
-
3.2. Webサービス
音声認識をするWebサービスは、音声の認識APIを提供する側 (要素技術)と、音声認識した結果、ユーザーのタスクを解決するWebサービスを作っている側 (応用技術) に分かれると思いました。それぞれ記載します。
3.2.1. 音声認識API
音声認識APIの紹介記事がたくさんありましたので、それらのリンクを記載します。
* アプリケーションの音声操作を可能にする音声認識APIまとめ | NTT Communications Developer Portal
音声認識APIのまとめ記事でそれぞれリンクが記載されています。
-
【最新情報】COTOHA APIの最最最新APIを叩いてみる【ここだけ】 - Qiita
音声認識した結果を判断するのに使えそうかなと思いました。 -
Web Speech APIとは?
Rakuten RapidAPI を含めた音声認識APIの紹介記事です。
3.2.2. ツール、アプリケーション
-
音声認識結果データの校正いたします | 【東京反訳】
人が音声認識APIの誤字脱字を補正してくれるサービスというか人力の作業です。 -
自動文字起こしサービス「Smart書記」 | サービス | Jストリーム
音声認識に使用しているAPIは不明ですが、議事録文字起こしを実施してくれるサービスです。 -
テープおこしに時短革命!業務効率の大幅アップが見込める音声データ自動テキスト変換ツールまとめ|ferret
音声認識してテキストに変換できるツール類のリンク集です。 -
writer.app【文字起こしアプリ】
文字起こしをしてくれるWebサービス。Google Speech-to-Text を使っている旨が記載されています。
4. Voiceコマンドのサンプル、作成した文字起こしツール
4.1. Voiceコマンドのサンプル
文字起こしツールの作成で力尽きてしまったので、annyang のVoiceコマンドのサンプルページへのリンクを記載します。
ページ上で、登録された言葉をブラウザに向かって話すと、対応するJavaScript関数が実行されます。
annyang! Easily add speech recognition to your site
4.2. 文字起こしツール
annyang を使って、文字起こしを作成するツールを作ってみました。
少ししようしてみところ、Web Speech API の精度的に以下の条件の元であれば現状良い感じに使えるかと思います。
* 文字起こしツールの使用条件
* 1人の人間が話す状態。
* はっきりした言葉で少しゆっくり話す。
個人的に読書のログを残しているのですが、読みながら Markdown テキストに起こすのが割と面倒だったので、読書中にツールを起動して話かけてメモを取ろうかと思います。
-
PCのみ対応
ツールのCSS調整すれば、モバイルでもうまく表示できそうですが、一旦PCのみでいいかなと表示の調整はしておりません。
Chrome の開発者ツールでモバイル表示させてみたところ崩れていたので、実機でもうまく表示されないかなと思います。 -
Webアプリ
Google Apps Script の Webアプリケーションとしてデプロイしました。
EXPORT GOOGLE DOCUMENT で文字を起こした結果を、Google Document にエクスポートできます。
Gooogle Document へのエクスポートには、Google アカウントでのログインが必要です。
speech to text -
Github repository
作成したプログラムは、以下のrepository に あります。
kemsakurai/gas-speechToText -
作成したプログラムの説明
以下、作成したプログラムについて説明を記載します。-
annyang デバッグログ出力について
annyang.debug()
デバッグログの出力が可能です。各コールバック、状態変更時にログを出力してくれるようになります。
annyang.debug(true);
-
annyang 言語の変更
以下で言語の変更が可能です。デフォルトは、en-US
です。
annyang.setLanguage('ja-JP');
-
annyang Callback
annyang.addCallback
で、イベント発生時の Callback 関数を登録できます。
annyang/README.md at master · TalAter/annyang に Callback イベントの一覧が記載されています。
文字起こしには、result
イベントを使用します。ここで、登録した Callback 関数に認識した文字列が設定されるので、その文字列をハンドリングします。
annyang.addCallback('result', function(phrases) { if (isPhrasesReading(phrases)) { noteContent += "、"; } else if (isPhrasesPunctuation(phrases)) { noteContent += "。"; } else if (isLineBreak(phrases)) { noteContent += "\r\n"; } else { noteContent += phrases[0]; } noteTextarea.val(noteContent); noteTextarea.focus(); noteTextarea.setSelectionRange(noteTextarea.value.length, noteTextarea.value.length); }); annyang.addCallback('start', function() { // Do Nothing... }); annyang.addCallback('end', function() { // Do Nothing... }); annyang.addCallback('error', function(event) { if(event.error == 'no-speech') { // Do Nothing... }; });
-
SpeechKITT について
annyang
を作っている方が、TalAter/SpeechKITT: 🗣 A flexible GUI for Speech Recognition というライブラリも作っています。このライブラリは、Web Speech API と、annyang
を操作するUIを提供するライブラリです。
作ったサンプルの左下に表示されるのが、このUIで、以下の実装で UIが使用できるようになります。
テーマはいくつかあり、以下がcdn配信されているテーマの一覧になります。// Tell KITT to use annyang SpeechKITT.annyang(); // SpeechKITT.setToggleLabelText('録音する'); flat-concrete.css を使用する場合は、使われない。 SpeechKITT.setInstructionsText('録音中しています...'); // 録音時に表示するテキストを設定する。 // Define a stylesheet for KITT to use SpeechKITT.setStylesheet('//cdnjs.cloudflare.com/ajax/libs/SpeechKITT/1.0.0/themes/flat-concrete.css'); // テーマの設定 // Render KITT's interface SpeechKITT.vroom();
SpeechKITT - cdnjs.com - The best FOSS CDN for web related libraries to speed up your websites! -
認識された言葉の調整
「まる」
、「てん」
、「改行」
と話した際に、「。」
、「、」
、「\r\n」` に変換されるようにしたかったので、以下のような実装を Callback 処理に追加しました。phrases には、5要素認識した文字列の候補が設定されます。何回か認識された結果の文字列を事前に記録しておき、候補の中にそれらが含まれれば、みなしで変換するようにしました。実装してから気がつきましたが、annyang を使用する場合はこのようなユースケースはタスクで登録してもいいかと思います。function isLineBreak(phrases) { for (var i = 0; i < phrases.length; i++) { if("改行" == phrases[i]) { return true; } if("開業" == phrases[i]) { return true; } if("戒名" == phrases[i]) { return true; } if("MARU" == phrases[i]) { return true; } } return false; } function isPhrasesPunctuation(phrases) { for (var i = 0; i < phrases.length; i++) { if("まる" == phrases[i]) { return true; } if("丸" == phrases[i]) { return true; } if("マル" == phrases[i]) { return true; } if("MARU" == phrases[i]) { return true; } } return false; } function isPhrasesReading(phrases) { for (var i = 0; i < phrases.length; i++) { if("10" == phrases[i]) { return true; } if("天" == phrases[i]) { return true; } if("てん" == phrases[i]) { return true; } if("店" == phrases[i]) { return true; } if("テン" == phrases[i]) { return true; } } return false; } annyang.addCallback('result', function(phrases) { if (isPhrasesReading(phrases)) { noteContent += "、"; } else if (isPhrasesPunctuation(phrases)) { noteContent += "。"; } else if (isLineBreak(phrases)) { noteContent += "\r\n"; } else { noteContent += phrases[0]; } noteTextarea.val(noteContent); noteTextarea.focus(); noteTextarea.setSelectionRange(noteTextarea.value.length, noteTextarea.value.length); });
-
4.3. サンプルを作ったり、調べたりして思ったこと
サンプルプログラムの作成、調べた結果思ったことを記載します。
-
Web Speech API の精度はPCのマイクを使う前提だとそれほど良くない。
1人のみ、はっきると話す必要があります。外付けのマイクを使うなどするともっと良い感じになるのかもしれません。 -
Voiceコマンド使用時の注意点
1つのことを上手くやるようなイメージで実装するのが上手く行きそうに思いました。
画面の使用するコンテキストを絞り込んでおくとコマンドの名寄せがある程度できて認識率も高められるかと思います。
5. 参考
以下、調べている最中に読んだ記事になります。
* UDトークって? | UDトーク
-
5 Voice Control JavaScript Libraries for Developers | jQueryHouse
-
【サービス編3】高精度なGoogleの音声認識を使って無料で文字起こしができる!サービスまとめ - 音声認識ラボ by 東京反訳
-
annyang のドキュメント
以上です。
Voice command のサンプルも作ってみようと思ったのですが、力尽きてしまったのでそのうちチャレンジしてみようかと思います。
コメント