質問: 文字コード問題の可能性があるので、まず事前情報として私の使用環境を書きます。 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 これにて完全解決です!ありがうございました!! ※先頭に結論を追記しました。
回答: コメントをヒントに無事解決しました。 上手く行かない理由はWindowsのコマンドプロンプトを使用したため。コマンドプロンプト上で入力した文字はcp932で送られる。(UTF-8じゃないのでNGとなる) コマンドプロンプトで試す場合は、別途BOM無しUTF-8でテキストファイルを作り、そのファイルを`--data-binary @ファイル名`で送ればOK! コマンド全体としては下記の通り。(BOM無しUTF-8でinputText.jsonファイルを指定) `curl -X POST -u "{userid}:{pasword}" -o "ja_post.ogg" -H "content-type:application/json" --data-binary @inputText.json "https://stream.watsonplatform.net/text-to-speech/api/v1/synthesize?voice=ja-JP_EmiVoice"`