亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? texttospeechu.pas

?? softonline.dll中函數的使用,請見不同的例程,VB函數見VB例子,VC函數見VC例子,VFP函數見VFP的例子,BCB函數見BCB例子, Delphi函數見Delphi例子
?? PAS
字號:
unit TextToSpeechU;

//Uses SAPI 5.1 early bound Automation

interface

uses
  ActiveX,
{$ifdef CONDITIONALEXPRESSIONS}
  Variants,
{$endif}
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  Dialogs, ImgList, ActnList, StdCtrls, ComCtrls, ToolWin, OleServer,
  SpeechLib_TLB;

type
  TfrmTextToSpeech = class(TForm)
    lstProgress: TListBox;
    Label1: TLabel;
    cbVoices: TComboBox;
    Label2: TLabel;
    lstEngineInfo: TListBox;
    gbAttrs: TGroupBox;
    tbRate: TTrackBar;
    tbVolume: TTrackBar;
    Label4: TLabel;
    Label5: TLabel;
    lblMinSpeed: TLabel;
    lblMaxSpeed: TLabel;
    lblRate: TLabel;
    lblMaxVolume: TLabel;
    lblMinVolume: TLabel;
    ImageList1: TImageList;
    reText: TRichEdit;
    ToolBar1: TToolBar;
    btnPlay: TToolButton;
    btnPause: TToolButton;
    btnStop: TToolButton;
    Label6: TLabel;
    Label7: TLabel;
    SpVoice: TSpVoice;
    GroupBox1: TGroupBox;
    lblMinVU: TLabel;
    lblMaxVU: TLabel;
    lblVU: TLabel;
    ProgressBar: TProgressBar;
    lblVolume: TLabel;
    Label8: TLabel;
    memEnginePhonemes: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure cbVoicesChange(Sender: TObject);
    procedure btnPlayClick(Sender: TObject);
    procedure btnPauseClick(Sender: TObject);
    procedure btnStopClick(Sender: TObject);
    procedure SpVoiceAudioLevel(Sender: TObject; StreamNumber: Integer;
      StreamPosition: OleVariant; AudioLevel: Integer);
    procedure SpVoiceBookmark(ASender: TObject; StreamNumber: Integer;
      StreamPosition: OleVariant; const Bookmark: WideString;
      BookmarkId: Integer);
    procedure SpVoiceEndStream(Sender: TObject; StreamNumber: Integer;
      StreamPosition: OleVariant);
    procedure SpVoiceEnginePrivate(Sender: TObject; StreamNumber,
      StreamPosition: Integer; EngineData: OleVariant);
    procedure SpVoicePhoneme(Sender: TObject; StreamNumber: Integer;
      StreamPosition: OleVariant; Duration: Integer; NextPhoneId: Smallint;
      Feature: TOleEnum; CurrentPhoneId: Smallint);
    procedure SpVoiceSentence(Sender: TObject; StreamNumber: Integer;
      StreamPosition: OleVariant; CharacterPosition, Length: Integer);
    procedure SpVoiceStartStream(Sender: TObject; StreamNumber: Integer;
      StreamPosition: OleVariant);
    procedure SpVoiceViseme(Sender: TObject; StreamNumber: Integer;
      StreamPosition: OleVariant; Duration: Integer; NextVisemeId, Feature,
      CurrentVisemeId: TOleEnum);
    procedure SpVoiceVoiceChange(ASender: TObject; StreamNumber: Integer;
      StreamPosition: OleVariant;
      const VoiceObjectToken: ISpeechObjectToken);
    procedure SpVoiceWord(Sender: TObject; StreamNumber: Integer;
      StreamPosition: OleVariant; CharacterPosition, Length: Integer);
    procedure tbRateChange(Sender: TObject);
    procedure tbVolumeChange(Sender: TObject);
  private
    BeenPaused, StreamJustStarted: Boolean;
    OldSentencePos, OldSentenceLen: Integer;
    procedure SetTextHilite(FirstChar, Len: Integer);
    procedure SetTextStyle(FirstChar, Len: Integer; Styles: TFontStyles);
  public
    procedure Log(const Msg: String); overload;
    procedure Log(const Msg: String; const Args: array of const); overload;
  end;

