デモページ
実際の出力はデモページで試すことができます。
http://garoo.jp/demo/ffcc/
やりたかったこと
ナビゲーションの音声を作りたくて、どうせならクライシスコアファイナルファンタジーVIIの戦闘のナビゲーションのようなコンピューターっぽい音声にしてみたかったので調べてみたが、HTML5でできそうだったので試してみた。

やったこと
Macのsayコマンドで音声データを作成
Macのコンソールで下記コマンドを叩く。
say -o Modulating_Phase -v Samantha "Modulating Phase"
aiffファイルで出力されるので、iTunesでmp3に変換
参考サイト:Mac Text To Speechでしゃべらせた内容をAIFFで保存
html5で実装
- 音声ファイルとインパルス応答用のファイルを読み込む。
- 音声ファイルにインパルス応答用のファイルを合成する。
- 出力する。
sound.js
var files = [
    "sounds/spreader50-65ms.wav",
    "sounds/Modulating_Phase.mp3",
    "sounds/Activating_Combat_Mode.mp3",
    "sounds/Conflict_Resolved.mp3",
];
 
if(typeof(webkitAudioContext)!=="undefined")
    var audioctx = new webkitAudioContext();
else if(typeof(AudioContext)!=="undefined")
    var audioctx = new AudioContext();
 
var source = null;
var convolver = audioctx.createConvolver();
var revlevel = audioctx.createGain();
revlevel.gain.value = 6;
convolver.connect(revlevel);
revlevel.connect(audioctx.destination);
var compressor = audioctx.createDynamicsCompressor();
var volume = audioctx.createGain();
var buffers = [];
var loadidx = 0;
var req = new XMLHttpRequest();
 
function LoadBuffers() {
    req.open("GET", files[loadidx], true);
    req.responseType = "arraybuffer";
    req.onload = function() {
        if(req.response) {
            audioctx.decodeAudioData(req.response,function(b){
                buffers[loadidx]=b;
                if(++loadidx < files.length)
                    LoadBuffers();
            },function(){});
        }
        else
            buffers[loadidx] = audioctx.createBuffer(VBArray(req.responseBody).toArray(), false);
    };
    req.send();
}
function Play(number) {
    source = audioctx.createBufferSource();
    source.buffer = buffers[number];
    convolver.buffer = buffers[0];
    source.connect(volume);
    volume.gain.value = 1;
    volume.connect(compressor);
    compressor.connect(convolver);
    compressor.connect(audioctx.destination);
    source.start(0);
}
参考サイト:Web Audio API を使用したゲーム用音声の開発
やれなかったこと
完成した音声ファイルの出力