用Delphi随机产生60000个不重复的数字,然后用提供的0-9这十个个位数的声音,文件名分别是:0.wav,1.wav,..........,然后用产生的数字去组合声音。比如:58478,产生一个文件名为58478.wav的声音文件,而声音内容则只是单纯的58478这五个数就可以,就是用5.wav,8.wav,4.wav,7.wav,8.wav这些声音连接起来的,不用向日常生活中是:5万8千4百7十8这么读,请问可不可以???

解决方案 »

  1.   

    声音文件做成MP3,直接用流连起来就可以了,Wav的话要写文件头,相对麻烦点,找wav文件头格式看下就明白了。
      

  2.   

    那你就把5678,每次取一个字符,然后加上.wav 每次播放一个wav文件,连续拨四个文件不久行了吗?
      

  3.   

    这种东西以前我也想做过!后来感觉很难!语音语调都是问题!我记得我们公司后来是买啦个硬件才搞定,o(∩_∩)o...哈哈,就是医院门诊挂号用的报价器!o(∩_∩)o...哈哈!可以看看有没有什么不要钱的语音库,试试!不过我是没高出来,不过都是几年前的事情啦!o(∩_∩)o...哈哈!
      

  4.   

    WAV的文件头好像是58个字节吧!查查,记不清楚了。你把5,6,7,9这几个文件的文件头去掉,然后用文件流把它组合成一个文件!在加一个文件头就可以了。这样新生成的文件直接播放就行了!感觉你这是像做中国移动的查费系统呢!呵呵!
      

  5.   

    使用朗读引擎看能否更通用?
    下载 “微软TTS 语音朗读引擎” 试试看。
      

  6.   

    做资源文件就OK资源是存放在扩展名.RES的文件里的二进制数据结构,在DELPHI中资源文件可以使用图象编辑器来制作(IMAGEEDITOR),或者使用其他的工具。如:BORLAND公司提供的RADPACKFORDELPHI中的RESOURCEWORKSHOP来创建。资源文件中通常存放的是应用程序可以随时存取的一些对象,包括:ICON、CURSOR、BITMAP、FONT等近十种。大部分的资源在通常的情况下可以保留在磁盘当中,直到程序需要使用它们时才将其调入,可以大大的节省内存资源,同样,资源文件也是可以共享的,即:多个程序可以共享一个资源文件,进而减少了在应用程序之间代码重复的现象,使程序的代码得到很大的优化,因此在应用程序中使用资源文件有独立制作、方便、随时修改而不需要对应用程序代码做任何修改的好处。
      

  7.   

    同意四楼,把0-9个wav直接做到资源文件中然后用playsound放出来,可以减少两个音之间的停顿感
      

  8.   

    公司用TTS ,声音比较自然,你那种方法语音比较僵硬死板,似乎微软也提供开发工具,你可以找找看
      

  9.   

    以下代码直接写的未经过测试,好运
    procedure TForm1.Button1Click(Sender: TObject);
    (*
      Path=输入1.wav 2.wav 的目录路径
      FileStr=数字 521871
      OutPath=输出合成后的目录
    *)
      function MakeWavFile(Path,FileStr,OutPath: string): Boolean;
      type
        TWavFormat = packed record
          ChunkID: array[0..3] of Char;     {'RIFF'}
          ChunkSize: Longword;                  {size-8}
          Format: array[0..3] of Char;      {'WAVE'}
          SubChunk1ID: array[0..3] of Char; {'fmt '}
          SubChunk1Size: Longword;              {hex10}
          AudioFormat: Word;                    {hex 01}
          NumOfChannels: Word;                  {1 mono, 2 stereo}
          SampleRate: Longword;                 {number of samples/sec}
          ByteRate: Longword;                   {samplerate* num of channels*bytes per (mono) sample}
          BytesperSample: Word;                 {size of (mono) sample}
          BitsPerSample: Word;                  {BytesperSample *8}
          SubChunk2ID: array[0..3] of Char; {'data'}
          SubChunk2Size: Longword;              {number of data bytes}
        end;
      var
        WavFormat: array of TWavFormat;
        FileHandle:array of THandle;
        FileName:array of string;
        FileStream:array of TFileStream;
        ChunkSize:array of Integer;
        NewFormat:TWavFormat;
        i:integer;
        iCount:integer;
        Run:Boolean;
      begin
        Result := False;
        iCount:=Length(FileStr);    SetLength(FileName,iCount);
        for i := 1 to iCount do
        begin
          FileName[i-1]:=Path+FileStr[i]+'.wav';
          if not FileExists(FileName[i-1]) then Exit;
        end;
        SetLength(WavFormat,iCount);
        SetLength(FileHandle,iCount);
        SetLength(FileStream,iCount);
        SetLength(ChunkSize,iCount);
        for i := 0 to iCount-1 do  FileHandle[i] := _lopen(PAnsiChar(FileName[i]), OF_READ or OF_SHARE_DENY_NONE);
        Run:=False;
        for i := 0 to iCount - 1 do    Run:=Run or (Integer(FileHandle[i]) <= 0);
        if Run then
        begin
          for i := 0 to iCount - 1 do _lclose(FileHandle[i]);
          Exit;
        end;
        for i := 0 to iCount - 1 do  FileStream[i] := TFileStream.Create(FileHandle[i]);
        try
          for i := 0 to iCount - 1 do
          if FileStream[i].Read(WavFormat[i], SizeOf(TWavFormat)) <> SizeOf(TWavFormat) then Exit;
          if WavFormat[0].ChunkID <> 'RIFF' then Exit;
          if WavFormat[0].SubChunk2ID <> 'data' then Exit;
          for i := 0 to iCount - 1 do
          begin
            ChunkSize[i] := WavFormat[i].SubChunk2Size;
            WavFormat[i].ChunkSize := 0;
            WavFormat[i].SubChunk2Size := 0;
          end;
          Run:=True;
          for i := 1 to iCount - 1 do Run:=Run or (CompareMem(@WavFormat[0], @WavFormat[i], SizeOf(TWavFormat)));{格式不同}
          if Not Run then Exit;
          with TMemoryStream.Create do
          try
            NewFormat:=WavFormat[0];
            NewFormat.ChunkSize:=0;
            NewFormat.SubChunk2Size := 0;
            for i := 0 to iCount - 1 do
            begin
              NewFormat.ChunkSize := NewFormat.ChunkSize+ChunkSize[i];
              NewFormat.SubChunk2Size := NewFormat.SubChunk2Size+ChunkSize[i];
            end;
            NewFormat.ChunkSize := NewFormat.ChunkSize + SizeOf(NewFormat) - 8;
            Write(NewFormat, SizeOf(TWavFormat));
            for i := 0 to iCount - 1 do
            CopyFrom(FileStream[i], ChunkSize[i]);
            try
              SaveToFile(OutPath+FileStr+'.wav');
            except
              Exit;
            end;
          finally
            Free;
          end;
        finally
          for i := 0 to iCount - 1 do  FileStream[i].Free;
        end;
        Result := True;
      end;
    begin
      with TStringList.Create do
      try
        Randomize;
        Clear; Sorted := True; Duplicates := dupIgnore;;
        while Count<60000 do Add(Format('%.5d',[Random(99999)]));
        for i := 0 to Count - 1 do
        MakeWavFile('c:\',Strings[i],'c:\CSDNDemo\');
      finally
        Free;
      end;
    end;