回 帖 发 新 帖 刷新版面

主题:关于人声消除,这里有源代码

这个好象是天津中学的一个同学写的,希望水能给解释以下为什么。
(纯pascal哦)
Program vocal_remover;
var fp1, fp2: text;
    inf, ouf: string;
    hd, sz: string[4];
    ch: char; i: longint;
    j: integer; a1, a2, a1n, a2n: longint;
    tmp, fsz, riffsz, chucksz, datasz, sprt, dwavbs, ftsz: longint;
    wfmttag, channel, wblkagn, bits: word;

begin
  writeln('Vocal Remover 0.01 By zzc');
  if ParamCount>1 then begin
    inf:=ParamStr(1); ouf:=ParamStr(2);
  end;
  if ParamCount<2 then begin
    write('Input Filename: '); readln(inf);
    write('Output Filename: '); readln(ouf);
  end;
  if (inf='') or (ouf='') then begin
    if inf='' then writeln('Error: No input file!');
    if ouf='' then writeln('Error: No output file!');
    exit;
  end;
  assign(fp1,inf); assign(fp2,ouf);
  {$I-} reset(fp1);
  {$I+} if ioresult<>0 then begin
    writeln('Cannot open ',inf,'!'); exit; end;
  {$I-} rewrite(fp2);
  {$I+} if ioresult<>0 then begin
    writeln('Cannot write ',inf,'!'); close(fp1); exit; end;
  writeln('Start checking files...');
  riffsz:=0;
  for i:=1 to 4 do begin
    read(fp1,ch); hd:=hd+ch; end;
  if hd<>'RIFF' then begin
    writeln('This is not a standard RIFF file!');
    close(fp1); close(fp2); erase(fp2); exit;
  end;
  for i:=1 to 4 do
    read(fp1,sz[5-i]);
  for i:=1 to 4 do riffsz:=(riffsz*256)+ord(sz[i]);
  hd:=''; for i:=1 to 4 do begin
    read(fp1,ch); hd:=hd+ch; end;
  If hd<>'WAVE' then begin
    writeln('This is not a wave file!');
    close(fp1); close(fp2); erase(fp2); exit; end;
  hd:=''; for i:=1 to 4 do begin
    read(fp1,ch); hd:=hd+ch; end;
  If hd<>'fmt ' then begin
    writeln('This is a compressed wave file!');
    close(fp1); close(fp2); erase(fp2); exit; end;
  for i:=1 to 4 do
    read(fp1,sz[5-i]);
  for i:=1 to 4 do chucksz:=(chucksz*256)+ord(sz[i]);
  for i:=1 to 2 do begin
    read(fp1,ch); sz[i]:=ch;
  end;
  wfmttag:=ord(sz[2])*256+ord(sz[1]);
  if wfmttag<>1 then begin
    writeln('This is not a Microsoft PCM file!');
    close(fp1); close(fp2); erase(fp2); exit; end;
  for i:=1 to 2 do begin
    read(fp1,ch); sz[i]:=ch;
  end;
  channel:=ord(sz[2])*256+ord(sz[1]);
  if channel<>2 then begin
    writeln('This program can only process stereo wave files!');
    close(fp1); close(fp2); erase(fp2); exit;
  end;

//note
  for i:=1 to 4 do
    read(fp1,sz[5-i]);
  for i:=1 to 4 do sprt:=(sprt*256)+ord(sz[i]);
  for i:=1 to 4 do
    read(fp1,sz[5-i]);
  for i:=1 to 4 do dwavbs:=(dwavbs*256)+ord(sz[i]);
  for i:=1 to 2 do begin
    read(fp1,ch); sz[i]:=ch;
  end;
  wblkagn:=ord(sz[2])*256+ord(sz[1]);
  for i:=1 to 2 do begin
    read(fp1,ch); sz[i]:=ch;
  end;
  bits:=ord(sz[2])*256+ord(sz[1]);
  if (bits<>16) and (bits<>8) then begin
    writeln('This program can only process 8 bit or 16 bit wave files!');
    close(fp1); close(fp2); erase(fp2); exit;
  end;
  for i:=1 to chucksz-16 do begin
    read(fp1,ch); end; hd:='';
  for i:=1 to 4 do begin
    read(fp1,ch); hd:=hd+ch; end;
  if hd<>'data' then begin
    for i:=1 to 4 do
      read(fp1,sz[5-i]);
    for i:=1 to 4 do ftsz:=(ftsz*256)+ord(sz[i]);
    for i:=1 to ftsz do
      begin read(fp1,ch); end;
    hd:=''; for i:=1 to 4 do begin
    read(fp1,ch); hd:=hd+ch; end;
  end;
    if hd<>'data' then begin
      writeln('Error: No data struct!');
      close(fp1); close(fp2); erase(fp2); exit; end;
   for i:=1 to 4 do
    read(fp1,sz[5-i]);
  for i:=1 to 4 do datasz:=(datasz*256)+ord(sz[i]);

