Skip to content

Instantly share code, notes, and snippets.

@hackugyo
Last active August 29, 2015 14:05
Show Gist options
  • Select an option

  • Save hackugyo/3ed7d097cb9c9569fc24 to your computer and use it in GitHub Desktop.

Select an option

Save hackugyo/3ed7d097cb9c9569fc24 to your computer and use it in GitHub Desktop.
`HTML5の音声合成でコンピューターが話している感じの音声を実現してみる - Qiita <http://qiita.com/ikko/items/10d76d67b4e60e00f02c>`_
$ say -o Modulating_Phase -v Victoria "Modulating Phase"
$ ffmpeg -i Modulating_Phase.aiff -ar 11025 -ab 8 1.mp3
$ afplay 1.mp3 # play your sound

エフェクト用音声はこことか

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>デモ:クライシスコアFFVIIのナビゲーション音声をHTML5でできる限り再現してみた</title>
<link rel="shortcut icon" type="image/x-icon" href="/favicon.ico">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script type="text/javascript">
var files = [
"sound/spreader50-65ms.wav", // エフェクト用
"sound/Modulating_Phase.mp3",
"sound/Activating_Combat_Mode.mp3",
"sound/Conflict_Resolved.mp3",
"sound/Activating_Combat_Mode_Daniel.mp3",
"sound/Activating_Combat_Mode_Emily.mp3",
"sound/Activating_Combat_Mode_Jill.mp3",
"sound/Activating_Combat_Mode_Monica.mp3",
"sound/Activating_Combat_Mode_Samantha.mp3",
"sound/Activating_Combat_Mode_Serena.mp3",
"sound/Activating_Combat_Mode_Kyoko.mp3",
];
if(typeof(webkitAudioContext)!=="undefined")
var audioctx = new webkitAudioContext();
else if(typeof(AudioContext)!=="undefined")
var audioctx = new AudioContext();
var source = null;
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();
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();
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);
}
function RawPlay(number) {
source = audioctx.createBufferSource();
source.buffer = buffers[number];
var compressor = audioctx.createDynamicsCompressor();
var volume = audioctx.createGain();
source.connect(volume);
volume.gain.value = 1;
volume.connect(compressor);
compressor.connect(audioctx.destination);
source.start(0);
}
</script>
</head>
<body onload="LoadBuffers()">
<a class="btn btn-lg btn-primary" href="#" role="button" onclick="Play(2)">Activating Combat Mode</a>
<a class="btn btn-lg btn-primary" href="#" role="button" onclick="RawPlay(2)">Activating Combat Mode</a><br>
<a class="btn btn-lg btn-primary" href="#" role="button" onclick="Play(4)">Activating Combat Mode</a><br>
<a class="btn btn-lg btn-primary" href="#" role="button" onclick="Play(5)">Activating Combat Mode</a><br>
<a class="btn btn-lg btn-primary" href="#" role="button" onclick="Play(6)">Activating Combat Mode</a><br>
<a class="btn btn-lg btn-primary" href="#" role="button" onclick="Play(7)">Activating Combat Mode</a><br>
<a class="btn btn-lg btn-primary" href="#" role="button" onclick="Play(8)">Activating Combat Mode</a><br>
<a class="btn btn-lg btn-primary" href="#" role="button" onclick="Play(9)">Activating Combat Mode</a><br>
<a class="btn btn-lg btn-primary" href="#" role="button" onclick="Play(10)">Activating Combat Mode</a><br>
</body>
</html>
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);
}
# -*- coding: utf-8 -*-
ARGV.each do |title|
puts title
`say -v Samantha "#{title}"`
`say -o #{title} -v Samantha "#{title}"`
`mkdir -p ./sound`
`ffmpeg -i #{title}.aiff -ar 11025 -ab 8 sound/#{title}.mp3`
`rm #{title}.aiff`
# `afplay sound/#{title}.mp3`
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment