我一直在寻找让我的javascript程序唱歌。
我首先看了网络语音api,但音调控制似乎非常有限,所以我想也许有办法将结果发送到网络音频节点,并从那里应用效果,但它没有似乎有可能。
我找到了mespeak.js库:http://www.masswerk.at/mespeak/
它允许返回我将视为音频节点源的音频缓冲区,从而实现更多控制。
我的输入是音符序列,具有频率和持续时间。类似的东西:
var seq = [[440hz,1000ms],[880hz,500ms],...];
我设法从这个序列和一系列单词到我的程序中说出那些节奏不同频率的单词
但我有一些问题。
如果你们中有任何人对这种东西有任何经验,我会感激任何意见。
非常感谢
编辑:添加一些代码
function sing(text,note,duration){
var buffer = meSpeak.speak(text,{rawdata:'default'});
playSound(buffer,freqToCents(note),duration)
}
function freqToCents(freq){
var root = 440 //no idea what is the base frequency of the speech generator
return 3986*Math.log10(freq/440)
}
function playSound(streamBuffer, cents, duration, callback) {
var source = context.createBufferSource();
source.connect(compressor);
context.decodeAudioData(streamBuffer, function(audioData) {
var duration = audioData.duration;
var delay = (duration)? Math.ceil(duration * 1000) : 1000;
setTimeout(callback, delay);
source.buffer = audioData;
source.detune.value = cents;
source.start(0);
}, function(error) { });
}
我的音序器正在工作,并且在每个步骤中,如有必要,调用唱歌功能,例如:
sing('test', 440, 1000)
正如我所说,我希望持续时间参数影响结果
答案 0 :(得分:1)
Espeak supports SSML mode,您需要使用它来修改参数,而不是尝试后处理结果。
您需要先使用espeak,然后尝试在javascript端口重现相同的结果。它尚不支持,但在mespeak.js的这一部分
'-w', 'wav.wav',
'-a', (typeof args.amplitude !== 'undefined')? String(args.amplitude) : (typeof args.a !== 'undefined')? String(args.a) : '1
'-g', (typeof args.wordgap !== 'undefined')? String(args.wordgap) : (typeof args.g !== 'undefined')? String(args.g) : '0',
'-p', (typeof args.pitch !== 'undefined')? String(args.pitch) : (typeof args.p !== 'undefined')? String(args.p) : '50',
'-s', (typeof args.speed !== 'undefined')? String(args.speed) : (typeof args.s !== 'undefined')? String(args.s) : '175',
您需要添加-m
选项以启用SSML。