Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.07.2016, 19:06   #1
nobobic
Пользователь
 
Регистрация: 25.11.2013
Сообщений: 18
По умолчанию speech api выбором голосовых движков

ребят помогите не могу понять почему когда выбираю последний движок из списка комбобокс выходит сообщение не выбран движок ? =(

а также когда выбираю движок нажимаю кнопку старт звучит только первая буква или вообще не звучит как это исправить помогите плиз...

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Vcl.StdCtrls, Vcl.Buttons, SpeechLib_TLB, Speech, COMobj, ActiveX;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    BitBtn3: TBitBtn;
    ComboBox1: TComboBox;
    procedure FormCreate(Sender: TObject);
    procedure ComboBox1Change(Sender: TObject);
    procedure BitBtn1Click(Sender: TObject);
    procedure BitBtn3Click(Sender: TObject);
    procedure BitBtn2Click(Sender: TObject);
  private
  fITTSCentral: ITTSCentral;
  fIAMM: IAudioMultimediaDevice;
  aTTSEnum: ITTSEnum;
  fpModeInfo: PTTSModeInfo;
  Pause:Boolean;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.BitBtn1Click(Sender: TObject);
var
  SData: TSData;
  BufRich: string;
begin
  if not assigned(fITTSCentral) then
   begin
    ShowMessage('Невыбран движок!');
    exit;
   end;
  BufRich:=copy(edit1.Text, edit1.SelStart,
                        length(edit1.Text)-edit1.SelStart);
  SData.dwSize := length(BufRich) + 1;
  SData.pData := pChar(BufRich);
  if pause then
   begin
    try
      fITTSCentral.AudioResume;
      Pause:=False;
    except
      exit;
    end;
   end
  else
   begin
    try
      fITTSCentral.TextData(CHARSET_TEXT, 0, SData, nil,
                                            IID_ITTSBufNotifySink);
    except
    end;
   end;

end;

procedure TForm1.BitBtn2Click(Sender: TObject);
  begin
  if not assigned(fITTSCentral) then
   begin
    showmessage('Стоп');
    exit;
   end;
  try
    fITTSCentral.AudioReset;
    Pause:=False;
  except
  end;

end;

procedure TForm1.BitBtn3Click(Sender: TObject);
  begin
  if not assigned(fITTSCentral) then
   begin
    ShowMessage('Пауза');
    exit;
   end;
  if Pause then
    exit;
  try
    fITTSCentral.AudioPause;
    pause:=True;
  except
  end;

end;

procedure TForm1.ComboBox1Change(Sender: TObject);
var
 NumFound: DWord;
 ModeInfo : TTSModeInfo;{Для хранения информации о текущем движке}
begin
   try
     CoCreateInstance(CLSID_MMAudioDest, Nil, CLSCTX_ALL,
          IID_IAudioMultiMediaDevice, fIAMM);
     CoCreateInstance(CLSID_TTSEnumerator, Nil, CLSCTX_ALL, IID_ITTSEnum, aTTSEnum);
     aTTSEnum.Reset;
     {Перескакиваем на нужный движок}
     Form1.aTTSEnum.skip(ComboBox1.ItemIndex);
     aTTSEnum.Next(1, ModeInfo, @NumFound);
     if assigned(fpModeInfo) then
     {если fpModeInfo не равен nil}
      dispose(fpModeInfo);
     new(fpModeInfo);
     fpModeInfo^:=ModeInfo;
     {загружаем движок}
     aTTSEnum.Select(fpModeInfo^.gModeID, fITTSCentral, IUnknown(fIAMM));
   except
   end;

end;

procedure TForm1.FormCreate(Sender: TObject);
var
  NumFound : DWord;
  ModeInfo : TTSModeInfo;
begin
  try
    {Инициализация аудио устройства}
    CoCreateInstance(CLSID_MMAudioDest, Nil, CLSCTX_ALL,
           IID_IAudioMultiMediaDevice, fIAMM);
  except
  end;
  {Создание перечисляемого объекта для перебора всех движков в системе
   с помощью интерфейса ITTSEnum}
  CoCreateInstance(CLSID_TTSEnumerator, Nil, CLSCTX_ALL, IID_ITTSEnum, aTTSEnum);
  aTTSEnum.Reset;//Сбрасываем на первый
  aTTSEnum.Next(1, ModeInfo, @NumFound); {Получаем первый движок}
  While NumFound > 0 do
   begin
     ComboBox1.Items.Add(String(ModeInfo.szModeName));
     aTTSEnum.Next(1, ModeInfo, @NumFound); {Получаем остальные}
   end;

end;

end.
почти готовый исходник: https://yadi.sk/d/8X6ZihJAtLo3F
nobobic вне форума Ответить с цитированием
Старый 14.08.2016, 15:47   #2
Igor[Игорь]
Пользователь
 
Аватар для Igor[Игорь]
 
Регистрация: 25.11.2011
Сообщений: 52
По умолчанию

Зачем aTTSEnum.Next после выбора?
Код:
 Form1.aTTSEnum.skip(ComboBox1.ItemIndex);
     aTTSEnum.Next(1, ModeInfo, @NumFound);
e-mail: igor23dec@yandex.ru , ICQ: 2168364 , Telegram: @IgorVN
Delphi, PHP
Примеры http://igorvn.ucoz.ru/
Igor[Игорь] вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Google Speech-Recognition API TUberwer Общие вопросы Delphi 3 05.07.2013 08:24
Список голосовых движков rmv240899 Помощь студентам 0 23.02.2013 00:11
Speech API в Delphi Konung21 Общие вопросы Delphi 2 07.07.2010 13:09
Speech api Яр|/||< (^_^) Windows 2 06.07.2009 20:18
Подсветка в Speech api Яр|/||< (^_^) Мультимедиа в Delphi 0 19.06.2009 11:33