我已将组合中用到的0到500的关键数的语音都录好了。我希望实现通过实收金额框中显示出来的金额能够让电脑自动读出来并播放出去。
我初步的想法是为了速度能够保证实时性,先将所有的音块都读到内存中,以备调用,这样速度够块,总大小我看了不到8M,依目前的电脑配置应该问题不大。然后做个函数来自动根据金额的数值对音块文件进行组合,形成一个新的音块,然后用播放器播放。这是我的思路。但是还没有写出源程序来。请各位老师指点一下,这个思路有没有问题,或者有没有能实现这个功能的现成的代码可以提供。谢!
我录好的语音如下(因为收费的数量一定是五的倍数所以...):


一十
一十五
二十
...
一百
二百
三百
四百
五百
收费金额
开始计时
结束计时

解决方案 »

  1.   

    呵呵,我把我的给你看看
    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');
      

  2.   

    lwk_hlj 你好,你在本问题中给我了一段代码.其中sndPlaySoundA函数是哪来的,是系统自带的吗?如果是如何引用,如果不是请给出代码好吗?还有各个关键字的语音文件我都制作好了,但是我没看出语音是如何播放出来的,例如,我录制好了各个关键字的语音,可是在这段代码中我没有看到在哪里引用这些文件啊.
      

  3.   

    系统自带的,
    引用这个单元
    MMSYSTEM
      

  4.   

    lwk_hlj 你指的做成资源文件是指将做好的语音WAV文件做成资源文件吗?那么请教如何做成资源文件啊,能否说的详细点呢?谢谢
      

  5.   

    lwk_hlj 
    你好在吗
    感谢这几天您的答复,关于语音报价系统的问题,我还有不明白的地方希望您能指点一下
    我做好了语音文件后要怎么做才能使用你前面发的那段代码啊,我具体要做什么?能详细点说说吗?
      

  6.   

    num_zero numzero_one等这些只是个字符串,你是如何让系统发出指定的声音的呀,就是说这些字符串是如何与语音文件建立对应关系的呀,具体要怎么做.
      

  7.   

    bluesen 你的网站我看过了,你这个东西是挺方便而且功能强大,但是是收费的吧.在这里发贴的都是互相帮助免费服务的.你的函数都是你们的系统自定的,并不是系统通用的.虽然你的实现过程看上去那么简单好用,可是还是要借助你说的那个开发平台啊.所以没什么用.对我也没有帮助啊.
    lwk_hlj 再请教一下,那个sndPlaySoundA函数中,第一个参数是什么啊,是声音文件的路径吗?我看好象不是吧,那么如果不是的话,如果播放指定的文件呢.
      

  8.   

    yuti,我只是展现一下接口设计,如果没有帮助那很遗憾。
    此外,我这里有播音员录制好的0-9等语音文件,可以免费下载,希望这个对你有一点帮助:
    http://www.bluespace.com.cn/koodoo/download_source.htm
    点击“数字语音文件 NumberVoc (92K) 点击下载”。
      

  9.   

    把这些文件放到内存当然会快很多,但最好用waveOut开头的一组函数来进行播放。
      

  10.   

    那请教waveOut系列函数播放声音和使用sndPlaySoundA函数播放声音有什么区别,哪个更方便更好用啊?
    `还有我使用sndPlaySoundA函数播放声音的话,要如何用啊,第一个参数好象不是声音文件的路径啊?有没有详细的使用说明啊? 
      

  11.   

    sndPlaySound不是只能对文件放音吗,内存放音就没辙了吧,当然他的特点是简单。waveOut系列函数的缺点的复杂,但可以实现精细的控制,内存放音自然不在话下。
    详细的说明参考微软的MSDN,比如你可查waveOutOpen()函数。
      

  12.   

    我的水平有限,想先用文件放音看效果怎么样?如果不行再用WAVEOUT系列函数.能否给个sndPlaySound的使用说明,我搜了两天了也没找到真正有用的详细说明