我已将组合中用到的0到500的关键数的语音都录好了。我希望实现通过实收金额框中显示出来的金额能够让电脑自动读出来并播放出去。
我初步的想法是为了速度能够保证实时性,先将所有的音块都读到内存中,以备调用,这样速度够块,总大小我看了不到8M,依目前的电脑配置应该问题不大。然后做个函数来自动根据金额的数值对音块文件进行组合,形成一个新的音块,然后用播放器播放。这是我的思路。但是还没有写出源程序来。请各位老师指点一下,这个思路有没有问题,或者有没有能实现这个功能的现成的代码可以提供。谢!
我录好的语音如下(因为收费的数量一定是五的倍数所以...):
零
五
一十
一十五
二十
...
一百
二百
三百
四百
五百
收费金额
开始计时
结束计时
我初步的想法是为了速度能够保证实时性,先将所有的音块都读到内存中,以备调用,这样速度够块,总大小我看了不到8M,依目前的电脑配置应该问题不大。然后做个函数来自动根据金额的数值对音块文件进行组合,形成一个新的音块,然后用播放器播放。这是我的思路。但是还没有写出源程序来。请各位老师指点一下,这个思路有没有问题,或者有没有能实现这个功能的现成的代码可以提供。谢!
我录好的语音如下(因为收费的数量一定是五的倍数所以...):
零
五
一十
一十五
二十
...
一百
二百
三百
四百
五百
收费金额
开始计时
结束计时
procedure TSoundThread.PlaySoundNum(ANum: Double);
var
NumSound:string;
iValue,Value,iDotPos,i:integer;
strValue:string;
begin
try
if ANum<0.0 then exit;
sndPlaySoundA('SOUND_FK', SND_SYNC or SND_RESOURCE);
strValue:=floattostr(ANum);
iDotPos:=pos('.',strValue);
//百位
if iDotPos=0 then
iValue:=strToInt(strValue)
else
iValue:=strtoint(copy(strValue,0,iDotPos-1));
if iValue>99 then
begin
Value:=iValue div 100;
if Value in [1..9] then
begin
NumSound:=NUMSOUNDARRAY[Value];
sndPlaySoundA(pchar(NumSound), SND_SYNC or SND_RESOURCE);
sndPlaySoundA('NUM_BAI', SND_SYNC or SND_RESOURCE);
iValue:=iValue mod 100;
end;
end;
//十位
if iValue>10 then
begin
value:=iValue div 10;
if Value in [1..9] then
begin
NumSound:=NUMSOUNDARRAY[Value];
sndPlaySoundA(pchar(NumSound), SND_SYNC or SND_RESOURCE);
sndPlaySoundA('NUM_TEN', SND_SYNC or SND_RESOURCE);
iValue:=iValue mod 10;
end;
end;
//个位
if iValue>0 then
begin
NumSound:=NUMSOUNDARRAY[iValue];
sndPlaySoundA(pchar(NumSound), SND_SYNC or SND_RESOURCE);
end;
//是否有小数点
if iDotPos>0 then
begin
sndPlaySoundA('DOT', SND_SYNC or SND_RESOURCE);
strValue:=copy(strValue,iDotPos+1,length(strValue)-iDotPos);
for i:=1 to length(strValue) do
sndPlaySoundA(pchar(NUMSOUNDARRAY[strtoint(strValue[i])]), SND_SYNC or SND_RESOURCE);
end;
// sndPlaySoundA('NUM_UNIT', SND_SYNC or SND_RESOURCE);
except
Terminate;
end;我的是三位啊, NUMSOUNDARRAY:array[0..9] of string=('NUM_ZERO','NUM_ONE','NUM_TWO','NUM_THREE','NUM_FOUR','NUM_FIVE','NUM_SIX','NUM_SEVEN','NUM_EIGHT','NUM_NINE');
引用这个单元
MMSYSTEM
你好在吗
感谢这几天您的答复,关于语音报价系统的问题,我还有不明白的地方希望您能指点一下
我做好了语音文件后要怎么做才能使用你前面发的那段代码啊,我具体要做什么?能详细点说说吗?
lwk_hlj 再请教一下,那个sndPlaySoundA函数中,第一个参数是什么啊,是声音文件的路径吗?我看好象不是吧,那么如果不是的话,如果播放指定的文件呢.
此外,我这里有播音员录制好的0-9等语音文件,可以免费下载,希望这个对你有一点帮助:
http://www.bluespace.com.cn/koodoo/download_source.htm
点击“数字语音文件 NumberVoc (92K) 点击下载”。
`还有我使用sndPlaySoundA函数播放声音的话,要如何用啊,第一个参数好象不是声音文件的路径啊?有没有详细的使用说明啊?
详细的说明参考微软的MSDN,比如你可查waveOutOpen()函数。