var
  frmTextToSpeech: TfrmTextToSpeech;

implementation

{$R *.dfm}

{ TfrmTextToSpeech }

procedure TfrmTextToSpeech.Log(const Msg: String);
begin
  if not Assigned(lstProgress) then
    Exit;
  lstProgress.Items.Add(Msg);
  lstProgress.ItemIndex := lstProgress.Items.Count - 1
end;

procedure TfrmTextToSpeech.Log(const Msg: String; const Args: array of const);
begin
  Log(Format(Msg, Args))
end;

procedure TfrmTextToSpeech.FormCreate(Sender: TObject);
var
  I: Integer;
  SOToken: ISpeechObjectToken;
  SOTokens: ISpeechObjectTokens;
begin
  SendMessage(lstProgress.Handle, LB_SETHORIZONTALEXTENT, Width, 0);
  //Ensure all events fire
  SpVoice.EventInterests := SVEAllEvents;
  Log('About to enumerate voices');
  SOTokens := SpVoice.GetVoices('', '');
  for I := 0 to SOTokens.Count - 1 do
  begin
    //For each voice, store the descriptor in the TStrings list
    SOToken := SOTokens.Item(I);
    cbVoices.Items.AddObject(SOToken.GetDescription(0), TObject(SOToken));
    //Increment the descriptor reference count to ensure it doesn't get destroyed
    SOToken._AddRef;
  end;
  if cbVoices.Items.Count > 0 then
  begin
    cbVoices.ItemIndex := 0; //Select 1st voice
    cbVoices.OnChange(cbVoices); //& ensure OnChange triggers
  end;
  Log('Enumerated voices');
  Log('About to check attributes');
  tbRate.Position := SpVoice.Rate;
  lblRate.Caption := IntToStr(tbRate.Position);
  tbVolume.Position := SpVoice.Volume;
  lblVolume.Caption := IntToStr(tbVolume.Position);
  Log('Checked attributes');
end;

procedure TfrmTextToSpeech.FormDestroy(Sender: TObject);
var
  I: Integer;
begin
  //Release all the voice descriptors
  for I := 0 to cbVoices.Items.Count - 1 do
    ISpeechObjectToken(Pointer(cbVoices.Items.Objects[I]))._Release;
end;

procedure TfrmTextToSpeech.cbVoicesChange(Sender: TObject);
var
  SOToken: ISpeechObjectToken;
begin
  with lstEngineInfo.Items do
  begin
    Clear;
    SOToken := ISpeechObjectToken(Pointer(
      cbVoices.Items.Objects[cbVoices.ItemIndex]));
    SpVoice.Voice := SOToken;
    Add(Format('Name: %s', [SOToken.GetAttribute('Name')]));
    Add(Format('Vendor: %s', [SOToken.GetAttribute('Vendor')]));
    Add(Format('Age: %s', [SOToken.GetAttribute('Age')]));
    Add(Format('Gender: %s', [SOToken.GetAttribute('Gender')]));
    Add(Format('Language: %s', [SOToken.GetAttribute('Language')]));
    Add(Format('Reg key: %s', [SOToken.Id]));
  end
end;

procedure TfrmTextToSpeech.btnPlayClick(Sender: TObject);
begin
  if not BeenPaused then
    SpVoice.Speak(reText.Text, SVSFlagsAsync)
  else
  begin
    SpVoice.Resume;
    BeenPaused := False
  end
end;

procedure TfrmTextToSpeech.btnPauseClick(Sender: TObject);
begin
  if not BeenPaused then
    SpVoice.Pause;
  BeenPaused := True
end;

procedure TfrmTextToSpeech.btnStopClick(Sender: TObject);
begin
  SpVoice.Skip('Sentence', MaxInt)
end;

procedure TfrmTextToSpeech.SetTextHilite(FirstChar, Len: Integer);
begin
  reText.SelStart := FirstChar; //highlight word
  reText.SelLength := Len;
end;

