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

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

新規登録して質問してみよう
ただいま回答率
85.48%
HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

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

Q&A

解決済

1回答

4540閲覧

JavaScriptにおけるリニアPCMの再生(DOCOMO音声合成API)

退会済みユーザー

退会済みユーザー

総合スコア0

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

JavaScript

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

0グッド

1クリップ

投稿2018/05/30 16:32

現在、docomoから提供されている音声合成APIのうち、エーアイ社提供のものを使用しようとしています。REST APIの形で、音声データを受け取る部分までは、以下のようなコードで作成することができました。

html

1<!DOCTYPE html> 2<html> 3 <head> 4 <script src="voice.js"></script> <!-- 下記のjavascriptファイル --> 5 </head> 6 <body> 7 <div> 8 音声合成テスト 9 <button onclick="voiceRequest();">再生</button> 10 </div> 11 </body> 12</html>

javascript

1function voiceRequest() { 2 console.log("ボタンが押されました"); 3 4 var url = 'https://api.apigw.smt.docomo.ne.jp/aiTalk/v1/textToSpeech?APIKEY={APIキー}'; 5 var ssml = '<?xml version="1.0" encoding="utf-8" ?><speak version="1.1"><voice name="sumire"><prosody rate="1.4" pitch="1.2">こんにちは。音声合成のテストです。</prosody></voice></speak>' 6 7 var xhr = new XMLHttpRequest(); 8 xhr.open('POST',url); 9 xhr.setRequestHeader('Content-Type','application/ssml+xml'); 10 xhr.setRequestHeader('Accept','audio/L16'); 11 12 xhr.onload = function() { 13 if (this.status == 200) { 14 // この時点で音声データはリニアPCM形式で取得できている 15 } 16 }; 17 xhr.send(ssml); 18 19}

コード内に記述の通り、リニアPCM形式の音声データを取得するところまではできるのですが、そのままブラウザで再生しよう、様々な方法を試しても、上手くいきません。

試したこと

1. audio要素を使う

単純に、audio要素を使って再生しようとしても、再生することができませんでした。(PCMデータにはサンプリングレートなどのメタデータが入っていないので当たり前か…?)

2. Web Audio APIを使う

これも再生されませんでした。

javascript

1// 準備 2window.AudioContext = window.AudioContext || window.webkitAudioContext; 3var context = new AudioContext(); 4 5// 音声を取得できた後(this.responseが取得したデータ) 6var source = context.createBufferSource(); 7source.buffer = this.response; 8source.connect(context.destination); 9source.start(0);

(ここには記していませんが、いったんblobに格納してから、source.buffer = blobにしても同様。)

3. 有志のライブラリを使う

pcm-playerというものを作っている方がいたので、これを使って試してみましたが、やはり再生されませんでした。

javascript

1// 準備 2var player = new PCMPlayer({ 3 encoding: '16bitInt', 4 channels: 1, 5 sampleRate: 16000, 6 flushingTime: 1000 7}); 8 9// 音声を取得できた後(this.responseが取得したデータ) 10player.feed(this.response);

取得されている音声

公式のドキュメントにも記されている通りです。

  • 符号化方式: リニアPCM
  • チャネル数: 1(モノラル)
  • サンプル周波数: 16000
  • ビット深度: 16bit(ビッグエンディアン)

以上、何か分かる方がいらっしゃいましたらご教授いただけると幸いです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

受け取ったデータはJavaScript上で素のPCMが入ったArrayBufferなりBlobなりになっているということでしょうか。
IE以外ではaudio要素でWAVファイルが再生できますので、PCMのデータにWAVとしてのヘッダを付けたデータを生成してaudioに放り込むとよいと思います。

参考: JavaScriptで生成した波形をHTML5のaudioで再生
http://wentwayup.tamaliver.jp/e412166.html

投稿2018/06/01 14:38

ikadzuchi

総合スコア3047

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問