📄 复件 progress.pas
字号:
unit Progress;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, Gauges, mSpeech, ExtCtrls;
type
TfrmProgress = class(TForm)
Gauge: TGauge;
btnCancel: TBitBtn;
dlgSave: TSaveDialog;
Speak1: TMSpeech;
Speak2: TMSpeech;
Timer: TTimer;
procedure FormShow(Sender: TObject);
procedure TimerTimer(Sender: TObject);
procedure Speak1Stop(Sender: TObject);
procedure Speak1Start(Sender: TObject);
procedure Speak2Start(Sender: TObject);
procedure Speak2Stop(Sender: TObject);
private
DestFileName: string;
public
procedure LinkWave(WaveFiles, NewWaveFile: string);
end;
var
frmProgress: TfrmProgress;
implementation
uses
TopEdit;
{$R *.dfm}
procedure TfrmProgress.FormShow(Sender: TObject);
begin
if dlgSave.Execute then
begin
DestFileName := dlgSave.FileName;
Timer.Enabled := True;
end
else
PostMessage(Self.Handle, WM_Close, 0, 0);
end;
procedure TfrmProgress.TimerTimer(Sender: TObject);
var
I: Integer;
Nowstr: Content;
sr: TSearchRec;
begin
Timer.Enabled := False;
Speak1.SelectEngine('Mary');
//Speak2.SelectEngine('IBM Female Voice SC');
Speak2.SelectEngine('Sam');
Speak1.FileName := ExtractFilePath(Application.ExeName) + 'temp.wav';
Speak1.Text.add('Start! ' );
Speak1.Speak;
Speak1.FileName := ExtractFilePath(Application.ExeName) + 'word.wav';
Speak2.FileName := ExtractFilePath(Application.ExeName) + 'chinese.wav';
//exit;
for I := 0 to CurrentString.Count - 1 do
begin
Nowstr := frmShow.IniString(CurrentString.Strings[I]);
while (true) do
if Speak2.Tag = 0 then
begin
Speak1.Speak(Nowstr.Words);
break;
end
else
begin
sleep(100);
Application.ProcessMessages;
end;
while (true) do
if (FindFirst(PChar(ExtractFilePath(Application.ExeName) + 'word.wav'),
faAnyFile, sr) = 0) and (sr.Size >=60) and (Speak1.Tag = 0) then
begin
//Speak2.Speak(Nowstr.Words + Nowstr.Chinese);
Speak2.Speak(Nowstr.Chinese);
break;
end
else
begin
sleep(100);
Application.ProcessMessages;
end;
while (true) do
if (FindFirst(PChar(ExtractFilePath(Application.ExeName) + 'word.wav'),
faAnyFile, sr) = 0) and (sr.Size >=60) and (Speak1.Tag = 0)
and (FindFirst(PChar(ExtractFilePath(Application.ExeName) + 'chinese.wav'),
faAnyFile, sr) = 0) and (sr.Size >=60) and (Speak2.Tag = 0) then
begin
LinkWave(ExtractFilePath(Application.ExeName) + 'temp.wav, '
+ ExtractFilePath(Application.ExeName) + 'word.wav, '
+ ExtractFilePath(Application.ExeName) + 'chinese.wav', DestFileName);
CopyFile(PChar(DestFileName), PChar(ExtractFilePath(Application.ExeName)
+ 'temp.wav'), false);
Gauge.Progress = Trunc((I + 1)/CurrentString.Count*100);
break;
end
else
begin
sleep(100);
Application.ProcessMessages;
end;
end;
Close;
end;
procedure TfrmProgress.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);
for n := Files.Count - 1 downto 0 do
begin
if not FileExists(Files.Strings[n]) then
begin
FileCreate(Files.Strings[n]);
Files.Delete(n);
continue;
end;
SoureFile := TFileStream.Create(Files.Strings[n], fmOpenRead);
if Sourefile.Size <= 60 then
begin
SoureFile.Free;
Files.Delete(n);
continue;
end;
SoureFile.Free;
end;
SoureFile := TFileStream.Create(Files.Strings[0], fmOpenRead);
//打开其中一个声音文件
WaveFile.CopyFrom(SoureFile, 59); //读取声音文件头
WaveLen := 0; //记录声音长度
for n := 0 to Files.Count - 1 do
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 TfrmProgress.Speak1Stop(Sender: TObject);
begin
Speak1.Tag := 0;
end;
procedure TfrmProgress.Speak1Start(Sender: TObject);
begin
Speak1.Tag := 1;
end;
procedure TfrmProgress.Speak2Start(Sender: TObject);
begin
Speak2.Tag := 1;
end;
procedure TfrmProgress.Speak2Stop(Sender: TObject);
begin
Speak2.Tag := 0;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -