|
#1
|
|||
|
|||
Запись 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; Последний раз редактировалось alexingor, 13.03.2013 в 05:23. |
#2
|
||||
|
||||
Записать в обычном wav формате, потом кодеку передать и будет тебе мп3.
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
Этот пользователь сказал Спасибо M.A.D.M.A.N. за это полезное сообщение: | ||
alexingor (13.03.2013)
|
#3
|
|||
|
|||
Цитата:
|