ついでにAquesTalk2も使ってみる
laquestalk - AquesTalk Sample Code for HSP3
http://lhsp.s206.xrea.com/works/other.html
情報元
HSPソースフォルダにAquesTalk2.dllも置いて
更にaqtk2-win-evaフォルダにあるphontフォルダを中身ごと置いたとして
#ifndef AqKanji2Koe
#define AqKanji2Koe
#uselib "AqKanji2Koe.dll"
#cfunc AqKanji2Koe_Create "_AqKanji2Koe_Create@8" sptr,var
#func AqKanji2Koe_Release "_AqKanji2Koe_Release@4" int
#func AqKanji2Koe_Convert "_AqKanji2Koe_Convert@16" int,sptr,var,int
#endif
#uselib "AquesTalk2.dll"
#cfunc AquesTalk2_Synthe "AquesTalk2_Synthe" str, int, var, int
#func AquesTalk2_FreeWave "AquesTalk2_FreeWave" int
dir="aq_dic"
pErr=0
hAqKanji2Koe=AqKanji2Koe_Create(dir,pErr)
if hAqKanji2Koe=0 {dialog "インスタンス生成に失敗("+pErr+")":end}
title "インスタンスハンドル="+hAqKanji2Koe
mes "音声速度"
iSpeed=75
input iSpeed,64,20
iSpeed_id=stat
dirlist flist,"phont\\*.phont",1 //phontフォルだ指定
notesel flist
if notemax=0 {dialog "phontファイルが見つかりません\nデフォルトPhontのみを使用します"}
noteadd "DLLのデフォルトPhont",0,0
sdim phont,1024*20,notemax
repeat notemax
noteget fname,cnt
exist "phont\\"+fname
if strsize>0 {
bload "phont\\"+fname,phont(cnt),strsize
phont_varptr(cnt)=varptr(phont(cnt)) //phontファイル読み込みアドレス
}else{
phont_varptr(cnt)=0 //ファイルが無いならデフォルトPhontを指定
}
loop
pos 5,60
mes "ダブルクリックでPhont指定"
objsize 120,110
listbox phont_indx , 100 ,flist
phont_id=stat
#define WM_COMMAND 0x0111
oncmd gosub *_WM_COMMAND, WM_COMMAND
pos 200,100
kanji="あいうえお"
mesbox kanji,400,200
koe=""
pos 5,300
mes "音声記号列"
input koe,630,20
koe_id=stat
gosub *txtConvert
pos 200,100-20
objsize 50,20
button gosub "再生" , *play_wave
stop
#deffunc exit onexit
mmstop
if hAqKanji2Koe {
AqKanji2Koe_Release hAqKanji2Koe
}
if ptWavedata {
AquesTalk2_FreeWave ptWavedata
}
return
*_WM_COMMAND
if ( ( ( wparam >> 16 ) & 0xFFFF ) == 0x0002 ) {
noteget fname,phont_indx
title "phont="+fname+" ポインタ="+phont_varptr(phont_indx)
}
return
*txtConvert
koesize=strlen(kanji)*5 //入力文字列よりバッファが必要になるので適当に5倍
sdim koe,koesize
AqKanji2Koe_Convert hAqKanji2Koe,kanji,koe,koesize
if stat {dialog "音声記号列に変換に失敗("+stat+")":end}
objprm koe_id,koe
return
*play_wave
gosub *txtConvert
; 前のWAVEデータを開放
if ptWavedata : AquesTalk2_FreeWave ptWavedata
iSpeed = limit(iSpeed,50,300)
objprm iSpeed_id,iSpeed
/*
音声波形を生成
p1に音声出力したいテキスト文章、p2に発話速度値、p3に
WAVEデータのサイズが返る変数を指定。
p4にphontデータの先頭アドレスを指定します。このDLLのデフォルトPhontを用いるときは0を指定します。
戻り値でWAVEデータのアドレスポインタが返る。
*/
ptWavedata = AquesTalk2_Synthe(koe, iSpeed, wavesize,phont_varptr(phont_indx))
if ptWavedata = 0 : dialog "音声波形の生成に失敗しました。(エラーコード: "+wavesize+")", 1, "エラー" : stop
; WAVEデータを生成
sdim wavedata, wavesize
dupptr wavedata, ptWavedata, wavesize
; mmload命令で再生できるようメモリ上のWAVEデータを
; メモリストリームでファイル化
memfile wavedata, 0, wavesize
; 読み込み再生
mmload "mem:.wav", 0
mmplay 0
return
phontが無ければデフォルトが設定される