超难问题...用DELPHI将两个WAV文件和成一个(100分)

  • 主题发起人 主题发起人 Alex_Y
  • 开始时间 开始时间
A

Alex_Y

Unregistered / Unconfirmed
GUEST, unregistred user!
将两个WAV文件合成一个WAV文件:
例: 一个WAV文件是: "你好!", 一个WAV文件是:"欢迎光临!",如何将两个语音文件合
成一个WAV文件"你好!欢迎光临!".
 
wav的格式不一样,具体问题要具体判断.
可以用cooledit工具来合并。
据说copy a.wav+b.wav c.wav也可以,但我没成功过。
最简单是将多个wav写个.RC文件,编译成一个资源文件。
可以研究一下wav格式,格式一样,就很简单,直接去掉header然后连接就可以了.
 
你知道的这些信息我也知道啊!
1.我想要WAV文件的结构数据 HEAD结构,数据结构,尾结构
2.我想用DELPHI来编写,虽然有类似的软件但我想自己编.
3.如果哪位大侠有源码,非常感谢,拿给我研究一下谢谢谢谢.
 
到http://go4.163.com/lovejingtao/站点上有有关wav文件方面的信息
 
提供一个线索:
我曾经看到有个控件,可将多个WAV捆绑成一个播放。
 
你想在软件里面使用中文语音?不用合并成一个wav文件,在回放的时候用流来合成就可以
简单地说就是顺序连起来就可以了,但是注意音频格式
 
为什么不可以试试依次放两个文件呢?中间的间隔是听不出来的吧。
 
可以听出来,以前试过,我的原因:
因为我们是给中国银行做软件(是"中国银行"),做电话银行:比如你在上海的话,
打电话95566就会播报:
"你好欢迎光临..........,1对私业务,2对公业务........"
YOU PRESS ONE
"请输入XX位帐号......."正确输入帐号和密码会播报:
"......1,外汇买卖请按2,代收付业务请按x(代收付是代收电话费)...."
我讲的比较乱,但是很容易理解,就是通过电话做外汇买卖或是炒股,但是在这里面会
有很多语音需要组合,所以........
 
你可以用调用函数啊,变量为文件名,试试罗。
 
呵呵!给你一个原码吧.

可以这样调用:MergeWaves('a.wav,b.wav,c.wav','c:/temp/target.wav');

procedure MergeWavs(FromFiles,ToFile:string; Owerrite:boolean=True);
//如果owerrite=false则建立新文件
var
f:file;
s:string;
yeni:boolean;
filesizex:integer;
liste:TStringList;
i:integer;

function GetBinaryValue(ix:cardinal):string;
var
intl: cardinal;
ch: array[1..4] of char absolute intl;
begin
intl:=ix;
result:=ch;
end;

procedure BlockToBlock(FromFileName:string; startx,lenx:integer);
var
FromF: file;
NumRead, NumWritten: Integer;
Buf: array[1..2048] of Char;
TotalWritten:Integer;
begin
if FromFileName='' then Exit;
if not FileExists(FromFileName) then
begin
ShowMessage('File not found.' + #13 + FromFileName);
Exit;
end;
AssignFile(FromF, FromFileName);
Reset(FromF, 1);
TotalWritten:=0;
if startx > 1 then Seek(FromF,startx-1);
repeat
BlockRead(FromF, Buf, SizeOf(Buf), NumRead);
if lenx>0 then
if TotalWritten+numread>lenx then numread:=Lenx-TotalWritten;
BlockWrite(f, Buf, NumRead, NumWritten);
inc(TotalWritten,NumWritten);
until (NumRead = 0) or (NumWritten <> NumRead);
CloseFile(FromF);
end;

begin

AssignFile(f, ToFile);
if ( Owerrite or (not FileExists(ToFile)) ) then
begin
ReWrite(f,1);
Yeni:=True;
end else begin
Reset(f, 1);
Seek(f,filesize(f));
Yeni:=False;
end;

liste:=TStringList.create;
liste.CommaText:=FromFiles;

for i:=0 to liste.Count-1 do
if ((Yeni) and (i=0))
then BlockToBlock(Trim(liste),0,0)
else BlockToBlock(Trim(liste),45,0);

CloseFile(f);
AssignFile(f, ToFile);
Reset(f,1);
FileSizex:= FileSize(f);

s:=GetBinaryValue(filesizex-8);
Seek(f,4);
BlockWrite(f, s[1],length(s));

s:=GetBinaryValue(filesizex-44);
Seek(f,40);
BlockWrite(f, s[1],length(s));

CloseFile(f);

end;
 
后退
顶部