Watson Text to Speechで日本語をPOSTで送る方法を教えて下さい
文字コード問題の可能性があるので、まず事前情報として私の使用環境を書きます。
OS=Windows7 64bit
コンソール=コマンドプロンプト
使用しているcurlコマンド=Gitに同梱されていた物です。
curl -V
curl 7.30.0 (i386-pc-win32) libcurl/7.30.0 OpenSSL/0.9.8x zlib/1.2.7
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp smtp smtps telnet tftp
Features: AsynchDNS GSS-Negotiate IPv6 Largefile NTLM SPNEGO SSL SSPI libz
ここからが質問です。
どうすればPOSTで日本語を送れるでしょうか?
「こんにちは、ワトソン博士」と言う文字をPOSTで送りたいのですが、下記コマンドでは無音ファイル(ja_post.ogg)ができてしまいます。
curl -X POST -u "{userid}:{pasword}" -o "ja_post.ogg" -H "content-type:application/json" -d "{\"text\":\"こんにちは、ワトソン博士\"}" "https://stream.watsonplatform.net/text-to-speech/api/v1/synthesize?voice=ja-JP_EmiVoice"
**11/26結論追記
・Windowsのコマンドプロンプトでは文字コードがcp932のためNG!
・BOM無しUTF-8でファイルを作り、--data-binary @ファイル名
で送ればOK!
**
参考として以下は成功する例です。
英文のHelloを送ると、正常(?)に「えいちえるえるおー」と言う音声ファイルができます。
curl -X POST -u "{userid}:{pasword}" -o "ja_post.ogg" -H "content-type:application/json" -d "{\"text\":\"Hello\"}" "https://stream.watsonplatform.net/text-to-speech/api/v1/synthesize?voice=ja-JP_EmiVoice"
これと同様にjsonデータを-d "{\"text\":\"%E3%81... \"}"
と言うエンコードした文字に変えると、「ぱーせんといーさんぱーせんとはちいち...」と言うファイルが出来てしまいます。
POSTではなく、GETでエンコード文字を送ると正しく「こんにちは わとそんはくし」と言うファイルができます。
curl -u "{userid}:{pasword}" -o "ja_get.ogg" "https://stream.watsonplatform.net/text-to-speech/api/v1/synthesize?voice=ja-JP_EmiVoice&text=%E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%81%AF%E3%80%81%E3%83%AF%E3%83%88%E3%82%BD%E3%83%B3%E5%8D%9A%E5%A3%AB%22"
これはcurlの使い方が悪いのか、操作している環境が悪いのか、watsonサービス側の問題なのか。。。
ご教授願します。
追記 (エラーになるとの事なので コメントの内容を代わりに追記します)
C:\>chcp 現在のコード ページ: 932
C:\>chcp Active code page: 65001
コードページ65001(UTF-8)を試してみた理由は他のwatsonサービスでファイルの文字コードはUTF-8と言う記述があったので試してみました。
curlのオプションについは下記パターンを試しました。○の2つが上手く行った物です。ただし試したのはcp932状態だったかも・・・です。
+ ×:`-d "{\"text\":\"こんにちは、ワトソン博士\"}"`
+ ×:`--data-urlencode "{\"text\":\"こんにちは、ワトソン博士\"}"`
+ ×:`--data-binary "{\"text\":\"こんにちは、ワトソン博士\"}"`
+ ○:`-d "{\"text\":\"HelloWorld\"}"`
+ ○:`--data-binary "{\"text\":\"HelloWorld\"}"`
+ ×→◎:`--data-binary @ja_post.json` **※これで上手く行きました!!**
+ ×:`-d @ja_post.json`
+ ×:`-d =@ja_post.json`
※ja_post.jsonファイルの中身はUTF-8で{"text":"HelloWorld"}です
↑BOM付きUTF-8になってました! BOM無しUTF-8で正常終了しました♪
11/25追記 Yamazaki
--data-urlencodeの部分を修正しました。改めて試しましたがやはりダメでした。
ちなみにcp932での実行時画面は下記の通りで、見にくいですが、Received(太字)のサイズが明らかに小さくなっています。
curl -X POST -u "{userid}:{pasword}" -o "ja_post.ogg" -H "content-type:application/json" -d "{\"text\":\"Hello
\"}" "https://stream.watsonplatform.net/text-to-speech/api/v1/synthesize?voice=ja-JP_EmiVoice"
% Total % **Received** % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 **18060** 0 18044 100 16 7512 6 0:00:02 0:00:02 --:--:-- 7512
curl -X POST -u "{userid}:{pasword}" -o "ja_post.ogg" -H "content-type:application/json" --data-urlencode "{\"
text\":\"こんにちは、ワトソン博士\"}" "https://stream.watsonplatform.net/text-to-speech/api/v1/synthesize?voice=ja-JP_EmiVoice"
% Total % **Received** % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 **196** 0 105 100 91 69 60 0:00:01 0:00:01 --:--:-- 70
またコマンドプロンプトの文字コードを65001にすると漢字が入力できず、コピペの貼り付けも文字化けて"□□□□"的な表記になり、上手く行きません。
やはりwindowsだと何かとやりにくいですね・・・。
11/25 追記 Yamazaki
上記で無音ja_post.oggをテキストエディタで開くと、中身はなんとエラー応答のjsonファイルになってました!
これで少なくともwatsonサービスとして正当に(?)エラーを応答している事が分かりました。一歩前身です♪
{
"code_description": "Bad Request",
"code": 400,
"error": "No JSON object could be decoded"
}
でもこのエラーだとUTF-8のjsonが送られてないからエラーなのか、watson側が2バイト文字のjsonをパースできずにエラーなのかが分かりませんね・・・。
うむむ、試しにサーバー側にRESTでjson受け取るアプリ作ってcurlから投げて中身確かめてみるしか無いかなぁ・・・
11/26 追記 Yamazaki
-d "{\"text\":\"1\"}"
(全角の1)にした所、エラー応答が下記に変わりました。
{
"code_description": "Bad Request",
"code": 400,
"error": "UnicodeDecodeError: request body does not contain legal UTF-8. 'utf8' codec can't decode byte 0x82 in position 9: invalid start byte"
}
これはと思い、UTF-8でテキストファイルを作りなおして
--data-binary @ja_post.json
とした所「こんにちは わとそんはくし」と喋りました!!
上記で一度試しているのですがそのファイルがNGだった原因は使ったエディタの関係でBOM付きUTF-8になっていたためでした。。。 orz
これにて完全解決です!ありがうございました!!
※先頭に結論を追記しました。