ページ 1 / 1
音声読み上げ機能について質問させて下さい。
Posted: 2006年3月08日(水) 17:25
by 地武太地部右衛門
皆さん、こんにちわ。宜しくお願いします。
本題ですが、音声読み上げって面白いなぁと思い、自分でも作ってみたいので検索してると、
TextToSpeachというのを使えば可能という事が分かり、さらにHSPのサンプルもみつけ
その内容も簡単そうなので、意気揚々として、さぁ始めるぞとHSPのサンプルをみるとActiveXというのを使ってる。
ActiveBasic関連で、ActiveXは全く聞いたことが無いし、検索しても情報が全然無い。
もしかして、ActiveBasicでActiveXは使えないのでしょうか。
(そもそも、ActiveXに関しても、検索してすぐ分かることぐらいしか知らないのですが。)
もし扱えるなら、簡単な扱い方というか、おおまかな流れみたいな物を教えてくれると有り難いです。
後は自分で調べますので。
扱えないとしても、やりたい事は音声読み上げなので、別の方法で実現可能なら、それを教えて欲しいです。
参考にしたサイト
http://smile.poosan.net/perl-bin/hsp/ve ... 110019.txt
http://www.kct.ne.jp/~okuda/comlab/Text ... peach.html
http://www.onionsoft.net/hsp/beta/log/15.html
↑ページ自体が長いのでTextToSpeachで検索して下さい。ここにはHSP3.0なら2行だけで喋り出すと書いてあります(!)
HSPを勉強した方が早いのかな。
音声読みあげとは(一応知らない人の為に)
入力した文字を機械の声が喋ってくれる機能です。
私はESTAPというソフトで知りました。
http://www.tcct.zaq.ne.jp/yamano/
このソフトもそうですが、text-to-speech engineを別途インストールして
それに命令を出してるだけの様なので、私にも実現可能だと思ったのです。
以上の事に関して、ご存知の方がいましたらどうか教えて下さい。宜しくお願いします。
音声読み上げ機能について質問させて下さい。
Posted: 2006年3月12日(日) 16:01
by 地武太地部右衛門
う~ん、スルーされてしまっているようですね。
質問の仕方が悪かったのでしょうか。
ActiveXコントロールが使えるのか、使えるのならその使用法、が聞きたかったのですが。
最近調べた中では、コードの切れ端の以下のページのように
http://dbp.cool.ne.jp/patio/patio.cgi?mode=view&no=248
クラスを定義すれば使えるのかなと思っていますが…。
詳しい人は誰もいないのでしょうか。
重ね重ね宜しくお願いします。
Posted: 2006年3月12日(日) 23:42
by ゲスト
とりあえず、方向性はそのとおりインターフェイスクラスの宣言を書いていく必要があるというのは間違っていません。
ただ、検索してみるとVBのサンプルばかり見つかるのが個人的には気がかりです。
ことActiveXに関してはC++のコードのほうが参考にしやすいので。
Re:テキスト読み上げについて
Posted: 2006年3月19日(日) 22:21
by M.K
こんばんは...
自分も必要に迫られ...
どうにか動くものを製作しました。
シロウト考えですがご容赦ください...
1.Windowsアプリケーションプロジェクトを作成し、そのプロジェクトに新しくBasicプログラムファイル(*.abp/*.bas)を追加する。
2.それに以下のコードを打ち込む。
[ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]
コード: 全て選択
Class _ITextToSpeech
Inherits IUnknown
Public
'{ dualインターフェイス特有のメソッド(ダミー)を加えておく
Virtual Sub GetTypeInfoCount()
Virtual Sub GetTypeInfo()
Virtual Sub GetIdsOfNames()
Virtual Sub Invoke()
'}
'ここから下は、TextToSpeechのメソッドを並べる
Virtual Function initialized_Get(pVal As DWordPtr) As DWord
Virtual Function initialized_Set(pVal As Long) As DWord
Virtual Function Speak(Text As BytePtr) As DWord
Virtual Function StopSpeaking() As DWord
Virtual Function FastForward() As DWord
Virtual Function Pause() As DWord
Virtual Function Resume() As DWord
Virtual Function Rewind() As DWord
Virtual Function Device_Get(pVal As DWordPtr) As DWord
Virtual Function Device_Set(pVal As Long) As DWord
Virtual Function Enabled_Get(pVal As DWordPtr) As DWord
Virtual Function Enabled_Set(pVal As Long) As DWord
Virtual Function IsSpeaking(pVal As DWordPtr) As DWord
Virtual Function Speed_Get(pVal As DWordPtr) As DWord
Virtual Function Speed_Set(pVal As Long) As DWord
Virtual Function TTSMode_Get(pVal As BytePtr) As DWord
Virtual Function TTSMode_Set(pVal As BytePtr) As Dword
Virtual Function AboutDlg(hWnd As DWord,title As BytePtr) As DWord
Virtual Function GeneralDlg(hWnd As DWord,title As BytePtr) As DWord
Virtual Function LexiconDlg(hWnd As DWord,title As BytePtr) As DWord
Virtual Function TranslateDlg(hWnd As DWord,title As BytePtr) As DWord
Virtual Sub FindEngine() 'ダミーとして定義
Virtual Function CountEngines(pVal As DWordPtr) As DWord
Virtual Function ModeName(index As Long,pVal As BytePtr) As DWord
Virtual Function MfgName(index As Long,pVal As BytePtr) As DWord
Virtual Function ProductName(index As Long,pVal As BytePtr) As DWord
Virtual Function ModeID(index As Long,pVal As BytePtr) As DWord
Virtual Function Speaker(index As Long,pVal As BytePtr) As DWord
Virtual Function Style(index As Long,pVal As BytePtr) As DWord
Virtual Function Gender(index As Long,Gender As DWordPtr) As DWord
Virtual Function Age(index As Long,pVal As DWordPtr) As DWord
Virtual Function Features(index As Long,pVal As DWordPtr) As DWord
Virtual Function Interfaces(index As Long,pVal As DWordPtr) As DWord
Virtual Function EngineFeatures(index As Long,pVal As DWordPtr) As DWord
Virtual Function LanguageID(index As Long,pVal As DWordPtr) As DWord
Virtual Function dialect(index As Long,pVal As BytePtr) As DWord
Virtual Function MouthHeight_Get(pVal As DWordPtr) As Dword
Virtual Function MouthHeight_Set(pVal As Integer) As DWord
Virtual Function MouthWidth_Get(pVal As DWordPtr) As DWord
Virtual Function MouthWidth_Set(pVal As Integer) As DWord
Virtual Function MouthUpturn_Get(pVal As DWordPtr) As DWord
Virtual Function MouthUpturn_Set(pVal As Integer) As DWord
Virtual Function JawOpen_Get(pVal As DWordPtr) As DWord
Virtual Function JawOpen_Set(pVal As Integer) As DWord
Virtual Function TeethUpperVisible_Get(pVal As DWordPtr) As DWord
Virtual Function TeethUpperVisible_Set(pVal As Integer) As DWord
Virtual Function TeethLowerVisible_Get(pVal As DWordPtr) As DWord
Virtual Function TeethLowerVisible(pVal As Integer) As DWord
Virtual Function TonguePosn_Get(pVal As DWordPtr) As DWord
Virtual Function TonguePosn_Set(pVal As Integer) As DWord
Virtual Function LipTension_Get(pVal As DWordPtr) As DWord
Virtual Function LipTension_Set(pVal As Integer) As DWord
Virtual Function LastError_Get(pVal As DWordPtr) As DWord
Virtual Function LastError_Set(pVal As Long) As DWord
Virtual Function SuppressExceptions_Get(pVal As DWordPtr) As DWord
Virtual Function SuppressExceptions_Set(pVal As Integer) As DWord
Virtual Function EngineSelect(index As Long) As DWord
Virtual Function LipType_Get(pVal As DWordPtr) As DWord
Virtual Function LipType_Set(pVal As Integer) As DWord
Virtual Function CurrentMode_Get(pVal As DWordPtr) As DWord
Virtual Function CurrentMode_Set(pVal As Long) As DWord
Virtual Function hWnd(pVal As DWordPtr) As DWord
Virtual Function Find(RankList As BytePtr,index As DWordPtr) As DWord
End Class
'2398E32F-5C6E-11D1-8C65-0060081841DE
Dim CLASS_HTTSLIB = [&H2398E32F,&H5C6E,&H11D1,[&H8C,&H65,&H00,&H60,&H08,&H18,&H41,&HDE]] As GUID
/*
[
uuid(2398E32E-5C6E-11D1-8C65-0060081841DE),
helpstring("ITextToSpeech Interface"),
dual
]
*/
Dim IID_ITextToSpeech = [&H2398E32E,&H5C6E,&H11D1,[&H8C,&H65,&H00,&H60,&H08,&H18,&H41,&HDE]] As GUID
TypeDef ITextToSpeech = *_ITextToSpeech
Dim VText As ITextToSpeech
3.メインウィンドウのCreateイベントに以下のコードを挿入する
[ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]
コード: 全て選択
Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT)
CoInitialize(NULL)
If CoCreateInstance(CLASS_HTTSLIB,NULL,CLSCTX_INPROC_SERVER,IID_ITextToSpeech,VarPtr(VText)) <> 0 Then
EnableWindow(GetDlgItem(hMainWnd,CommandButton1),FALSE)
MessageBox(hMainWnd,"MS VoiceText(Vtext.dll)がインストール" & Chr$(13) & Chr$(10) &"されていないか不正です!","エラー",MB_OK Or MB_ICONSTOP)
End
End If
End Sub
4.メインウィンドウにボタン(ここではCommandButton1)を配置して、Clickイベントに以下のコードを挿入する。
[ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]
コード: 全て選択
Sub MainWnd_CommandButton1_Click()
'「お待たせいたしました」のUNICODE表記
Dim spkText[21] = [
&h4A,&h30,&h85,&h5F,&h5F,&h30,&h5B,&h30,&h44,&h30,
&h5F,&h30,&h57,&h30,&h7E,&h30,&h57,&h30,&h5F,&h30,
&h00,&h00
] As Byte
VText->StopSpeaking()
VText->Speak(spkText)
End Sub
5.メインウィンドウのDestroyイベントへ
VText->Release()
を挿入する。
6.「リリースコンパイル」してExeにしたものを実行する(重要!)。
ボタンをクリックして「お待たせいたしました」としゃべるか確認してみてください。
※ここで注意することは、文字列をUNICODEで渡すこと。(うちはこれでうまくいきました...)
※テキストボックス(エディットボックス)の文字列をしゃべらせるには、
内容をUNICODEに変えてしゃべらせるようにしてください。
(うちは現在実験中です...)
※このコードはAB-Ver4以降用です。
Re:テキスト読み上げについて
Posted: 2006年3月20日(月) 18:30
by 地武太地部右衛門
ゲストさん、M.Kさん、返信ありがとうございます。
私も調査/実験中だったのですが、全然進んでませんでした。
しかし、M.Kさんのコードで、確かに喋らす事が出来ました。
で、私も微力ながらボタン部分を改造したコードを載せます。
まずエディットボックスをウインドウに作っておいてください。
コード: 全て選択
Sub MainWnd_CommandButton1_Click()
Dim hEdit As Long
Dim LenEdit As Long
Dim EditStr As String
Dim spkText As String
hEdit = GetDlgItem(hMainWnd,EditBox1)
LenEdit = GetWindowTextLength(hEdit) +1
If LenEdit = 1 Then
MessageBox(0,"文字が入力されてないよ!","エラー",MB_ICONSTOP or MB_TOPMOST)
ExitSub
End If
EditStr = ZeroString(LenEdit)
GetWindowText(hEdit,StrPtr(EditStr),LenEdit)
MultiByteToWideChar(0,0,EditStr,LenEdit,StrPtr(spkText),LenEdit)
VText->StopSpeaking()
VText->Speak(spkText)
End Sub
これで、エディットボックスに文字を入力してボタンを押すと、
それをUNICODEに直して喋ってくれます。
MultiByteToWideCharはヘルプに載ってないので、定義されてないのかと思いましたが、既にされてました。
コード: 全て選択
Declare Function MultiByteToWideChar Lib "kernel32" (CodePage As Long, _
dwFlags As Long,lpMultiByteStr As String, cchMultiByte As Long, _
lpWideCharStr As String,cchWideChar As Long)As Long
こんな、コードしか載せられなくてすいません。
また、何か改善できる所があったら、書こうと思います。
今後とも宜しくお願いします。ありがとうございました。
Re:テキスト読み上げについて
Posted: 2006年3月20日(月) 18:30
by 地武太地部右衛門
ゲストさん、M.Kさん、返信ありがとうございます。
私も調査/実験中だったのですが、全然進んでませんでした。
しかし、M.Kさんのコードで、確かに喋らす事が出来ました。
で、私も微力ながらボタン部分を改造したコードを載せます。
まずエディットボックスをウインドウに作っておいてください。
コード: 全て選択
Sub MainWnd_CommandButton1_Click()
Dim hEdit As Long
Dim LenEdit As Long
Dim EditStr As String
Dim spkText As String
hEdit = GetDlgItem(hMainWnd,EditBox1)
LenEdit = GetWindowTextLength(hEdit) +1
If LenEdit = 1 Then
MessageBox(0,"文字が入力されてないよ!","エラー",MB_ICONSTOP or MB_TOPMOST)
ExitSub
End If
EditStr = ZeroString(LenEdit)
GetWindowText(hEdit,StrPtr(EditStr),LenEdit)
MultiByteToWideChar(0,0,EditStr,LenEdit,StrPtr(spkText),LenEdit)
VText->StopSpeaking()
VText->Speak(spkText)
End Sub
これで、エディットボックスに文字を入力してボタンを押すと、
それをUNICODEに直して喋ってくれます。
MultiByteToWideCharはヘルプに載ってないので、定義されてないのかと思いましたが、既にされてました。
コード: 全て選択
Declare Function MultiByteToWideChar Lib "kernel32" (CodePage As Long, _
dwFlags As Long,lpMultiByteStr As String, cchMultiByte As Long, _
lpWideCharStr As String,cchWideChar As Long)As Long
こんな、コードしか載せられなくてすいません。
また、何か改善できる所があったら、書こうと思います。
今後とも宜しくお願いします。ありがとうございました。
Re:テキスト読み上げについて
Posted: 2006年3月20日(月) 18:32
by 地武太地部右衛門
すいません、なぜか二重投稿になってしまいました。
Re:テキスト読み上げについて
Posted: 2006年3月20日(月) 18:38
by NoWest
あんまり、深く考えないで書き込んでいますが、
わざわざ、ANCIIコードからUnicodeへ変換しなくても
SendMessageWでエディットボックスから文字列を取得すれば良いのではないでしょうか?
試してないんで何とも言えませんが、多分直接Unicodeを取得できると思います。
だからといってWindows95,98はうまく動く保障は無いですが、、、
P.S.
いい加減な情報を書き込んでしまったので
先ほど実験しましたところ、Unicodeでの取得を確認しました。
あと、SendMessageWよりGetWindowTextWの方が楽ですね。
コード: 全て選択
Declare Function GetWindowTextW Lib "user32" (hWnd As HWND, lpString As *WCHAR, nMaxCount As Long) As Long
Dim buf[255] As WCHAR
GetWindowTextW(GetDlgItem(hMainWnd,EditBox1),buf,256)
Re:テキスト読み上げについて
Posted: 2006年3月20日(月) 18:40
by M.K
こんばんは、
うちもエディットボックスの内容をしゃべらせることが出来ましたので報告しておきます。
>今後とも宜しくお願いします。
こちらこそ、よろしくお願いします。
英語の読み上げ
Posted: 2006年9月24日(日) 14:17
by あおぞら
お世話様です。
クリップボード経由や一時ファイルを使って、外部ソフトに英語や日本語を読ませておりましたが、お蔭様で単独で日本語を喋らせる事ができそうです。ありがとうございました。
英語も読ませたいと捜索中ですが、まだまだ、たどりつけそうもありません。
対処方法をご伝授頂ければ幸いです。
読み上げ
Posted: 2006年9月24日(日) 17:29
by 西野孝雄
私もこれ試しましたが、バグがありませんか?
NoWestさんの投稿も参考にして、ボタン部分を以下のようなコードにしましたが
デバッグ実行にすると、プロジェクト名.abpの
DispatchMessage(msgMain)の所でアクセス違反がおきます。
リリースコンパイルでは問題なく読んでくれるけど。
os xp home sp2
AB 4.13
コード: 全て選択
Sub MainWnd_CommandButton1_Click()
Dim buf[255] As WCHAR
GetWindowTextW(GetDlgItem(hMainWnd,EditBox1),buf,256)
If MakeStr(buf) = "" Then
MessageBox(0,"文字が入力されてません!","エラー",MB_ICONSTOP or MB_TOPMOST)
Exit Sub
End If
VText->StopSpeaking()
VText->Speak(buf)
End Sub
>あおぞらさん
日本語、英語以外の言語や、音声スピード、高さなんかも調整できるはずだと思う
(他の音声読み上げソフトがそうなってるので)けど、私もやり方は分かりません。
情報が少ないですよね。
英語の読み上げ
Posted: 2006年9月27日(水) 23:03
by あおぞら
お世話様です。
エラーになりにくいように、配列のサイズを大きくして使っております。
あと少し付け加えるだけで、他の言語も使えるはずと情報収集中。