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;

$tokenPHPとは違うと思います$tokenか?

4

1 に答える 1

2
  1. md5()デフォルトでは、Perl にはありません。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文字列(リテラルのドルの後にトークンという単語が続くことを意味します) を渡すのではなく、 variableの内容を渡したいと思います$token。Perl では、一重引用符は変数を補間しないため、二重引用符を使用したい場合があります。ただし、Perl で記述"$a"しても意味がありません。いつでも unquoted を使用できます$a

    これは、前の例で既に修正されています。

于 2012-08-09T20:25:59.173 に答える