procedure TfrmTextToSpeech.SetTextStyle(FirstChar, Len: Integer; Styles: TFontStyles);
begin
  with reText do
  begin
    Lines.BeginUpdate;
    try
      SelStart := FirstChar; //highlight word
      SelLength := Len;
      SelAttributes.Style := Styles; //apply requested style
      SelLength := 0; //unhighlight word
    finally
      Lines.EndUpdate
    end
  end
end;

procedure TfrmTextToSpeech.SpVoiceAudioLevel(Sender: TObject;
  StreamNumber: Integer; StreamPosition: OleVariant; AudioLevel: Integer);
begin
  ProgressBar.Position := AudioLevel;
  lblVU.Caption := IntToStr(AudioLevel)
end;

procedure TfrmTextToSpeech.SpVoiceBookmark(ASender: TObject;
  StreamNumber: Integer; StreamPosition: OleVariant;
  const Bookmark: WideString; BookmarkId: Integer);
begin
  Log('OnBookmark: stream %d, position %d, bookmark id %d, bookmark: %s',
    [StreamNumber, Integer(StreamPosition), BookmarkId, Bookmark]);
end;

procedure TfrmTextToSpeech.SpVoiceEndStream(Sender: TObject;
  StreamNumber: Integer; StreamPosition: OleVariant);
begin
  Log('OnEndStream: stream %d, position: %d', [StreamNumber, Integer(StreamPosition)]);
  SetTextHilite(0, 0);
  SetTextStyle(OldSentencePos, OldSentenceLen, []);
end;

procedure TfrmTextToSpeech.SpVoiceEnginePrivate(Sender: TObject;
  StreamNumber, StreamPosition: Integer; EngineData: OleVariant);
begin
  Log('OnEnginePrivate: stream %d, position: %s', [StreamNumber, String(StreamPosition)])
end;

const
  Phonemes: array[1..49] of String = (
    '-', '!', '&', ',', '.', '?', '_',
    '1', '2', 'aa', 'ae', 'ah', 'ao', 'aw',
    'ax', 'ay', 'b', 'ch', 'd', 'dh', 'eh',
    'er', 'ey', 'f', 'g', 'h', 'ih', 'iy',
    'jh', 'k', 'l', 'm', 'n', 'ng', 'ow',
    'oy', 'p', 'r', 's', 'sh', 't', 'th',
    'uh', 'uw', 'v', 'w', 'y', 'z', 'zh'
  );

procedure TfrmTextToSpeech.SpVoicePhoneme(Sender: TObject;
  StreamNumber: Integer; StreamPosition: OleVariant; Duration: Integer;
  NextPhoneId: Smallint; Feature: TOleEnum; CurrentPhoneId: Smallint);
begin
  if CurrentPhoneId <> 7 then //Display phonemes, except silence
    memEnginePhonemes.Text := memEnginePhonemes.Text + Phonemes[CurrentPhoneId] + #32
end;

procedure TfrmTextToSpeech.SpVoiceSentence(Sender: TObject;
  StreamNumber: Integer; StreamPosition: OleVariant; CharacterPosition,
  Length: Integer);
begin
  Log('OnSentence: stream %d, position: %d, char. pos. %d, length %d',
    [StreamNumber, Integer(StreamPosition), CharacterPosition, Length]);
  SetTextStyle(OldSentencePos, OldSentenceLen, []);
  SetTextStyle(CharacterPosition, Length, [fsItalic]);
  OldSentencePos := CharacterPosition;
  OldSentenceLen := Length;
  if not StreamJustStarted then
    memEnginePhonemes.Text := memEnginePhonemes.Text + #13#10;
  StreamJustStarted := False;
end;

procedure TfrmTextToSpeech.SpVoiceStartStream(Sender: TObject;
  StreamNumber: Integer; StreamPosition: OleVariant);
begin
  StreamJustStarted := True;
  memEnginePhonemes.Clear;
  Log('OnStartStream: stream %d, position: %d', [StreamNumber, Integer(StreamPosition)]);
end;

procedure TfrmTextToSpeech.SpVoiceViseme(Sender: TObject;
  StreamNumber: Integer; StreamPosition: OleVariant; Duration: Integer;
  NextVisemeId, Feature, CurrentVisemeId: TOleEnum);
