前提・実現したいこと
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の書き方がおかしいのでしょうか?何卒よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/04/11 00:50
2019/04/11 02:17