0

几天来,我尝试使用 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

4

1 回答 1

2
  1. Perl 默认没有md5()您必须从Digest::MD5中提取它:

    use Digest::MD5 qw/ md5 md5_hex /;
    

    稍后使用md5()or 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.

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

于 2012-08-09T20:25:59.173 回答