begin
  Log('OnViseme: stream %d, position: %d, viseme %d',
    [StreamNumber, Integer(StreamPosition), CurrentVisemeId])
end;

procedure TfrmTextToSpeech.SpVoiceVoiceChange(ASender: TObject;
  StreamNumber: Integer; StreamPosition: OleVariant;
  const VoiceObjectToken: ISpeechObjectToken);
begin
  Log('OnVoiceChange: stream %d, position: %d, voice: %s',
    [StreamNumber, Integer(StreamPosition),
     VoiceObjectToken.GetDescription(0)])
end;

procedure TfrmTextToSpeech.SpVoiceWord(Sender: TObject;
  StreamNumber: Integer; StreamPosition: OleVariant; CharacterPosition,
  Length: Integer);
begin
  Log('OnWord: stream %d, position: %d, char. pos. %d, length %d',
    [StreamNumber, Integer(StreamPosition), CharacterPosition, Length]);
  SetTextHilite(CharacterPosition, Length);
end;

procedure TfrmTextToSpeech.tbRateChange(Sender: TObject);
begin
  btnStop.Click;
  SpVoice.Rate := tbRate.Position;
  lblRate.Caption := IntToStr(tbRate.Position);
end;

procedure TfrmTextToSpeech.tbVolumeChange(Sender: TObject);
begin
  btnStop.Click;
  SpVoice.Volume := tbVolume.Position;
  lblVolume.Caption := IntToStr(tbVolume.Position);
end;

