スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

【同じタグを付けた記事の一覧】

Windows の音声認識を JavaScript で(録音再生編)

2012年02月06日(月)00時48分

認識音声の再生と保存

前回は、Windows の音声認識機能を使い、マイクから入力した音声の認識結果を取得する方法について書きました。
今回は WAVE ファイルを音声認識にかける方法について書こうかと思ったのですが、それには WAVE ファイルが必要になりますので、その前にまず、マイクから入力した認識音声を再生したり、WAVE ファイルに保存したりする方法について書くことにしました。
サンプルは前回のものへの加筆・変更になりますので、基本的な知識や準備については、前回「Windows の音声認識を JavaScript で(基礎編)」をご覧ください。
また、「音声認識」タグで当ブログの音声認識関連の記事が一覧できますので、目次代わりにご利用ください。

サンプルの内容

今回のサンプルは、基本的には前回とほぼ同じですが、認識後にマイク入力された認識音声が再生されます。
また、実行時にスクリプトの存在するフォルダに「WAVE」フォルダが生成され、そこに認識音声が WAVE ファイルとして保存されます。
それから、今回は「終了」と言えばスクリプトが終了するようになっています。

サンプルの実行

DictJS01.js ← 矢印左側の文字の上で右クリックし、「対象をファイルに保存(A)…」して保存します。
保存したスクリプトファイルを右クリックし「プロパティ」を見たときに、「セキュリティ:このファイルは他のコンピュータから取得したものです。このコンピュータを保護するため、このファイルへのアクセスはブロックされる可能性があります。」と書かれている場合は「ブロックの解除」をしてください(しなくても使えますが)。
これ以降はサンプルの内容についての補足説明を書いていきます。

内部音声の保持

まず最初に、おそらくメモリ節約のためと思いますが、標準での RecoContext オブジェクトは、認識処理が完了するとすぐに、使用した音声データを破棄する設定になっています。
ですので、認識後の音声データを何かに使用する場合には、内部的に音声データを保持しておくように設定を変更しておく必要があります。
それには、RecoContext オブジェクトを生成後、音声認識の開始(RecoGrammar オブジェクトの DictationSetState 関数の実行)までの間に、RecoContext オブジェクトのRetainedAudio プロパティに SRAORetainAudio(数値の1)を設定します。
サンプルでは、RecoContextオブジェクト生成生成直後に行っています。

//Vista・Win7で「Shared」を使うとマイクユーザーインターフェイスが起動するため「InProc」を使う。
var RecoContextObj=WScript.CreateObject("SAPI.SpInProcRecoContext","Recog_");
//認識した音声データをメモリ上に保持しておくよう設定(1=SRAORetainAudio)。
RecoContextObj.RetainedAudio=1;
//「InProc」では「RecoContext → Recognizer」の順でないとなぜかうまくいかない。
var RecognizerObj=RecoContextObj.Recognizer;

認識音声の再生

認識音声の操作に関しては、認識時に呼び出される関数(サンプルでは Recog_Recognition 関数)内で行います。
この関数の第四引数である ISpeechRecoResult オブジェクト(サンプルでは Result)に、音声データが格納されています。
そしてまず再生ですが、これは ISpeechRecoResult オブジェクトの SpeakAudio 関数で可能です。
サンプルでいうと、Recog_Recognition 関数内で「Result.SpeakAudio();」すれば再生されます。

Voice オブジェクト

次に WAVE ファイルへの保存ですが、その前に Voice オブジェクトについて。
これは音声「合成」用のオブジェクトで、単体でも「var VoiceObj=WScript.CreateObject("SAPI.SpVoice");」のようにして生成でき、そして例えば「VoiceObj.Speak("I love you.");」のようにすることで、音声合成が可能です。
そして、音声認識用である RecoContext オブジェクトはその内部に、Voice プロパティとしてこの音声合成用である Voice オブジェクトを保有しています。
これは何故か?ということなのですが、Voice オブジェクトは合成した音声を再生したり保存したりする用途で WAVE ファイルを操作する機能が必須となりますので、それならば RecoContext オブジェクトの方でまた似たような機能を重複させたりせず、WAVE ファイルの操作は Voice オブジェクトで一本化しましょう、ということかと思われます。

FileStream オブジェクト

もう一つ、FileStream オブジェクトについて。
SAPI5 は音声データを Stream オブジェクトとして抽象化しており、そのためデータの読み書きは、その対象がメモリであれファイルであれマイクであれスピーカーであれ、それらの違いをあまり意識せずに扱えるようになっています。
その Stream オブジェクトの内、ファイルを対象にしたものが FileStream オブジェクトです。
この FileStream オブジェクトは、データを読み書きする前に、対象ファイルを Open 関数でオブジェクトに関連付けることで、そのファイルを対象に読み書きできるようにするものです。
また、この手の処理の常として、読み書きが終わればClose関数で閉じる必要があります。

認識音声の音質

それから、認識音声の音質(WAVE フォーマット)について。
音声データの形式は、上記 Stream オブジェクトの Format.Type プロパティで参照と変更が可能です。
SAPI5 から渡される認識済み音声データ(サンプルでは「Result.Audio()」)は、WinXP でも Win7 でも「16kHz16BitMono(設定値は18)」でした。
ですのでおそらく、SAPI5 ではマイク音声を内部的に 16kHz16BitMono として録音し、解析しているのではないかと思われます。
また、これを FileStream オブジェクトの Format.Type プロパティに何も指定せず出力した場合、WinXP でも Win7 でも「22kHz16BitMono(設定値は22)」として保存されました。
つまり、FileStream オブジェクトの初期値は 22kHz16BitMono のようです。
以前「Microsoft Speech Platform の音質」でも書いたのですが、SAPI5 のリサンプリング処理はあまり品質の高いものではありませんので、できればここでのリサンプリング処理は避けた方が良いでしょう。

認識音声の保存

ということで、認識音声の保存手順は以下のようになります。

  1. FileStream オブジェクトの生成
  2. FileStream オブジェクトの Format.Type プロパティに保存形式を指定
  3. FileStream オブジェクトに WAVE ファイルを関連付け
  4. Voice オブジェクトの出力先として FileStream オブジェクトを設定
  5. Voice オブジェクトで認識音声を再生
  6. FileStream オブジェクトの WAVE ファイルを閉じる

そしてこれをコード化したものが、サンプル内 Recog_Recognition 関数の以下の部分です。

	//音声保存用オブジェクトを生成。
	var FileStreamObj=WScript.CreateObject("SAPI.SpFileStream");
	//出力形式を内部形式に合わせて18(16kHz16BitMono)に変更。
	//未指定の場合には22(22kHz16BitMono)となる。
	FileStreamObj.Format.Type=Result.Audio().Format.Type;
	//保存先としてWAVEファイルを書き込み設定(3=SSFMCreateForWrite)で開く。
	//ファイル名は1970/1/1から現在までの秒数(ミリ秒)とした。
	FileStreamObj.Open(fso.BuildPath(WavePath,new Date().getTime()+".wav"),3);
	//音声保存用オブジェクトを音声の出力先に指定。
	RecoContextObj.Voice.AudioOutputStream=FileStreamObj;
	//音声を指定された出力先に対して再生。
	RecoContextObj.Voice.SpeakStream(Result.Audio());
	//音声保存用オブジェクトを音声の出力先から切り離す。
	//この処理で音声の出力先が標準出力(スピーカー)に戻る。
	//これをしておかないと二回目以降の認識時に音声の通常再生がエラーとなる。
	RecoContextObj.Voice.AudioOutputStream=null;
	//WAVEファイルを閉じて書き込みを完了させる。
	FileStreamObj.Close();

マイク入力のレベル確認に

