こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

-広告-

解決済みの質問

[PHP] AITalkの音声合成APIで困った

file_get_contents の返り値が false で困っています!!


Docomoさんがエーアイさんの音声合成APIを提供しています.
エーアイの音声合成APIの中でも,「SSML」を利用しようとしています.

・ドコモさんのHP
https://dev.smt.docomo.ne.jp/?p=docs.api.page&api_docs_id=70
・SSMLについて
https://dev.smt.docomo.ne.jp/?p=docs.api.page&api_docs_id=71#tag01

SSMLを利用しようとPHPで実装して実行するも file_get_contents でエラーになってしまいます.
(エラー:failed to open stream: HTTP request failed! )

コードは以下のように記述しました.

<?php

// コード書く際に参考にしたサイト
// http://www.d-labo.net/laboratory/php/7001.php
// http://stackoverflow.com/questions/9412650/how-to-fix-411-length-required-error-with-file-get-contents-and-the-expedia-xml

function post($url, $data) {
if (!ini_get('allow_url_fopen'))
throw new Exception("Not Allowed URL Open!");

//headersは仕様通りに記述したつもり
$headers = array(
'Content-Type:application/ssml+xml',
'Accept:audio/L16',
'Content-Length:'.sprintf("%d",strlen($data))
);

//methodは必ずPOSTと仕様書にあった
$stream = stream_context_create(array('http' => array(
'method' => 'POST',
'header' => implode("\n",$headers),
'content' => $data
)));

//XXX: file_get_contentsの返り値が必ず false になってしまう
return file_get_contents($url, false, $stream);

}

////// usage sample
////// 申し訳ないのですが,APIKEYを第三者に提供することはできません.

try {
$url = 'https://api.apigw.smt.docomo.ne.jp/aiTalk/v1/textToSpeech?APIKEY=XXXXXXXXXX';

$xml = '<?xml version="1.0" encoding="utf-8" ?><speak version="1.1"><voice name="nozomi">エーアイの音声合成エンジンによる音声です。</voice><break time="1000ms" /><voice name="seiji">エーアイの音声合成エンジンによる音声です。</voice></speak>';

$hoge = post($url,$xml);
var_dump($hoge);

} catch (Exception $e) {
var_dump($e);
}

?>

以上のコードが記述されたファイル(text_to_voice.php)をターミナルで実行

$ php text_to_voice.php

Warning: file_get_contents(https://api.apigw.smt.docomo.ne.jp/aiTalk/v1/textToSpeech?APIKEY=XXXXXXXXX): failed to open stream: HTTP request failed! in text_to_voice.php on line 26
bool(false)


以上になります.どうやったら file_get_contents の返り値が false じゃなくなるのか知りたいです.
よろしくお願い致します.

画像にはリクエストヘッダーの内容とAPIのURLが記述されており,
画像にあるのを参照しました.

投稿日時 - 2014-10-07 23:51:48

QNo.8782761

すぐに回答ほしいです

質問者が選んだベストアンサー

>'header' => implode("\n",$headers),

HTTPヘッダの改行はCRLF("\r\n")では?

投稿日時 - 2014-10-08 06:39:52

お礼

おっしゃる通りでした.修正したら上手くいきました.
誤 'header' => implode("\n",$headers) 
正 'header' => implode("\r\n",$headers) 

ありがとうございます.本当に助かりました.

投稿日時 - 2014-10-08 08:26:33

ANo.1

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

-広告-
-広告-

回答(1)

-広告-
-広告-
-広告-
-広告-