首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TTS与Delphi在Win 10中的应用

TTS与Delphi在Win 10中的应用
EN

Stack Overflow用户
提问于 2018-06-20 12:06:41
回答 2查看 2.5K关注 0票数 1

使用Delphi XE8,Windows8.1。葡萄牙语-BR。

我使用下面的代码来获取声音。它在Win 8中返回:

  • 微软玛丽亚桌面-Portuguese(巴西)
  • 微软Zira桌面-Ingles(美国)

我在Win 10中安装了这个应用程序。在这里,我想使用一个男性声音(“Daniel”)。我可以看到在Windows 10的设置中,我安装了:

  • 微软玛丽亚桌面-Portuguese(巴西)
  • 微软Zira桌面-Ingles(美国)
  • Microsoft Maria-葡萄牙语(巴西)
  • Microsoft Daniel-葡萄牙语(巴西) 但是,我的delphi代码继续只返回:
  • 微软玛丽亚桌面-Portuguese(巴西)
  • 微软Zira桌面-Ingles(美国)

其他声音是不是没有列出来,智人的声音?是否可以使用它,作为样本,微软丹尼尔葡萄牙语(巴西),做文字到演讲与德尔福?

代码语言:javascript
复制
voz := CreateOLEObject('SAPI.SpVoice');
if not VarIsEmpty(voz) then begin
 vozes := voz.getVoices;
 ComboVoz.Clear;
 for i := 0 to vozes.Count - 1 do
  ComboVoz.Items.Add(vozes.item(i).GetDescription);
end;
EN

回答 2

Stack Overflow用户

发布于 2019-09-09 17:05:42

默认情况下,Microsoft移动语音通过SAPI 5锁定,以便在文本到语音软件中使用。您可以通过简单的注册表调整来解锁它。下载归档,提取您的语言和操作系统版本的文件(32位的“mobile_x86.reg”,64位的"mobile_x64.reg“),单击文件名称上的鼠标右键,然后选择上下文菜单项"Merge”。抄袭

票数 0
EN

Stack Overflow用户

发布于 2018-06-20 16:51:50

您要寻找的是SpeechLib_tlb activex,您将使用delphi本身导入该activex。

http://www.exceletel.com/support/whtpapers/speech/delphi.htm

代码样本

代码语言:javascript
复制
unit UnitF;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, SpeechLib_TLB, OleServer, XPMan, ExtCtrls, ComCtrls, ENGINE,
  TFlatCheckBoxUnit;

type
  TPropriedsF = class(TForm)
    SAPI: TSpVoice;
    CBFA: TComboBox;
    IMG: TImage;
    XPManifest1: TXPManifest;
    EDTEST: TEdit;
    DEMVOZ: TButton;
    TB: TTrackBar;
    LAUT: TCheckBox;
    APPLY: TButton;
    BCANC: TButton;
    BOK: TButton;
    Button1: TButton;
    procedure FormShow(Sender: TObject);
    procedure CBFAChange(Sender: TObject);
    procedure DEMVOZClick(Sender: TObject);
    procedure TBChange(Sender: TObject);
    procedure APPLYClick(Sender: TObject);
    procedure BCANCClick(Sender: TObject);
    procedure BOKClick(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  PropriedsF: TPropriedsF;
  VPT: string;

implementation

{$R *.dfm}

procedure TPropriedsF.FormShow(Sender: TObject);
var
  SOTokenVoice: ISpeechObjectToken;  // See the MS SAPI SDK for info on
  SOTokenVoices:ISpeechObjectTokens; // registry tokens that hold resources
  i:       Integer;
begin
  VPT:= 'Você selecionou X como voz padrão do sistema.';
  //
  SAPI.EventInterests := SVEAllEvents;
  SOTokenVoices := SAPI.GetVoices('','');  // Use the registry tokens

  for I := 0 to SOTokenVoices.Count - 1 do
  begin
    //For each voice, store the descriptor in the TStrings list
    SOTokenVoice := SOTokenVoices.Item(i);
    CBFA.Items.AddObject(SOTokenVoice.GetDescription(0), TObject(SOTokenVoice));
    //Increment descriptor reference count to ensure it's not destroyed
    SOTokenVoice._AddRef;
  end;

  if CBFA.Items.Count > 0 then
  begin
    CBFA.ItemIndex := CBFA.Items.IndexOf(SAPI.Voice.GetDescription(0));
  end;
  //
  TB.Position := SAPI.Rate;
  EDTEST.TEXT:= TROCA('X', SAPI.Voice.GetDescription(0), VPT);
end;

procedure TPropriedsF.CBFAChange(Sender: TObject);
var SOTokenVoice:  ISpeechObjectToken;
begin
  SOTokenVoice   := ISpeechObjectToken(Pointer(CBFA.Items.Objects[CBFA.ItemIndex]));
  SAPI.Voice := SOTokenVoice;
  EDTEST.TEXT:= TROCA('X', SAPI.Voice.GetDescription(0), VPT);
end;

procedure TPropriedsF.DEMVOZClick(Sender: TObject);
begin
  if SAPI.Voice = nil then
    exit;
  //
  SAPI.Speak(EDTEST.Text, 1);
end;

procedure TPropriedsF.Button1Click(Sender: TObject);
var
  SpFileStream1: TSpFileStream;
  FileName : TFileName;
  T: TSTRINGLIST;
  I: INTEGER;
begin
  T:= TSTRINGLIST.CREATE;
  T.LoadFromFile(EXTRACTFILEPATH(PARAMSTR(0))+'LISTA.TXT');
  FOR I:=0 TO T.COUNT-1 DO
  BEGIN
  FileName := extractfilepath(paramstr(0))+'RAQUEL\'+T[I];
  SpFileStream1 := TSpFilestream.Create(nil);
  SpFileStream1.Open(FileName, SSFMCreateForWrite, False);
  SAPI.AudioOutputStream := SPFileStream1.DefaultInterface;
  SAPI.Speak(COPY(T[I], 1, POS('.', T[I])-1), SVSFDefault);
  SPFileStream1.Close;
  SpFileStream1.Free;
  SLEEP(300);
  END;
end;

procedure TPropriedsF.TBChange(Sender: TObject);
begin
  SAPI.Rate:= TB.Position;
end;

procedure TPropriedsF.APPLYClick(Sender: TObject);
begin
  APPLY.ENABLED:= FALSE;
  //
  //SAPI
  //..
end;

procedure TPropriedsF.BCANCClick(Sender: TObject);
begin
  CLOSE;
end;

procedure TPropriedsF.BOKClick(Sender: TObject);
begin
  CLOSE;
end;

end.
票数 -3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50947859

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档