⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 复件 progress.pas

📁 轻轻松松背单词软件源码
💻 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 + -