今回のサンプルですが、認識エンジンが認識に使用している音声を確認できますので、「認識率があまりにも低い!」というような場合の問題点の確認に使えるかと思います。
これで再生音を聞いてみて、音が小さすぎて聞こえづらいとか、逆に大きすぎて割れているとか、あるいはノイズが酷いとか、そういうことが分かれば、マイク入力のレベルを調整したり、場合によってはマイクやサウンドカードを買い替える、といった改善策を考えることができます。
もしこれで、はっきりと聞こえて音割れもせず、ノイズも乗っていないのに認識率が悪い、ということになりますと、滑舌が悪いとか、あるいは残念ながら声質が音声認識に向いていない、というようなことがあるのかもしれません。
認識させたい単語や文章が、認識エンジンの辞書に存在しないために認識できない、という可能性も高いと思いますが。

防犯?盗聴?

それから、この認識音声の保存処理は原理上、音が鳴っているときだけ録音することになります。
つまり、IC レコーダーでいうところの「音声起動録音」が可能になるわけです(というよりそれしかできないのですが)。
ですので、会議の録音や、常時起動のサーバ機に防犯目的?で仕込んだり、枕元にマイクを置いて寝言(いびき)の確認、あるいは自分が席を立っている間にまわりで何が話されていたのか知りたい、みたいなことにも使えると思います。
ただ、ちょっとした物音にも結構反応しますので、「音声起動録音」用途で使うのであれば、音声のサイズが小さすぎる場合には残さない、あえてマイクの入力レベルを下げる、というような処理を行う必要はありそうです。

関連記事

【同じタグを付けた記事の一覧】
ソースコード プログラミング JavaScript 音声技術 音声認識

スポンサーサイト

コメントの投稿

非公開コメント

最新記事
最新コメント
Amazonおまかせリンク
カテゴリ
タグクラウド
Amazonお買い得ウィジェット
カレンダー
05 | 2017/06 | 07
- - - - 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 -
月別アーカイブ
プロフィール

電脳太助

Author:電脳太助
Website:電脳スピーチ web

RSSリンクの表示
メールフォーム

名前:
メール:
件名:
本文:

サイト内検索
Ads by Google
FC2アクセスランキング
Ads by Google
FC2拍手ランキング
ユーザータグ

音楽管理(66)
ポータブル(57)
ソフト紹介(44)
プログラミング(42)
音声技術(41)
自作ソフト(35)
サイト運営(32)
FC2(31)
ブログ(30)
iTunes(27)
Windows(25)
LISMO(24)
音声合成(23)
音声認識(22)
x-アプリ(22)
電子ブック(22)
eラーニング(20)
バックアップ(19)
語学学習(19)
foobar2000(18)
ソースコード(18)
WindowsLiveWriter(15)
画像管理(15)
C++(14)
アフィリエイト(10)
DnspTools(10)
fi-6130(9)
FLAC(9)
JavaScript(9)
ウォークマン(9)
英語音読学習計画(8)
Gracenote(8)
Prolog(8)
ベクター(8)
雑記(8)
CodeBlocks(7)
SyntaxHighlighter(7)
TraConv(7)
spcbght(7)
wxWidgets(7)
VirtualBox(6)
W63CA(6)
DCP-J552N(6)
WinRT(6)
WindowsLiveMesh(6)
iGoinLM(6)
英語発音矯正実験(6)
ExactAudioCopy(6)
MP3Gain(6)
LAME(5)
音楽技術(5)
Mery(5)
楽器演奏(5)
GalateaTalk(4)
nLite(4)
WindowsLiveSkyDrive(4)
ホームページ(4)
GalateaProject(4)
MIDI(4)
LLVM(4)
PC-98(3)
カウンター(3)
AACGain(3)
iTCDini(3)
OverCutChecker(3)
拍手(3)
PK-513L(3)
UniversalExtractor(3)
アクセスランキング(3)
ImageCompositeEditor(2)
アクセス解析(2)
OCR(2)
qtaacenc(2)
資格試験(1)
AquesTalk(1)
AquesCmdDl(1)

FC2アクセスランキング
最新トラックバック
アクセスランキング
[ジャンルランキング]
コンピュータ
106位
アクセスランキングを見る>>

[サブジャンルランキング]
ソフトウェア
11位
アクセスランキングを見る>>
FC2カウンター
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。