Я пытаюсь получить доступ к Windows SAPI5 или текст в речь (TTS) с помощью PHP. Стандартный подход заключается в создании COM-объекта для «SAPI.SpVoice», а затем получения установленных голосов.
Пример кода PHP:
<?php
$obj = new COM('SAPI.SpVoice');
$voices = $obj->GetVoices;
$count = $voices->Count;
print $count; #prints "1"
К сожалению, результат, возвращаемый из COM-объекта PHP, неверен, потому что в моей системе установлено 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?
Это ошибка или я что-то не так делаю? Что может быть возможной причиной этого?
Постскриптум Я пробовал это на двух разных компьютерах, и результаты одинаковы.
Я понял это после некоторой пробной ошибки. Похоже, что если я использую 32-битную версию PHP, то получу правильные результаты (5 голосов). Но так как я установил 64-битную версию по умолчанию, я получаю только 1 голос.
Я думаю, что голоса TTS в основном 32-битные (как те, что установлены в моей системе), поэтому при работе с 64-битным php.exe он возвращает только 64-битные голоса. С 32 php.exe он возвращает все голоса.
Размещение этого ответа в случае, если кто-то столкнется с подобной проблемой в будущем.
Других решений пока нет …