end.

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
夜夜嗨av一区二区三区网页 | 久久9热精品视频| 亚洲精品日产精品乱码不卡| 国产精品视频你懂的| 日本一区二区三区四区| 欧美极品aⅴ影院| 国产精品久久精品日日| 国产精品久久久久aaaa樱花 | 国产欧美日韩激情| 国产午夜精品美女毛片视频| 久久久精品黄色| 国产精品色眯眯| 一区二区三区在线视频观看| 亚洲妇熟xx妇色黄| 久久丁香综合五月国产三级网站| 久久国产三级精品| 风间由美一区二区三区在线观看| 国产精品综合av一区二区国产馆| 国产一区二区电影| 91色在线porny| 欧美日本一道本| 欧美成人乱码一区二区三区| 国产欧美一区二区精品性色超碰| 国产精品欧美久久久久无广告 | 欧美疯狂性受xxxxx喷水图片| 91精品免费观看| 日本一区二区免费在线观看视频 | 欧美理论电影在线| 久久综合久久综合九色| 国产精品美女久久久久久2018| 亚洲一二三四久久| 蜜桃一区二区三区四区| 成人免费看片app下载| 欧美日韩在线不卡| 国产网站一区二区| 亚洲国产精品久久久男人的天堂 | 色综合视频在线观看| 欧美日韩视频一区二区| 久久久久久久电影| 午夜一区二区三区在线观看| 国产精品伊人色| 欧美日韩久久久一区| 中文字幕乱码日本亚洲一区二区| 亚洲国产精品一区二区www在线| 国产成人在线视频网站| 欧美老肥妇做.爰bbww| 中文字幕第一页久久| 日本vs亚洲vs韩国一区三区二区 | 欧美mv日韩mv亚洲| 一区二区在线观看不卡| 国产成人av福利| 欧美一区二区三区视频免费| 亚洲毛片av在线| 国产suv精品一区二区6| 69p69国产精品| 亚洲国产毛片aaaaa无费看 | 国产日韩欧美在线一区| 日韩av在线发布| 91黄色免费看| 国产精品久久久久一区 | 亚洲国产欧美一区二区三区丁香婷| 成人中文字幕电影| 久久免费国产精品| 麻豆精品久久久| 正在播放一区二区| 亚洲成av人**亚洲成av**| 91视频免费看| 亚洲男人的天堂av| 99精品视频在线播放观看| 国产精品色呦呦| 成人一级片网址| 中文av字幕一区| 国产91丝袜在线播放| 国产女主播视频一区二区| 国产真实乱子伦精品视频| 26uuu精品一区二区三区四区在线| 日本中文字幕一区| 日韩免费一区二区三区在线播放| 日韩激情视频在线观看| 91精品欧美久久久久久动漫 | 成人国产在线观看| 国产蜜臀av在线一区二区三区| 成人深夜在线观看| 国产精品美女久久久久久久久久久| 成人美女视频在线看| 国产精品青草久久| 91视频一区二区三区| 亚洲香肠在线观看| 欧美一区二区在线免费播放| 麻豆精品视频在线观看免费| 精品久久久久一区二区国产| 国产伦精品一区二区三区在线观看| 日本一区二区免费在线观看视频| 91在线精品秘密一区二区| 一区二区三区在线观看视频| 欧美日韩久久一区| 韩日av一区二区| 中文字幕在线视频一区| 欧美性猛交一区二区三区精品| 天天影视涩香欲综合网| 久久久久久亚洲综合影院红桃| 99精品视频一区二区| 视频一区二区中文字幕| 久久久久国产精品麻豆ai换脸| 成人一道本在线| 日韩国产欧美在线播放| 国产免费成人在线视频| 欧美日韩欧美一区二区| 国产精品一区二区久激情瑜伽| 亚洲欧美日本韩国| 精品国产免费一区二区三区香蕉| 成人午夜视频免费看| 亚洲成人免费观看| 欧美国产综合色视频| 337p亚洲精品色噜噜噜| 成人久久久精品乱码一区二区三区| 亚洲尤物视频在线| 国产精品每日更新| 26uuu国产日韩综合| 欧美日韩视频一区二区| 成人午夜精品一区二区三区| 日韩有码一区二区三区| 亚洲乱码国产乱码精品精的特点 | 色婷婷激情久久| 国产麻豆成人传媒免费观看| 婷婷国产在线综合| 自拍偷拍欧美精品| 久久久噜噜噜久久中文字幕色伊伊 | 一区二区三区视频在线看| 国产日韩欧美高清| 精品国产一区二区精华| 欧美久久久久久久久中文字幕| 成人18视频日本| 国内久久精品视频| 日韩1区2区3区| 亚洲电影中文字幕在线观看| 亚洲人123区| 一区二区中文视频| 欧美激情一区二区三区不卡 | jvid福利写真一区二区三区| 国产一级精品在线| 久久国产免费看| 奇米777欧美一区二区| 午夜视频在线观看一区二区 | 亚洲精品一二三四区| 亚洲色图欧洲色图婷婷| 中文字幕在线不卡一区| 国产视频一区在线播放| 久久综合九色综合欧美就去吻| 欧美电影免费观看完整版| 日韩三级免费观看| 日韩一区二区不卡| 欧美一区二区三区公司| 日韩精品一区二区三区swag| 欧美变态tickle挠乳网站| 精品不卡在线视频| 国产亚洲女人久久久久毛片| 久久久久亚洲蜜桃| 国产精品网站在线播放| 国产精品成人午夜| 亚洲女女做受ⅹxx高潮| 午夜久久久久久电影| 日本大胆欧美人术艺术动态| 麻豆中文一区二区| 国产高清精品网站| 99麻豆久久久国产精品免费| 色综合天天综合| 欧美偷拍一区二区| 日韩写真欧美这视频| 日本一区二区在线不卡| 97超碰欧美中文字幕| 国产一区二区电影| a亚洲天堂av| 欧洲视频一区二区| 在线播放日韩导航| 久久人人超碰精品| **性色生活片久久毛片| 亚洲第一福利视频在线| 久热成人在线视频| 成人精品免费看| 欧美日韩一区二区在线视频| 精品黑人一区二区三区久久| 亚洲欧洲精品天堂一级| 午夜av一区二区| 成人免费毛片aaaaa**| 精品视频在线看| 国产无人区一区二区三区| 一区二区免费在线播放| 国产一区二区日韩精品| 欧美亚洲自拍偷拍| 日本一区二区三区高清不卡| 亚洲va欧美va人人爽午夜| 成人国产在线观看| 日韩欧美国产午夜精品| 亚洲美女免费在线| 国产自产v一区二区三区c| 精品视频一区三区九区| 日本一区二区三区国色天香 | 日韩欧美电影在线| 亚洲精品五月天|