質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Google Home

Google Homeは、Google社が開発したスマートスピーカーです。無線通信接続機能と音声操作の「Googleアシスタント」という機能を搭載。話しかけることで、音楽を聞いたり、写真や画像を見たり、様々なサービスを起動することができます。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Q&A

解決済

1回答

767閲覧

node.jsでDOCOMO音声合成APIを使いたい

syota0304

総合スコア13

Google Home

Google Homeは、Google社が開発したスマートスピーカーです。無線通信接続機能と音声操作の「Googleアシスタント」という機能を搭載。話しかけることで、音楽を聞いたり、写真や画像を見たり、様々なサービスを起動することができます。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

0グッド

0クリップ

投稿2019/04/10 13:09

前提・実現したいこと

node.jsでDOCOMOの音声合成APIを叩き、Google-Home-Notifierで再生するアプリを作成しています。
APIにリクエストを送り、レスポンスボディに入っているであろう音声バイナリをrawに書き出す機能を実装中に以下の問題が発生しました。

該当のソースコード

nodejs

1var fs = require('fs'); 2var request = require('request'); 3var xml = fs.readFileSync("docomotts.xml","utf8"); 4var stream = fs.writeFileSync("test.raw",); 5 6var options = { 7 uri:"https://api.apigw.smt.docomo.ne.jp/aiTalk/v1/textToSpeech", 8 headers:{ 9 "Content-Type":"application/ssml+xml", 10 "Accept":"audio/L16" 11 }, 12 qs:{ 13 "APIKEY":"xxxxxxxx" 14 }, 15 body:xml, 16 } 17 18request.post(options,function(error,res,body){ 19 fs.writeFileSync("temp.raw",body,"binary"); 20 console.log(res.statusCode); 21 console.log(res.headers); 22});

xml

1<?xml version="1.0" encoding="utf-8" ?> 2<speak version="1.1"> 3<voice name="nozomi"> 4のぞみです。おはようございます。 5</voice> 6<break time="1000ms" /> 7<voice name="seiji"> 8せいじです。こんにちは。 9</voice> 10</speak>

ログ

200 { 'content-type': 'audio/L16; rate=16000; channels=1', 'content-length': '257218', connection: 'close', date: 'Wed, 10 Apr 2019 12:06:33 GMT', 'x-amzn-requestid': 'xxxxxxxx', 'access-control-allow-origin': '*', 'x-amzn-remapped-connection': 'keep-alive', 'x-amz-apigw-id': 'xxxxxxxx', 'x-amzn-remapped-server': 'unknown', 'cache-control': 'no-store', 'x-amzn-remapped-date': 'Wed, 10 Apr 2019 12:06:32 GMT', 'x-cache': 'Miss from cloudfront', via: '1.1 xxxxxxxx.cloudfront.net (CloudFront)', 'x-amz-cf-id': 'xxxxxxxx' }

試したこと

出力されたtemp.rawをsoxやaudacityでwavに変換してもノイズが乗って再生される。

sox -t raw -r 16k -e signed -b 16 -B -c 1 "temp.raw" "temp.wav"

補足情報(FW/ツールのバージョンなど)

ドコモ音声合成API
https://dev.smt.docomo.ne.jp/?p=docs.api.page&api_name=text_to_speech&p_name=api_1#tag01

node v10.15.3
request v2.88.0
を使用しています。

ドコモのwebサイト上でAPIの動作確認ができます。(登録要)
そのサイト上で同様のリクエストを行い、ダウンロードしたデータについては問題なく再生できています。
node.js上で確認できるcontent-lengthとweb上で確認できるcontent-lengthが同サイズ(両者とも257,218byte)なので、問題なくリクエストされていると思いますが、
出力されるtemp.rawが少し小さくなってしまいます。(出力ファイルサイズが256,310byte、web上でダウンロードできるのが257,218byte)

fs.writeFileSyncの書き方がおかしいのでしょうか?何卒よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

syota0304さん、

requestで使うoptionsに、encoding : null を追加してみて下さい。

var options = { uri:"https://api.apigw.smt.docomo.ne.jp/aiTalk/v1/textToSpeech", headers:{ "Content-Type":"application/ssml+xml", "Accept":"audio/L16" }, qs:{ "APIKEY":"xxxxxxxx" }, body:xml, encoding: null, //# <<== 追加: }

投稿2019/04/10 22:25

mt08

総合スコア1825

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

syota0304

2019/04/11 00:50

ありがとうございます。無事に再生できました。
mt08

2019/04/11 02:17

無事動作してよかったです。 バイナリデータを取得するときは、そのように設定します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問