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

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

?? texttospeechanimatedu.pas

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

//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, ExtCtrls;

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;
    imgsMic: TImageList;
    pbMic: TPaintBox;
    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);
    procedure pbMicPaint(Sender: TObject);
  private
    BeenPaused, StreamJustStarted: Boolean;
    OldSentencePos, OldSentenceLen: Integer;
    procedure SetTextHilite(FirstChar, Len: Integer);
    procedure SetTextStyle(FirstChar, Len: Integer; Styles: TFontStyles);
    procedure SetupMicImages;
  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.SetupMicImages;
var
  Bmp: TBitmap;

  procedure LoadBitmap(const FileName: String);
  begin
    Bmp.LoadFromFile(FileName);
    imgsMic.AddMasked(Bmp, Bmp.TransparentColor);
  end;

begin
  Bmp := TBitmap.Create;
  try
    ChDir('C:\Program Files\Microsoft Speech SDK 5.1\Samples\CPP\TTSApp\Res');
    LoadBitmap('mic.bmp');
    LoadBitmap('mic_mouth_2.bmp');
    LoadBitmap('mic_mouth_3.bmp');
    LoadBitmap('mic_mouth_4.bmp');
    LoadBitmap('mic_mouth_5.bmp');
    LoadBitmap('mic_mouth_6.bmp');
    LoadBitmap('mic_mouth_7.bmp');
    LoadBitmap('mic_mouth_8.bmp');
    LoadBitmap('mic_mouth_9.bmp');
    LoadBitmap('mic_mouth_10.bmp');
    LoadBitmap('mic_mouth_11.bmp');
    LoadBitmap('mic_mouth_12.bmp');
    LoadBitmap('mic_mouth_13.bmp');
    LoadBitmap('mic_eyes_narrow.bmp');
    LoadBitmap('mic eyes closed.bmp');
  finally
    Bmp.Free;
  end
end;

procedure TfrmTextToSpeech.FormCreate(Sender: TObject);
var
  I: Integer;
  SOToken: ISpeechObjectToken;
  SOTokens: ISpeechObjectTokens;
begin
  SendMessage(lstProgress.Handle, LB_SETHORIZONTALEXTENT, Width, 0);
  //Set up image list
  SetupMicImages;
  //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
  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: %d', [StreamNumber, Integer(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] +'-'
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, []);
  if Length > 0 then
  begin
    SetTextStyle(CharacterPosition, Length, [fsItalic]);
    OldSentencePos := CharacterPosition;
    OldSentenceLen := Length;
  end;
  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;
  Log('OnStartStream: stream %d, position: %d', [StreamNumber, Integer(StreamPosition)]);
  memEnginePhonemes.Clear;
end;

const
  Visemes: array[0..21] of Byte = (
   	0,  // SP_VISEME_0 = 0,    // Silence
    11, // SP_VISEME_1,        // AE, AX, AH
    11, // SP_VISEME_2,        // AA
    11, // SP_VISEME_3,        // AO
    10, // SP_VISEME_4,        // EY, EH, UH
    11, // SP_VISEME_5,        // ER
    9,  // SP_VISEME_6,        // y, IY, IH, IX
    2,  // SP_VISEME_7,        // w, UW
    13, // SP_VISEME_8,        // OW
    9,  // SP_VISEME_9,        // AW
    12, // SP_VISEME_10,       // OY
    11, // SP_VISEME_11,       // AY
    9,  // SP_VISEME_12,       // h
    3,  // SP_VISEME_13,       // r
    6,  // SP_VISEME_14,       // l
    7,  // SP_VISEME_15,       // s, z
    8,  // SP_VISEME_16,       // SH, CH, JH, ZH
    5,  // SP_VISEME_17,       // TH, DH
    4,  // SP_VISEME_18,       // f, v
    7,  // SP_VISEME_19,       // d, t, n
    9,  // SP_VISEME_20,       // k, g, NG
    1   // SP_VISEME_21,       // p, b, m
  );

procedure TfrmTextToSpeech.SpVoiceViseme(Sender: TObject;
  StreamNumber: Integer; StreamPosition: OleVariant; Duration: Integer;
  NextVisemeId, Feature, CurrentVisemeId: TOleEnum);
const
  EyesNarrow = 14;
  EyesClosed = 15;
begin
  imgsMic.Draw(pbMic.Canvas, 0, 0, Visemes[CurrentVisemeId]);
  if Visemes[CurrentVisemeId] mod 6 = 2 then
    imgsMic.Draw(pbMic.Canvas, 0, 0, EyesNarrow)
  else
    if Visemes[CurrentVisemeId] mod 6 = 5 then
      imgsMic.Draw(pbMic.Canvas, 0, 0, EyesClosed);
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;

procedure TfrmTextToSpeech.pbMicPaint(Sender: TObject);
begin
  imgsMic.Draw(pbMic.Canvas, 0, 0, 0);
end;

