0

这个问题与我之前的(未回答的)问题有关:在 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吗?

4

1 回答 1

0

当 PHP 作为服务运行时,它以不同的用户身份运行,并使用与交互运行时不同的注册表项。特别是,SAPI 广泛使用注册表来确定要加载的语音。我怀疑您使用的是桌面 TTS 引擎,该引擎并非旨在作为服务运行。使用Microsoft Speech Platform SDK 11将获得更好的结果,该SDK旨在从服务应用程序运行,并使用相同的 SAPI 编程接口。(它有不同的声音,并且配置略有不同。SDK 有示例概述了差异。)

于 2013-09-27T03:15:21.853 回答