19335


文字コード問題の可能性があるので、まず事前情報として私の使用環境を書きます。  
OS=Windows7 64bit  
コンソール=コマンドプロンプト  
使用しているcurlコマンド=Gitに同梱されていた物です。

[code]

    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
    
[/code]

ここからが質問です。  
**どうすればPOSTで日本語を送れるでしょうか？**  
「こんにちは、ワトソン博士」と言う文字をPOSTで送りたいのですが、下記コマンドでは無音ファイル(ja_post.ogg)ができてしまいます。

[code]

    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"
    
[/code]

**11/26結論追記  
・Windowsのコマンドプロンプトでは文字コードがcp932のためNG！  
・BOM無しUTF-8でファイルを作り、`--data-binary @ファイル名`で送ればOK！  
**

参考として以下は成功する例です。  
英文のHelloを送ると、正常(?)に「えいちえるえるおー」と言う音声ファイルができます。

[code]

    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"
    
[/code]

これと同様にjsonデータを`-d "{\"text\":\"%E3%81...
\"}"`と言うエンコードした文字に変えると、「ぱーせんといーさんぱーせんとはちいち...」と言うファイルが出来てしまいます。

POSTではなく、GETでエンコード文字を送ると正しく「こんにちは わとそんはくし」と言うファイルができます。

[code]

    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"
    
[/code]

これはcurlの使い方が悪いのか、操作している環境が悪いのか、watsonサービス側の問題なのか。。。  
ご教授願します。

**追記** (エラーになるとの事なので コメントの内容を代わりに追記します)

[code]

    C:\>chcp 現在のコード ページ: 932
    C:\>chcp Active code page: 65001
    
[/code]

コードページ65001(UTF-8)を試してみた理由は他のwatsonサービスでファイルの文字コードはUTF-8と言う記述があったので試してみました。

curlのオプションについは下記パターンを試しました。○の２つが上手く行った物です。ただし試したのはcp932状態だったかも・・・です。

[code]

    + ×：`-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`
    
[/code]

※ja_post.jsonファイルの中身はUTF-8で{"text":"HelloWorld"}です

##  ↑BOM付きUTF-8になってました！ BOM無しUTF-8で正常終了しました♪

11/25追記 Yamazaki  
\--data-urlencodeの部分を修正しました。改めて試しましたがやはりダメでした。  
ちなみにcp932での実行時画面は下記の通りで、見にくいですが、Received(太字)のサイズが明らかに小さくなっています。

[code]

    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
    
[/code]

またコマンドプロンプトの文字コードを65001にすると漢字が入力できず、コピペの貼り付けも文字化けて"□□□□"的な表記になり、上手く行きません。  
やはりwindowsだと何かとやりにくいですね・・・。

* * *

11/25 追記 Yamazaki  
上記で無音ja_post.oggをテキストエディタで開くと、中身はなんとエラー応答のjsonファイルになってました！  
これで少なくともwatsonサービスとして正当に(?)エラーを応答している事が分かりました。一歩前身です♪

[code]

    {
       "code_description": "Bad Request", 
       "code": 400, 
       "error": "No JSON object could be decoded"
    }
    
[/code]

でもこのエラーだとUTF-8のjsonが送られてないからエラーなのか、watson側が２バイト文字のjsonをパースできずにエラーなのかが分かりませんね・・・。  
うむむ、試しにサーバー側にRESTでjson受け取るアプリ作ってcurlから投げて中身確かめてみるしか無いかなぁ・・・

* * *

11/26 追記 Yamazaki  
`-d "{\"text\":\"１\"}"` （全角の１）にした所、エラー応答が下記に変わりました。

[code]

    {
       "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"
    }
    
[/code]

これはと思い、UTF-8でテキストファイルを作りなおして  
`--data-binary @ja_post.json` とした所「こんにちは わとそんはくし」と喋りました！！  
上記で一度試しているのですがそのファイルがNGだった原因は使ったエディタの関係でBOM付きUTF-8になっていたためでした。。。 orz

これにて完全解決です！ありがうございました！！  
※先頭に結論を追記しました。


CC BY-SA 3.0
2015-11-20T04:18:48.480
19068
2015-11-27T01:34:08.970
2015-11-26T15:01:26.700
3639
13147
question
bluemix
Watson Text to Speechで日本語をPOSTで送る方法を教えて下さい


コメントをヒントに無事解決しました。  
上手く行かない理由は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"`


CC BY-SA 3.0
2015-11-26T11:24:33.363
19335
2015-11-27T01:34:08.970
2015-11-27T01:34:08.970
13147
13147
19068
answer