Javascript - 具有音高和持续时间控制的文本到语音
Javascript - text to speech with pitch and duration control
我一直在考虑让我的javascript程序唱歌。
我首先查看了网络语音 API,但音高控制似乎非常有限,所以我想也许有一种方法可以将结果发送到网络音频节点,并从那里应用效果,但这似乎是不可能的。
我找到了.js的图书馆:http://www.masswerk.at/mespeak/
它允许返回一个音频缓冲区,我将将其视为音频节点的源,从而允许更多控制。
我的输入是一个音符序列,具有频率和持续时间。像这样:
var seq = [[440hz,1000ms],[880hz,500ms],...];
我设法从这个序列和一系列单词到我的程序中,以不同的频率有节奏地说这些单词
但是我遇到了一些问题。
- 网络音频失谐与播放速率相关联,因此音高将更改单词持续时间。 我
- 似乎只能使用失谐或播放速率值,这不允许我输入频率(例如 440)并在该频率下获得结果。我唯一能做的就是近似我演讲的基本频率,计算出与预期音符的差异并相应地音高,但结果不是很好。
- 我对如何处理持续时间一无所知。播放速率是人为更改单词持续时间的唯一方法吗?如何强制我的话传播到特定的持续时间?
如果你们中的任何人对这类东西有任何经验,我将不胜感激。
多谢
编辑:添加一些代码
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) { });
}
我的音序器正在工作,并且在每一步中,如有必要,调用 sings 函数,例如:
sing('test', 440, 1000)
正如我所说,我希望持续时间参数影响结果
Espeak 支持 SSML 模式,您需要使用它来修改参数,而不是尝试对结果进行后处理。
您需要先使用espeak,然后尝试在javascript端口中重现相同的结果。它尚不受支持,但在 messpeak 的这一部分中.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。
相关文章:
- 无法在Chrome控制台中使用javascript将焦点和光标设置为输入文本
- 如何用按钮控制文本区域滚动
- Javascript - 具有音高和持续时间控制的文本到语音
- 通过向动态id添加字符串,使用JavaScript控制文本框
- 是否可以控制typed.js插件何时启动和停止键入文本
- 使用 Jquery 控制文本值
- .text 未获取所有文本,但在控制台中工作
- 在控制台中显示数据集中的文本
- 使用 javascript 控制文本框
- 控制文本在 iframe(同一域)中的对齐和浮动
- 使用 d3 或 ajax 读取本地文件文本(制表符分隔值)会导致 Firefox 开发控制台中的语法错误
- 在 Chrome 文本输入字段中插入控制字符
- 我想获取控制台中显示的文本,并将该文本用于登录页面中的登录用户名
- 如何控制复制到剪贴板的文本
- html 我需要用图形代替 vcr 控件的文本来控制数据库中的状态
- 如何在Ratchet's的聊天应用程序,而不是控制台上的文本框
- 控制文本中自动换行的位置
- 控制文本框禁用或自述行为与复选框
- 当有人点击打开的链接时,控制文本区域
- 为什么我的asp文件上传控制文本框可以点击