回复列表 (共5个回复)

沙发

writeln('Start processing file...');
  sz:='';
  write(fp2,'RIFF');
  tmp:=datasz+40;
  for i:=1 to 4 do begin
    write(fp2, chr(tmp mod 256));
    tmp:=tmp div 256;
  end;
  write(fp2,'WAVEfmt ');
  write(fp2,chr(16),chr(0),chr(0),chr(0));
  write(fp2,chr(wfmttag mod 256)); write(fp2, chr(wfmttag div 256));
  write(fp2,chr(channel mod 256)); write(fp2, chr(channel div 256));
  tmp:=sprt;
  for i:=1 to 4 do begin
    write(fp2, chr(tmp mod 256));
    tmp:=tmp div 256;
  end;
  tmp:=dwavbs;
  for i:=1 to 4 do begin
    write(fp2, chr(tmp mod 256));
    tmp:=tmp div 256;
  end;
  write(fp2,chr(wblkagn mod 256)); write(fp2, chr(wblkagn div 256));
  write(fp2,chr(bits mod 256)); write(fp2, chr(bits div 256));
  write(fp2,'data');
  tmp:=datasz;
  for i:=1 to 4 do begin
    write(fp2, chr(tmp mod 256));
    tmp:=tmp div 256;
  end;
  for i:=1 to datasz do begin
    read(fp1,sz[(i-1) mod 4+1]);
    if (i mod 4 =0) and (bits=16) then begin
      if ord(sz[2])*256+ord(sz[1])<32768 then a1:= (ord(sz[2]) mod 128)*256+ord(sz[1])
        else a1:=-(65535-(ord(sz[2])*256+ord(sz[1])))-1;
      if ord(sz[4])*256+ord(sz[3])<32768 then a2:= (ord(sz[4]) mod 128)*256+ord(sz[3])
        else a2:=-(65535-(ord(sz[4])*256+ord(sz[3])))-1;
      a1n:=a1-a2;
      a2n:=a2-a1;
      if a1n>32767 then a1n:=32767;
      if a1n<-32768 then a1n:=-32768;
      if a2n>32767 then a2n:=32767;
      if a2n<-32768 then a2n:=-32768;
      if a1n<0 then a1n:=a1n+1+65535;
      sz[1]:=chr(a1n mod 256); sz[2]:= chr(a1n div 256);
      if a2n<0 then a2n:=a2n+1+65535;
      sz[3]:=chr(a2n mod 256); sz[4]:= chr(a2n div 256);
      write(fp2,sz[1],sz[2],sz[3],sz[4]);
    end;
    if (i mod 2=0) and (bits=8) then begin
      a1:=ord(sz[(i-1) mod 4])-128; a2:=ord(sz[(i-1) mod 4+1])-128;
      a1n:=a1-a2; a2n:=a2-a1;
      if a1n>127 then a1n:=127;
      if a1n<-128 then a1n:=-128;
      if a2n>127 then a2n:=127;
      if a2n<-128 then a2n:=-128;
      sz[(i-1) mod 4]:=chr(a1n+128); sz[(i-1) mod 4+1]:=chr(a2n+128);
      write(fp2,sz[(i-1) mod 4], sz[(i-1) mod 4+1]);
    end;
  end;
  close(fp1); close(fp2);
  writeln('Done processing file!');
end.

板凳

什么叫人生消除??

3 楼

不理解!

4 楼

效果做的还不错
所谓人声消除, 就是把音乐里人声去掉

5 楼


怎么运行后整个文件都消除了?

我来回复

您尚未登录,请登录后再回复。点此登录或注册