为什么PHP COM对象没有返回正确的结果?

时间:2016-11-24 20:26:46

标签: php perl com text-to-speech sapi

我正在尝试使用PHP访问Windows SAPI5或文本到语音(TTS)。标准方法是为“SAPI.SpVoice”创建COM对象,然后获取已安装的语音。

示例PHP代码:

<?php

$obj = new COM('SAPI.SpVoice');
$voices = $obj->GetVoices;
$count = $voices->Count;

print $count; #prints "1"

不幸的是,PHP的COM对象返回的输出不正确,因为我的系统上安装了5个声音,但PHP只返回1.

所以,只是为了检查这是否是PHP特定的问题,我在Perl 5.8(草莓)中编写了相同的代码。

示例Perl代码:

#!/usr/bin/perl
use Win32::OLE;

my $obj = Win32::OLE->new('SAPI.SpVoice');
my $voices = $obj->GetVoices;
my $count = $voices->Count;

print $count; #print "5" which is correct.

所以perl代码正确返回我的系统上有5个TTS语音,但PHP只返回1?

这是一个错误还是我做错了什么?可能的原因是什么?

P.S。我在两台不同的计算机上试过这个,结果是一样的。

1 个答案:

答案 0 :(得分:1)

我在一些试验错误后想到这一点。看起来如果我使用32位版本的PHP,那么我得到正确的结果(5个声音)。但是因为我默认安装了64位版本,所以只能获得1个声音。

我认为TTS语音大多是32位(就像我系统上安装的那些),所以当使用64位php.exe运行时,它只返回64位语音。使用32个php.exe,它将返回所有声音。

将此作为答案发布,以防将来有人面临类似问题。