end.

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
中文成人综合网| 国产91丝袜在线播放0| 国内外精品视频| 欧美天天综合网| 国产精品理伦片| 国产一区二区三区综合| 欧美人与z0zoxxxx视频| 中文幕一区二区三区久久蜜桃| 天天爽夜夜爽夜夜爽精品视频| 色综合欧美在线| 久久精品综合网| 精东粉嫩av免费一区二区三区| 欧美网站一区二区| 一区二区三区在线视频播放| 99re66热这里只有精品3直播| 久久天天做天天爱综合色| 午夜精品久久久久影视| 91性感美女视频| 国产精品乱码人人做人人爱| 国产成人在线视频网站| 精品日韩在线观看| 久久国产尿小便嘘嘘尿| 7777精品久久久大香线蕉| 亚洲一区二区三区四区在线观看| 91一区在线观看| 国产精品三级av在线播放| 国产成人av电影在线播放| 久久久国际精品| 国产成人h网站| 国产精品无人区| 99久久久精品| 亚洲免费观看高清完整版在线 | 日韩va欧美va亚洲va久久| 欧美色窝79yyyycom| 亚洲综合色丁香婷婷六月图片| 91香蕉视频mp4| 一区二区三区不卡在线观看| 欧美日韩午夜精品| 日本视频在线一区| 精品久久久网站| 国产91丝袜在线播放九色| 国产精品久久久久久亚洲伦| 99国产精品久久久久久久久久 | 婷婷久久综合九色综合绿巨人| 欧美日韩国产中文| 蜜臀久久99精品久久久久久9 | 亚洲欧美日韩久久| 在线观看日韩国产| 三级在线观看一区二区| 久久综合色8888| 91在线免费播放| 亚洲一区二区三区四区中文字幕| 欧美丰满一区二区免费视频 | 国产午夜精品在线观看| jlzzjlzz亚洲女人18| 亚洲国产视频直播| 久久综合网色—综合色88| 成人午夜激情视频| 一区二区三区四区五区视频在线观看| 欧美日韩第一区日日骚| 韩国欧美一区二区| 亚洲女厕所小便bbb| 欧美一区二区三区系列电影| 福利一区福利二区| 亚洲午夜在线电影| 久久综合狠狠综合久久综合88| aaa欧美日韩| 日韩激情av在线| 最新高清无码专区| 日韩一级二级三级| 91色九色蝌蚪| 美女视频一区在线观看| 国产精品第五页| 精品久久免费看| 欧美日韩高清在线播放| 国产成人亚洲精品狼色在线| 亚洲超碰精品一区二区| 中文字幕精品三区| 欧美成人三级在线| 欧美视频完全免费看| caoporn国产精品| 精品一区精品二区高清| 亚洲成人动漫av| 中文字幕日本不卡| 久久精品一区四区| 欧美一区二区性放荡片| 色哟哟亚洲精品| 国产aⅴ精品一区二区三区色成熟| 天堂午夜影视日韩欧美一区二区| 中文字幕一区三区| 国产欧美视频一区二区| 日韩视频一区二区三区| 欧美羞羞免费网站| 91久久久免费一区二区| 成人性视频免费网站| 国产一区久久久| 国内成人免费视频| 久久精品国产一区二区三区免费看| 亚洲高清不卡在线观看| 国产精品国产三级国产普通话99 | 波多野结衣亚洲一区| 国内成人自拍视频| 久久99久久久欧美国产| 日韩国产精品大片| 亚洲成人黄色小说| 亚洲va国产天堂va久久en| 亚洲一级二级在线| 亚洲曰韩产成在线| 一区二区三区国产| 亚洲成人一二三| 五月婷婷激情综合| 首页欧美精品中文字幕| 亚洲va中文字幕| 日韩电影网1区2区| 男人的j进女人的j一区| 麻豆91精品视频| 精品写真视频在线观看| 国产精品一区不卡| 成人av影视在线观看| 91视频xxxx| 欧美日韩日日骚| 91精品国产丝袜白色高跟鞋| 在线不卡一区二区| 91精品国产麻豆| 久久嫩草精品久久久精品| 国产日韩一级二级三级| 1000部国产精品成人观看| 国产精品伦理一区二区| 一区二区三区免费观看| 午夜精品一区二区三区三上悠亚| 日本视频一区二区三区| 国产在线精品一区二区夜色 | 最新日韩在线视频| 一区二区三区 在线观看视频| 亚洲第一av色| 国产精品99久久久久久似苏梦涵 | 国产精品中文字幕日韩精品| 成人免费福利片| 欧美在线免费播放| 精品久久久久久久人人人人传媒| 亚洲国产精品v| 亚洲一区二区三区影院| 蓝色福利精品导航| 99精品视频在线观看| 欧美日韩黄色影视| 国产亚洲va综合人人澡精品| 亚洲男人的天堂在线aⅴ视频| 日韩一区精品视频| 成人高清免费在线播放| 在线不卡免费av| 国产精品区一区二区三| 亚洲一二三区视频在线观看| 极品美女销魂一区二区三区| 色老汉av一区二区三区| 精品久久久久久久久久久久久久久久久 | 精品理论电影在线| 亚洲欧美一区二区视频| 日本vs亚洲vs韩国一区三区 | **欧美大码日韩| 麻豆91在线播放免费| 色婷婷综合久色| 精品国产99国产精品| 亚洲精品成a人| 国产精品538一区二区在线| 欧美老人xxxx18| 国产精品免费久久| 激情小说欧美图片| 欧美日本韩国一区| 最新国产成人在线观看| 国产一区二区在线电影| 这里只有精品电影| 一区二区三区国产精华| 丰满亚洲少妇av| 精品国产凹凸成av人导航| 日韩有码一区二区三区| 在线亚洲欧美专区二区| 国产精品麻豆欧美日韩ww| 国产一本一道久久香蕉| 欧美一区二区播放| 亚洲第一福利一区| 日本高清不卡一区| 1024亚洲合集| 99久久伊人精品| 国产精品久久午夜| 国产91精品一区二区麻豆网站| 欧美成人r级一区二区三区| 五月天亚洲婷婷| 欧洲一区在线观看| 一区二区高清免费观看影视大全 | 亚洲黄色小视频| 99久久99久久综合| 国产精品久久久久影院色老大 | 中文字幕在线观看不卡视频| 国产精品中文欧美| 精品国产麻豆免费人成网站| 麻豆成人91精品二区三区| 日韩欧美一区电影| 韩国欧美国产1区| 久久久精品国产99久久精品芒果| 国产黄色精品视频|