Показать сообщение отдельно
  #1  
Старый 13.03.2013, 03:53
alexingor alexingor вне форума
Прохожий
 
Регистрация: 26.10.2012
Сообщения: 16
Репутация: 10
По умолчанию Запись TTS в файл

Дополнение: Создав эту тему, я прошел по своей же ссылке, и обнаружил, что на указанном мною сайте есть ответ на мой вопрос: http://subritto.h1.ru/msagent/sapi_ns_wav.php. Поэтому тема более не актуальна, извините за беспокойство.

Здравствуйте. Передо мной стоит задача - записать в файл аудио поток TTS. То есть, на вход процедура получает небольшой фрагмент текста, а на выходе должен получиться mp3-файл, содержащий чтение этого фрагмента.

Чтение я реализовал следующим образом:
// источник: http://subritto.h1.ru/msagent/speechapi.php
Код:
uses ... speach2, ... 
// Скачать speech2: https://www.dropbox.com/s/bwp0n67ftmclcw8/Speech2.dcu
...
procedure TForm1.FormCreate(Sender: TObject);
begin
    ...
  LEARN_ENGINES; // заполняется комбобокс для выбора активного движка 
    ...
end;
...
READ_IT_ALOUD(номер движка, текст);
...
 
 
// ===================================
//       произношение слов
// ===================================
 
procedure TForm1.LEARN_ENGINES;
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
    CB_VOICE.Items.Add(String(ModeInfo.szModeName));
    aTTSEnum.Next(1, ModeInfo, @NumFound); {Получаем остальные}
  end;
end;
 
 
procedure TForm1.READ_IT_ALOUD(ENGINE_NUMBER: Integer; STRING_TO_SAY: string);
var
  NumFound: DWord;
  ModeInfo : TTSModeInfo;{Для хранения информации о текущем движке}
  SData: TSData;
  BufRich: string;
  i: Integer;
begin
  if IMG_SOUND.Tag=1 then Exit;
  try
   CoCreateInstance(CLSID_MMAudioDest, nil, CLSCTX_ALL, IID_IAudioMultiMediaDevice, fIAMM);
   CoCreateInstance(CLSID_TTSEnumerator, nil, CLSCTX_ALL, IID_ITTSEnum, aTTSEnum);
   aTTSEnum.Reset;
   {Перескакиваем на нужный движок}
   Form1.aTTSEnum.skip(ENGINE_NUMBER);
   aTTSEnum.Next(1, ModeInfo, @NumFound);
   if assigned(fpModeInfo) then
    dispose(fpModeInfo);
   new(fpModeInfo);
   fpModeInfo^:=ModeInfo;
   {загружаем движок по его GUID}
   aTTSEnum.Select(fpModeInfo^.gModeID, fITTSCentral, IUnknown(fIAMM));
  except
  end;
  //CB_VOICE_ENGChange(self);
  if not assigned(fITTSCentral) then
   begin
    exit;
   end;
  BufRich:='';
  for i:=1 to Length(STRING_TO_SAY) do begin
    if (STRING_TO_SAY[i]<>'(') and (STRING_TO_SAY[i]<>')') then
    BufRich:=BufRich+STRING_TO_SAY[i] else BufRich:=BufRich+', ';
  end;
  if Pos('(',BufRich)>0 then BufRich:=Copy(BufRich,1, Pos('(',BufRich));
  if BufRich='(' then BufRich:='';
  SData.dwSize := length(BufRich) + 1;
  SData.pData := pChar(BufRich);
  try
    fITTSCentral.TextData(CHARSET_TEXT, 0, SData, nil, IID_ITTSBufNotifySink);
  except
end;
А вот как реализовать запись голоса в MP3 - не знаю. Подскажите, пожалуйста.
Ответить с цитированием