
13.03.2013, 03:53
|
Прохожий
|
|
Регистрация: 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 - не знаю. Подскажите, пожалуйста. 
|