我试图使用SOAP连接到TTS Ivona(ivona.com)服务几天。
以下是效果良好的PHP示例:
function txtSpeechToFile($txt, $path) {
$soapURL = "http://www.ivona.com/saasapiwsdl.php";
$user = "some@email.com";
$pwd = 'pass';
$soap = new SoapClient($soapURL);
$token = $soap->__soapCall('getToken', array('email' => $user));
print gettype($token);
$speechFile = $soap->__soapCall('createSpeechFile', array(
'token' => $token,
'md5' => md5(md5($pwd).$token),
'text' => $txt,
'contentType' => 'text/plain',
'voiceId' => 'gb_amy',
'codecId' => 'mp3/22050'
)
);
$xx = file_get_contents($speechFile['soundUrl']);
file_put_contents($path, $xx);
}
我试图在Perl中运行这个:
use SOAP::Lite;
my $soap = SOAP::Lite->readable(1)->uri($urlPHP)->proxy($soapURL);
my $token = $soap->getToken({('email'=>$user)});
my $speechFile = $soap->createSpeechFile(
{
(
'token' => '$token',
'md5' => md5(md5($pwd) . '$token'),
'text' => $input,
'contentType' => 'text/plain',
'voiceId' => 'gb_amy',
'codecId' => 'mp3/22050'
)
}
);
print $speechFile;
我认为$token
与PHP的$token
不同?
答案 0 :(得分:2)
默认情况下,Perl中没有md5()
。您必须从Digest::MD5:
use Digest::MD5 qw/ md5 md5_hex /;
以后使用md5()
或md5_hex()
;我相信你需要后者。
我不确定你需要传递给$soap->createSpeechFile()
,但是如果
它是哈希引用(相当于PHP中的关联数组),我将删除
额外的括号。
甚至更好,提前定义选项:
my $opts = { # $opts will hold a hash reference
token => $token,
md5 => md5(md5($pwd) . $token),
text => $input,
contentType => 'text/plain',
voiceId => 'gb_amy',
codecId => 'mp3/22050'
};
$soap->createSpeechFile($opts);
$soap->getToken()
的相同帐户。
注意糖:你不必在x => "y"
的左侧使用任何引用
构造,如果它只有一个单词([_1-9a-zA-Z]+
)。
我猜你不想传递字符串$token
(我的意思是一个字面的美元后跟单词令牌),但是
而是变量$token
的内容。在Perl中,单引号不插入变量,所以
你可能想用双引号;但是在Perl中编写"$a"
没有意义,
您可以随时使用不带引号的$a
。
这在前面的例子中已经修复。