IBM watson のtext to speechを利用してWindows上で日本語の音声ファイルを作成する方法（テキスト：日本語→音声：日本語）


IBM
watsonを参考にWindowsのコマンドプロンプトを使用して、日本語のテキストを変換して日本語の音声ファイルを作成し、再生したいと考えています。日本語のテキストを変換して日本語の音声ファイルを作成するコマンドを教えていただきたいです。

使用したコマンドは下記の通りです。

[code]

    curl -X POST -u "apikey:APIKEY" --header "Content-Type: application/json" --header "Accept: audio/wav" --data "{\"text\":\"東京\"}" --output sample.wav "URL/v1/synthesize?voice=ja-JP_EmiVoice"
    
[/code]

生成されたsample.wavにはテキストで次の内容となっていました。

[code]

    { "error": "'utf-8' codec can't decode byte 0x93 in position 9: invalid start byte", "code": 400, "code_description": "Bad Request" }
    
[/code]




WindowsのコマンドプロンプトはANSI（日本語版ではShift-JIS）エンコーディングを使用します。より正確にはプロセス起動側がANSI /
Unicodeどちらでも選べて今回のcmd.exeはUnicodeを使用します。起動されたプロセスもANSI /
Unicodeどちらも選べますが、今回のcurl.exeはANSIを選択します。  
そのため、 `--data "{\"text\":\"東京\"}"` とした場合にShift-
JISエンコーディングのバイト列がcurl.exeに渡されます。

curl.exeで行うためにはコマンドライン引数を使うのではなく、UTF-8エンコーディングで作成したファイルを渡すのが確実でしょうか。お手数ですがメモ帳で

[code]

    {"text":"東京"}
    
[/code]

という内容のファイルを作成しUTF-8で保存してください。 `--data @ファイル名` を指定すれば期待する動作をするのではないでしょうか。

* * *

しかし、質問には「コマンドプロンプトを使用して」とあります。メモ帳が介在するのは期待しない手順かと思います。この場合、PowerShellを使用するのが確実です。

[code]

    PS> $json = ConvertTo-Json -Compress @{text = "東京"}
    PS> $bytes = [Text.Encoding]::UTF8.GetBytes($json)
    PS> $pass = ConvertTo-SecureString "APIKEY" -AsPlainText -Force
    PS> $cred = [PSCredential]::new("apikey", $pass)
    PS> Invoke-WebRequest -Method POST -Credential $cred -ContentType application/json -Headers @{Accept = "audio/wav"} -Body $bytes -OutFile sample.wav -Uri URL/v1/synthesize?voice=ja-JP_EmiVoice
    
[/code]

残念ながら割といろいろ書く必要があって大変です…。




WindowsのコマンドプロンプトはANSI（日本語版ではShift-JIS）エンコーディングを使用します。より正確にはプロセス起動側がANSI /
Unicodeどちらでも選べて今回のcmd.exeはUnicodeを使用します。起動されたプロセスもANSI /
Unicodeどちらも選べますが、今回のcurl.exeはANSIを選択します。  
そのため、 `--data "{\"text\":\"東京\"}"` とした場合にShift-
JISエンコーディングのバイト列がcurl.exeに渡されます。

curl.exeで行うためにはコマンドライン引数を使うのではなく、UTF-8エンコーディングで作成したファイルを渡すのが確実でしょうか。お手数ですがメモ帳で

[code]

    {"text":"東京"}
    
[/code]

という内容のファイルを作成しUTF-8で保存してください。 `--data @ファイル名` を指定すれば期待する動作をするのではないでしょうか。

* * *

しかし、質問には「コマンドプロンプトを使用して」とあります。メモ帳が介在するのは期待しない手順かと思います。この場合、PowerShellを使用するのが確実です。

[code]

    PS> $json = ConvertTo-Json -Compress @{text = "東京"}
    PS> $bytes = [Text.Encoding]::UTF8.GetBytes($json)
    PS> $pass = ConvertTo-SecureString "APIKEY" -AsPlainText -Force
    PS> $cred = [PSCredential]::new("apikey", $pass)
    PS> Invoke-WebRequest -Method POST -Credential $cred -ContentType application/json -Headers @{Accept = "audio/wav"} -Body $bytes -OutFile sample.wav -Uri URL/v1/synthesize?voice=ja-JP_EmiVoice
    
[/code]

残念ながら割といろいろ書く必要があって大変です…。

