声音合成!!!!在线等待(100分)

  • 主题发起人 super_duck
  • 开始时间
S

super_duck

Unregistered / Unconfirmed
GUEST, unregistred user!
如:我分别有1,2,3,4,5的wav文件,在数据库中找到值“12345”,想把他们合成到一起
发出连贯的声音,以前的代码是这样的:
for i:=1 to edit1.GetTextLen-3do

begin

s:=copy(edit1.Text,4,5);
j:=copy(s,i,1);
if j='1' then

begin

PlaySound('d:/sound/1.wav',SND_APPLICATION,SND_FILENAME);
end;

if j='2' then

begin

PlaySound('d://sound//2.wav',SND_APPLICATION,SND_FILENAME);
end;

...
但这样发出的声音并不连贯啊,各位大哥帮忙想想办法啊!!
 
for i:=1 to edit1.GetTextLendo

begin

s:=trim(edit1.Text);
j:=copy(s,i,1);

PlaySound(pchar(j+'.wav'),SND_APPLICATION,SND_FILENAME);
end;

 
to 飘叶:
谢谢,好像效果还是不怎么好,这种方法是把几个wav文件一起播放还是一个一个的播放?
我是个初学者,请问trim是什么意思,它的用法?
 
trim是截除前后空格
wav文件当然是一个一个的播放
可能你有wav文件太长,找个编辑软件切割掉没有声音的部分
 
你可以调用 vfw 提供的函数,把多个 wav 文件合并成为一个 wav 文件
 
to 飘叶
谢谢
to garden_p
请问具体的用法
 
我正好刚研究完这个!!

虽然可以一个一个的播放,但有时您并不想这样,因为可能需要后台播放,如POS或其它
系统里的语音报价,你怎不能一直等到它们播放完了,然后再输入其它信息吧!!要是
钱数稍大点,说不定语音没报完价,顾客已经领着东西走多远了!!!
所有经过反复试验,我终于做出了一个合并WAV文件的程序。可把多个(现在还不能太多!)
WAV文件进行合并,然后一起播放。
需要吗??绝对源码!!联系我吧:snzdl@sina.com
记得把分都给我!!!
 


AVIStreamOpenFromFile
EditStreamCopy
EditStreamCut
EditStreamPaste
EditStreamSetInfo
EditStreamSetName
AVISaveV

这几个函数就可以搞定了,VFW可以对 WAV 进行剪切,张贴,复制的这些操作
但是如果你是要在程序你面实时、不可定的生成这些Wav ,我觉得性能上会有点,你是要做什么东西呀?
 
to to garden_p
我要做的事情很简单,总共7个字,如:“京A12345”,我要让计算机读出这几个字,
其中只有数字不同,我原来用的方法是把数字截取出来,一个一个的读,这样的效果
并不好啊,每个字中间有停顿,而且wav文件是编辑过的,把空白的地方都去掉了的,
现在就是想把字符串读的连贯,谢谢了。
 
如果这个工作在服务器段完成的话,建议不要采用合并 Wav 文件的方法,性能是个大问题
如果只是在客户端的话,就没有问题。

你也可以试试用
wavOut 的系列函数做一下,在 MSDN 里面都可以查得到,这些函数我没有用过,所以没法告诉
你具体怎么做。
 
经试验把编辑Wav 文件控制在0。25秒即可解决!!
 
这麻烦吗??看我写的这个函数吧!!!
(没有加入容错技术)


procedure LinkWave(waveFiles, NewWaveFile: string);//WaveFiles:原文件串(必须是完整路径);NewWaveFile:生成的文件名
var
Files:TStringList;
n1,n2,n3,n,WaveLen:Integer;
WaveFile,SoureFile:TFileStream;
a1,a2,a3:byte;
//联接WAV声音文件函数。程序源码:周栋梁
//调用方法:将所要联接的声音文件的完整路径用“,”号组成字符串。
begin

Files:=TStringList.Create;
Files.CommaText:=WaveFiles;
WaveFile:=TFileStream.Create(NewWaveFile,fmCreate);
SoureFile:=TFileStream.Create(Files.Strings[0],fmOpenRead);
//打开其中一个声音文件
WaveFile.CopyFrom(SoureFile,59);
//读取声音文件头
WaveLen:=0;
//记录声音长度
for n:=0 to Files.Count-1do

begin

SoureFile.Free;
SoureFile:=TFileStream.Create(Files.Strings[n],fmOpenRead);
SoureFile.Position:=54;
SoureFile.read(a1,1);
SoureFile.read(a2,1);
SoureFile.read(a3,1);
WaveLen:=WaveLen+(ord(a3)*65536)+(ord(a2)*256)+ord(a1);
SoureFile.Position:=59;
WaveFile.CopyFrom(SoureFile,SoureFile.Size-60);
end;

WaveFile.Position:=4;
n1:=(WaveFile.Size-8) div 65536;
n2:=(WaveFile.Size-8-n1*65536) div 256;
n3:=WaveFile.Size-8-n1-n2*256;
WaveFile.WriteBuffer(n3,1);
WaveFile.WriteBuffer(n2,1);
WaveFile.WriteBuffer(n1,1);

n1:=WaveLen div 65536;
n2:=(WaveLen-n1*65536) div 256;
n3:=WaveLen-n1-n2*256;
WaveFile.Position:=54;
WaveFile.WriteBuffer(n3,1);
WaveFile.WriteBuffer(n2,1);
WaveFile.WriteBuffer(n1,1);
WaveFile.Position:=46;
WaveFile.WriteBuffer(n3,1);
WaveFile.WriteBuffer(n2,1);
WaveFile.WriteBuffer(n1,1);
Files.Free;
WaveFile.Free;
SoureFile.Free;
end;




调用例子:
procedure TForm1.Button1Click(Sender: TObject);
begin

LinkWave('e:/1.wav,e:/2.wav','e:/ss.wav');
playsound('e:/ss.wav',0,0);//必须在DELPHI中播放,Windows播放器可能不认识生成的声音文件格式
end;

 
楼主咋了??不给分呢??
 
不好意思,刚出差回来,谢谢咯
 
多人接受答案了。
 
我要使用playsound这个涵数
在uses里面要加入什么呀
我的邮箱是:delphishen@sina.com 谢谢
 
顶部