Category Archives: スピーチプラットフォーム

Windows 10 に搭載されているSAPI(音声合成)とCortanaについて

今回はWindows 10の音声合成の環境のアップデート。

Win7, 8, 8.1にはSAPIが搭載されており、sapi.hにOS標準の音声合成APIが含まれていました。Windows10も同様、標準のボイスの情報はSPCAT_VOICESに定義されているレジストリキー(HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Speech\\Voices)にあり、バージョンは11.0となっています。

SAPI_REG1

さらに、Speech Platform Language Packでインストールされるボイスは”Speech Server”下に定義されます。このレジストリキーはSpEnumTokens関数でTokenを取得するときに第一引数として使用できます。(ただしSpeech Serverは Speech Platfrom Runtimeをインストールしないと、登録されていないボイスというエラーが返ってきます)

さらに、Windows10で話題のCortana(コルタナ)ですが、同じフォーマットでSpeech_OneCoreに定義されています。このボイスはSpEnumTokens関数で指定可能です。

SpEnumTokensでCortanaのボイスを指定する例)

hr = SpEnumTokens(L”HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Speech_OneCore\\Voices”, strReqAttribute, NULL, &pEnum);

CortanaにはパラメータがSAPIよりも用意されていますが、公開されているかは不明です。今のところ、SAPIから使用可能ということだけでしょうか。あと、日本語Cortanaのボイス名は”Ichiro”と”Ayumi”となっています。

SAPI_REG2

誰を使って、AI作ろうか。

今回作った。SAPIの関数(COMのHRESULTのエラー処理は省略)

HRESULT speak(LPWSTR strSpeakString)
{
	HRESULT hr = S_OK;

	//ISpVoice * pVoice = NULL;
	ISpVoice *pVoice = 0; 
	ISpObjectToken *pToken = 0;
	IEnumSpObjectTokens *pEnum = 0;

	if (FAILED(CoInitialize(NULL)))
	{
		::MessageBoxW(NULL, L"Error to intiliaze COM", L"DBG", MB_OK);
		return S_OK;
	}	

	hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void **)&pVoice);
	if (SUCCEEDED(hr))
	{

		hr = SpEnumTokens(SPCAT_VOICES, L"Language = 411", NULL, &pEnum); //SAPI default voice (OS language pack) 411:Japanese
		//hr = SpEnumTokens(L"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Speech Server\\v11.0\\Voices", L"Language = 411", NULL, &pEnum); //Speech Platform v11.0 (Required runtime)
		//hr = SpEnumTokens(L"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Speech_OneCore\\Voices", L"Language = 411", NULL, &pEnum); //Cortana voice

		ULONG ulCount = 0;
		USHORT usVolume = 0;
		
		long lRate = 0;


		hr = pEnum->GetCount(&ulCount);
		pEnum->Item(0, &pToken);
			
		hr = pVoice->SetVoice(pToken);
		hr = pVoice->GetVolume(&usVolume);
		hr = pVoice->SetVolume(100); //0 - 100

		hr = pVoice->GetRate(&lRate);
		hr = pVoice->SetRate(0); // -10 to 10


		hr = pVoice->Speak(NULL, SPF_PURGEBEFORESPEAK, 0);
		hr = pVoice->Speak(strSpeakString, SPF_IS_XML | SPF_DEFAULT, NULL);
		hr = pVoice->WaitUntilDone(INFINITE);

		if(pToken)
		{
			hr = pToken->Release();
			pToken = 0;
		}

		if (pVoice)
		{
			hr = pVoice->Release();
			pVoice = 0;
		}

		if (pEnum)
		{
			hr = pEnum->Release();
			pEnum = 0;
		}
	}

	if (pToken)
	{
		hr = pToken->Release();
		pToken = 0;
	}

	CoUninitialize();
	return S_OK;
}

 

 

 

WASAPIを使った音声処理

ちょっとしたきっかけでWASAPIを理解する機会があったのでちょっと書いてみます。

WASAPIといえば、WindowsVistaから実装されたオーディオAPIですが、ハードウェア依存がなく結構使いやすくなっています。今回試したのは、入力デバイスから入力された音声データと、現在OSが再生している出力バッファ領域に容易にアクセスできるということです。

仕組みを簡単に言ってしまえば、OSが音声が再生するタイミングで、再生バッファサイズ(サンプリングレート、ビット長によって変わります)の値が0から実サイズになり、先頭アドレスがGetBufferで返されます。GetBufferには再生フラグが設定されており、再生バッファのデータ値がすべて0の時(無音時)にはサイレントフラグもセットされるようになっています。

