HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2013
1231
seasalt「コントロールパネル−音声認識」のプロパティにある「音声の選択」を3解決


seasalt

リンク

2013/12/31(Tue) 00:31:40|NO.58994

HSPの付属サンプルを参考に、テキスト読み上げソフトをHSPで作成しています。
コア部分はなんとかできてきたのですが、他の読み上げソフトによくある「音声の選択」
(話者の選択と表記される場合もあります)
をどのようにすればよいかが分からず、質問させて頂きました。

いろいろ調べてみたところ、COMオブジェクトをどうにかすればできるようなのですが、
COMオブジェクトの扱いに不慣れなもので…
現在のところ「コントロールパネル−音声認識」を開いて「音声の選択」で代用しているのですが
HSPから選択する方法がありましたら教えて頂けないでしょうか。よろしくお願いします。



この記事に返信する


inovia

リンク

2013/12/31(Tue) 13:53:03|NO.59018

HSP付属のサンプルとやり方が違いますが、同じことができるので。
ついでに、音量変更と速度変更機能も付けておきました。


#module SAPI_Speech_Voices #define global ctype SUCCEEDED(%1) ((%1) >= 0) /* #define global SafeRelease(%1) if ((varuse@(%1)) && (vartype@(%1) == 6)){ \ delcom@ %1: \ %1 = 0 \ } */ #define IID_ISpVoice "{6C44DF74-72B9-4992-A1EC-EF996E0422D4}" #define IID_IEnumSpObjectTokens "{06B64F9E-7FDA-11D2-B4F2-00C04F797396}" #define IID_ISpObjectToken "{14056589-E16C-11D2-BB90-00C04F8EE6C0}" #define IID_ISpObjectTokenCategory "{2D3D3845-39AF-4850-BBF9-40B49780011D}" #define CLSID_SpVoice "{96749377-3391-11D2-9EE3-00C04F797396}" #define CLSID_SpMMAudioEnum "{AB1890A0-E91F-11D2-BB91-00C04F8EE6C0}" #define CLSID_SpObjectToken "{EF411752-3736-4CB4-9C8C-8EF4CCB58EFE}" #define CLSID_SpObjectTokenCategory "{A910187F-0C7A-45AC-92CC-59EDAFB77B53}" #define SPCAT_VOICES "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Speech\\Voices" #usecom ISpVoice IID_ISpVoice CLSID_SpVoice // IUnknown(3)->ISpNotifySource(7)->ISpEventSource(3)->ISpVoice #comfunc ISpVoice_Pause 16 #comfunc ISpVoice_Resume 17 #comfunc ISpVoice_SetVoice 18 int #comfunc ISpVoice_GetVoice 19 var #comfunc ISpVoice_Speak 20 wstr, int, int #comfunc ISpVoice_SetRate 28 int #comfunc ISpVoice_GetRate 29 var #comfunc ISpVoice_SetVolume 30 int #comfunc ISpVoice_GetVolume 31 var #usecom ISpObjectTokenCategory IID_ISpObjectTokenCategory CLSID_SpObjectTokenCategory //IUnknown(3)->ISpDataKey(12)->ISpObjectTokenCategory #comfunc ISpObjectTokenCategory_SetId 15 wstr, int #comfunc ISpObjectTokenCategory_EnumTokens 18 wstr, wstr, sptr #usecom IEnumSpObjectTokens IID_IEnumSpObjectTokens CLSID_SpMMAudioEnum // IUnknown(3)->IEnumSpObjectTokens #comfunc IEnumSpObjectTokens_Next 3 int, sptr, sptr #comfunc IEnumSpObjectTokens_Reset 5 #comfunc IEnumSpObjectTokens_Clone 6 sptr #comfunc IEnumSpObjectTokens_Item 7 int, sptr #comfunc IEnumSpObjectTokens_GetCount 8 var #usecom ISpObjectToken IID_ISpObjectToken CLSID_SpObjectToken // IUnknown(3)->ISpDataKey(12)->ISpObjectToken #comfunc ISpObjectToken_GetStringValue 6 wstr, sptr #deffunc SafeRelease var p1 if ((varuse(p1)) && (vartype(p1) == 6)){ delcom p1 p1 = 0 } return #deffunc CreateVoice var pSpVoice newcom pSpVoice, ISpVoice return #deffunc GetVoicesList var list sdim list, 1024 // 話者一覧取得 newcom pSpOTC, ISpObjectTokenCategory if varuse(pSpOTC){ ISpObjectTokenCategory_SetId pSpOTC, SPCAT_VOICES, 0 : hr = stat if SUCCEEDED(hr){ ptr = 0 ISpObjectTokenCategory_EnumTokens pSpOTC, "", "", varptr(ptr) : hr = stat if SUCCEEDED(hr) && ptr != 0{ newcom pSpOTs, IEnumSpObjectTokens, -1, ptr if varuse(pSpOTs){ Num = 0 IEnumSpObjectTokens_GetCount pSpOTs, Num : hr = stat if SUCCEEDED(hr){ repeat Num ptr = 0 IEnumSpObjectTokens_Item pSpOTs, cnt, varptr(ptr) : hr = stat if SUCCEEDED(hr) && ptr != 0{ newcom pSpT, ISpObjectToken, -1, ptr ISpObjectToken_GetStringValue pSpT, "", varptr(ptr) : hr = stat if SUCCEEDED(hr){ dupptr wStr, ptr, 1024, 2 list += cnvwtos(wStr) + "\n" } SafeRelease pSpT } loop } SafeRelease pSpOTs } } } SafeRelease pSpOTC } return hr #deffunc SetVoice var pSpVoice, int idx newcom pSpOTC, ISpObjectTokenCategory if varuse(pSpOTC){ ISpObjectTokenCategory_SetId pSpOTC, SPCAT_VOICES, 0 : hr = stat if SUCCEEDED(hr){ ptr = 0 ISpObjectTokenCategory_EnumTokens pSpOTC, "", "", varptr(ptr) : hr = stat if SUCCEEDED(hr) && ptr != 0{ newcom pSpOTs, IEnumSpObjectTokens, -1, ptr if varuse(pSpOTs){ ptr = 0 IEnumSpObjectTokens_Item pSpOTs, idx, varptr(ptr) : hr = stat if SUCCEEDED(hr){ ISpVoice_SetVoice pSpVoice, ptr } SafeRelease pSpOTs } } } SafeRelease pSpOTC } return hr #deffunc VoiceSpeek var pSpVoice, str s, int f ISpVoice_Speak pSpVoice, s, f, 0 return stat #deffunc DestoryVoice var pSpVoice SafeRelease pSpVoice return stat #defcfunc GetVoiceVolume var pSpVoice Volume = 0 ISpVoice_GetVolume pSpVoice, Volume return Volume #deffunc SetVoiceVolume var pSpVoice, int vol ISpVoice_SetVolume pSpVoice, vol return stat #defcfunc GetVoiceRate var pSpVoice, local Rate Rate = 0 ISpVoice_GetRate pSpVoice, Rate return Rate #deffunc SetVoiceRate var pSpVoice, int rate ISpVoice_SetRate pSpVoice, rate return stat #deffunc VoicePause var pSpVoice ISpVoice_Pause pSpVoice return stat #deffunc VoiceResume var pSpVoice ISpVoice_Resume pSpVoice return stat #global // 以下サンプル pSpVoice = 0 // ComObj作成 CreateVoice pSpVoice if varuse(pSpVoice){ onexit gosub *exit // 一覧取得 GetVoicesList list idx = 0 objsize 420, 20 combox idx, 100, list mes "▼ 文章" sdim s, 1024 : s = "Hello this is H.S.P. for windows." input s mes "▼ 音量(0〜100)" Volume = 100 input Volume mes "▼ 速度(-10〜10)" Rate = 0 input Rate chkbox "再生終了まで待たない", Async button gosub "再生", *speak }else{ dialog "呼び出し失敗" } stop *speak // 音量設定(0〜100) SetVoiceVolume pSpVoice, Volume // 再生速度設定(-10〜10) SetVoiceRate pSpVoice, Rate title "音量:"+GetVoiceVolume(pSpVoice)+", 速度"+GetVoiceRate(pSpVoice) // 音声選択 SetVoice pSpVoice, idx if stat{ dialog "音声選択に失敗しました" } // 同期再生(再生終了まで待つ) // 1にすると非同期 VoiceSpeek pSpVoice, s, Async if stat{ dialog "再生失敗しました" } return *exit // 終了時にでも破棄する DestoryVoice pSpVoice end : end return



seasalt

リンク

2013/12/31(Tue) 22:52:04|NO.59048

こんな立派なものを…!ありがとうございます。
今、出先なので、帰ったらさっそく試してみようと思います。
ありがとうございました。



seasalt

リンク

2013/12/31(Tue) 23:04:58|NO.59049

解決です。



ONION software Copyright 1997-2023(c) All rights reserved.