Этот вопрос связан с моим предыдущим (неотвеченным) вопросом: запуск консольной программы в PHP
Программа, которую я написал в этом вопросе ( progName.exe
), на самом деле является приложением Windows Speech SDK, которое генерирует WAV-файл из текстового файла и вычисляет некоторые параметры из текстового файла. Я упростил программу Speech SDK:
#include "stdafx.h" using namespace std; int _tmain(int argc, _TCHAR* argv[]) { HRESULT hr = S_OK; CComPtr <ISpVoice> cpVoice; CComPtr <ISpStream> cpWavStream; CSpStreamFormat cAudioFmt; hr = ::CoInitialize(NULL); if (SUCCEEDED(hr)) hr = CoCreateInstance(CLSID_SpVoice, NULL, CLSCTX_ALL, IID_ISpVoice, (void **)&cpVoice); if (SUCCEEDED(hr)) hr = cAudioFmt.AssignFormat(SPSF_22kHz16BitMono); if (SUCCEEDED(hr)) hr = SPBindToFile(L"hello.wav", SPFM_CREATE_ALWAYS, &cpWavStream, &cAudioFmt.FormatId(), cAudioFmt.WaveFormatExPtr(), SPEI_PHONEME); if (SUCCEEDED(hr)) hr = cpVoice->SetOutput(cpWavStream, TRUE); if (SUCCEEDED(hr)) hr = cpVoice->Speak(L"Hello World", SPF_DEFAULT, NULL); cpVoice->WaitUntilDone(INFINITE); cpWavStream->Close(); cpVoice.Release(); return 0; }
Этот код создает WAV-файл, содержащий «Hello world». Когда он запускается непосредственно на консоли сервера, он создает правильный .WAV-файл (около 60 кБ). Однако, когда он вызывается с использованием PHP-скрипта из браузера:
<?php $cmd = "helloTTS.exe"; // The name of the program exec($cmd); ?>
Программа запускается и заканчивается, но созданный файл .WAV составляет всего 46 байт. Но если я использую интерактивный режим PHP в Windows ( php -a
) для запуска того же скрипта, размер файла .WAV верен.
Любая идея о том, что может это сделать? Почему скрипт PHP выполняется в интерактивном режиме, отличном от того, который выполняется в браузере?
Другой вопрос, который мог бы мне помочь: какая библиотека (.DLL) фактически используется такими функциями, как ISpVoice::Speak()
? Это SAPI.DLL
?