我一直致力于使用Javascript转录语音录音的工具。基本上我正在连接关键事件来播放,暂停和循环使用audio
标签读入的文件。
有许多先进的现有桌面应用程序可用于执行此类操作(例如Transcriber - 此处为screenshot)。大多数转录工具都有内置波形,可用于跳转音频文件,这非常有用,因为转录员可以学会直观地查找和重复或循环短语。
我想知道是否可以使用Javascript在浏览器中模拟此功能的子集。我对信号处理知之甚少,也许它甚至不可行。
但我想象的是Javascript从文件中读取声音流,并定期对幅度进行采样。如果幅度非常低,超过某个阈值时间,那么这将被称为短语中断。
我认为这种标签对转录非常有用。然后我可以设置关键命令跳转到上一个沉默期。所以假设(想象一个基于jQuery的API):
var audio = $('audio#someid');
var silences = silenceFindingVoodoo(audio);
silences
将包含一个时间列表,因此我可以通过某种方式让用户跳过各种silence
,然后将currentTime
设置为选择价值,并发挥它。
甚至可以想象用Javascript做这类事情?
答案 0 :(得分:1)
据我所知,JavaScript的功能不足以做到这一点。
您必须使用闪存或某种服务器端处理才能执行此操作。
使用HTML5音频/视频标签,您可能会欺骗页面执行此类操作。您可以(假设)识别服务器端的静音,并将这些静默的时间戳作为页面中的元数据(隐藏字段或其他内容)发送给客户端,然后使用它来允许JavaScript识别音频文件中的那些位置。
答案 1 :(得分:1)
如果您使用WebWorker线程,您可以在Javascript中执行此操作,但这需要在浏览器中使用更多线程来执行此操作。您可以将问题分解为多个线程并对其进行处理,但是,将此问题与回放同步几乎是不可能的。因此,Javascript可以通过执行一些音频处理来确定静默期,但由于您无法将其与播放良好地链接,因此它不是最佳选择。
但是,如果您想向用户显示波形,那么可以使用javascript和canvas进行此操作,但是请参阅下一段进行流式处理。
你最好的选择是让服务器流式传输音频,它可以进行处理并找到所有的静音。然后将其中的每一个保存在一个单独的文件中,以便您可以轻松地在静音之间跳转,并通过流式传输,您的服务器应用程序可以确定何时加载新文件,因此没有中断。
答案 2 :(得分:1)
我认为JavaScript不是您想用来处理这些音频文件的工具 - 这就是要求麻烦。但是,javascript可以轻松读取相应的XML文件,该文件描述了音频文件中出现这些静音的位置,并适当调整用户界面。那么,问题是你用什么来生成那些XML文件:
如果您需要立即演示此功能,可以手动执行此操作。 (使用audacity查看这些音频信封的出现位置)
查看此CodeProject article,它会在C#中创建一个wav处理库。作者创建了一个从输入文件中提取静音的函数。可能是开始黑客攻击的好地方。
我最初的两个想法......那里有很多音频处理API,但它们是针对特定的框架和应用程序编程语言编写的。在尝试从头开始写东西之前一定要充分利用它们......除非你碰巧真的喜欢傅里叶变换。
答案 3 :(得分:1)
我认为这是可能使用javascript(当然可能不可取)。这篇文章:
https://developer.mozilla.org/En/Using_XMLHttpRequest#Handling_binary_data
...讨论如何以二进制数据的形式访问文件,一旦你将音频文件作为二进制数据,你可以用它做任何你想做的事情(我想,无论如何 - 我用javascript并不是很强大)。对于WAV格式的音频文件,这将是一项微不足道的练习,因为数据已经按时域中的样本进行组织。对于压缩格式的音频文件(如MP3),将压缩数据转换回时域样本在javascript中是非常难以做到的,如果你成功地做到了,我会在你身边发现一种宗教信仰。
更新:在再次阅读您的问题之后,我意识到实际上可能会在javascript中进行您正在讨论的内容,即使文件是MP3格式而不是WAV格式。正如我理解你的问题,你实际上只是想在音频流中寻找沉默点,而不是实际剥离无声的延伸。
要找到静音延伸,您不一定需要将MP3文件的频域数据转换回WAV文件的时域。事实上,识别音频中的静音延伸实际上可以在频域中比在时域中更可靠地完成。静音延伸往往具有明显平坦的频率响应图,而在时域中,可听语音的峰值幅度有时不会高于背景噪声的峰值,尤其是在自动调平发生时。
如果文件是CBR(恒定比特率)而不是VBR(可变比特率),则在javascript中分析MP3文件会更加容易。
答案 4 :(得分:0)
是的,Web Audio API是可能的,更准确地说,您将需要AnalyserNode。为了给您一个简短的概念证明,您可以获得this example,并将以下代码添加到drawTimeDomain()
:
var threshold = 1000;
var sum = 0;
for (var i in amplitudeArray) {
sum += Math.abs(128 - amplitudeArray[i]);
}
var test = (sum < threshold) ? 'silent' : 'sound';
console.log('silent info', test);
您只需要一个附加逻辑即可以毫秒为单位过滤静音(例如,任何耗时超过500毫秒的静音都应视为真正的静音)