这个问题与我之前的(未回答的)问题有关:在 PHP 中运行控制台程序
我在那个问题progName.exe
(我将语音 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;
}
此代码生成一个包含“Hello world”的 .WAV 文件。当它直接在服务器的控制台上运行时,它会生成一个正确的 .WAV 文件(大约 60 kB)。但是,当使用浏览器中的 PHP 脚本调用它时:
<?php
$cmd = "helloTTS.exe"; // The name of the program
exec($cmd);
?>
程序运行并完成,但生成的 .WAV 文件只有 46 个字节。但是,如果我在 Windows ( ) 中使用 PHP 交互模式php -a
运行相同的脚本,则 .WAV 文件的大小是正确的。
关于可能导致这种情况的任何想法?为什么以交互模式执行的 PHP 脚本与从浏览器执行的脚本不同?
另一个可能对我有帮助的问题:函数实际使用了哪个库(.DLL),例如ISpVoice::Speak()
?是SAPI.DLL
吗?