データ型はごく一般的なPCMデータでWAVEファイルのデータと同じです。(ただオーディオドライバではサンプリングデータ長を16BItと24Bitの設定ができるのだが、データは常に16Bitになっているのが今だ疑問である。)

AudioSample

データの処理としては、再生も録音も同じ仕組みになっているようで、録音デバイスと再生デバイスの違いだけで処理は共通にすることができます。

WASAPIについては、WinRTでも使えるので覚えておいて損はないと思います。DirectX(Direct3D, Direct2D)とWASAPIで結構なものが作れますね。

Win32でDirect2DとWindows Animationは大体使ったので、WASAPIが制覇できればゲーム系のSDKが作れるなぁ。さてそろそろか。

 

HTML5やphpを始めてみる。AIはクライアントにあるべき。

さて、最近インターネットにも飽きてきた今日この頃(youtuberがらみの記事とか)ですが、こんなことではいけないと思い、phpやmySQLを使ってHTML5がらみのサイトを作り始めました。まだ公開できるものではありませんがライブラリ的なテンプレートはできてきました。メンバーログインや、DBの管理(辞書やBBS、蓄積型のデータ管理等)がウェブからできるようになりそうです。

たぶん、現時点での最有力なAI(?)のSiriさんもこんなPHPの返りから返答パターンを繰り返しているのかと思いながらふと思ったことがあり。。。AIってクライアント一台一台が持つべき頭脳ではないのかと。サーバー上でデータを解析してサーバーのデータだけが太っていったのではいつまでもパソコンは、パーソナルにはなり得ない。

個人的に調べたいことだって、どうしてサーバーに一度送られ、サーバーから答えが返ってくるのか。クライアントが自分でサーチしてベストな結果を探してくるべきではないかと思ったわけです。個人情報をやたら入力しろというクラウドサービス。個人情報を提供しているにもかかわらず便利になってない、パソコン事情。そこがおかしいと言いたい。

で、なにをするべきかと考えたわけですが、やるべき操作のマクロをプラグイン化できるクライアントソフト。どんどん機能をプラグインとして追加(課金でもいい)していく。例えば、ショッピングサイトから最安値を見つけるプラグイン。ソフト本体は、TTSなり、UIなりで自由に。TTSもプラグインかな。

こんなソフトがあったら、みんなのパソコン便利になるぞ〜。Windows Store Appでやってみるか。

かんたん!AITalk2PLUSの評価 ~ その3

先日、Wavファイルで音声をセーブしておいて所定のイベントで再生させるということを書きましたが、Wavファイルの再生ができるのであれば、50音をメモリ上の波形データを切り貼りさせれば言葉の発音ができるのではと初期のコンセプトに戻ってきました。(処理的にはWavファイルのヘッダーから音声の設定、サンプリングレートや、ステレオ、波形データのサイズ等を読み込んでデータをWASAPIに流し込んでいくだけ)次回はWASAPI関係のラッパーを作っていくことにしよう。

イントネーションや速度、高さなど人間的な表現にはかなりの調整が必要になると思うけど、機械的な声を作ったり、実際に話している人のボイスチェンジャー的なソフトも作ってみたいしね。

前にも書いたかもしれないが、現行のスピーチプラットフォーム(Ver.11)はWindows8になって漢字の読み(IMEが悪いのか、OSの漢字の読みが悪いのかは不明だが、確実にWindows7の時の漢字の読みよりも悪くなっている)がだめなので独自に読み方辞書みたいのを作るか、どこかのDBから漢字の読みを取ってきて再生させるかしかない。KINNECTでは本当に使えているのだろうか。内部は全部平仮名だったら笑うけど。w

AITalk

ブログの投稿前にとりあえず読み返しさせているところ。結構長い文章でも問題なく読んでくれています。ブログもテキストじゃなく、Wavファイルで投稿しちゃうか・・・自分の声とかでは素人過ぎて使い物にならないので。この声と会話ができるようになるのでしょうか。アイアンマンの映画を見て、また考える。

Microsoft Speech Platform を SAPI5 として使う

2010年10月16日(土)07時36分
【追記:2011/09/04】Microsoft Speech Platform のバージョンアップについて
「Microsoft Speech Platform 11」に書きましたが、Microsoft Speech Platform が「11」にバージョンアップしました。
それに伴い、「10.x」向けに書かれたこの記事の内容も、改定が必要になったわけですが、記事内容を直接書き換えますと、将来さらに「12」になった時やそ
Microsoft Speech Platform を SAPI5 として使う