使用SOAP和Perl连接到ivona.com服务

时间:2012-08-09 19:29:11

标签: perl soap

我试图使用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不同?

1 个答案:

答案 0 :(得分:2)

  1. 默认情况下,Perl中没有md5()。您必须从Digest::MD5

    中提取它
    use Digest::MD5 qw/ md5 md5_hex /;
    

    以后使用md5()md5_hex();我相信你需要后者。

  2. 我不确定你需要传递给$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]+)。

  3. 我猜你不想传递字符串$token(我的意思是一个字面的美元后跟单词令牌),但是 而是变量$token内容。在Perl中,单引号不插入变量,所以 你可能想用双引号;但是在Perl中编写"$a"没有意义, 您可以随时使用不带引号的$a

    这在前面的例子中已经修复。