使用Javascript可以在音频文件中找到沉默的延伸吗?

使用Javascript可以在音频文件中找到沉默的延伸吗?,javascript,audio,signal-processing,Javascript,Audio,Signal Processing,我一直在开发一个用Javascript转录语音记录的工具。基本上,我正在连接关键事件以播放、暂停和循环使用audio标记读入的文件 有许多先进的现有桌面应用程序可以做这类事情(比如——这里有一个例子)。大多数转录工具都有一个内置的波形,可以用来在音频文件中跳转,这非常有帮助,因为转录者可以学习视觉上查找、重复或循环短语 我想知道是否有可能在浏览器中用Javascript模拟这个功能的一个子集。我对信号处理知之甚少,也许它甚至不可行 但我设想的是Javascript从文件中读取声音流,并定期采样振

我一直在开发一个用Javascript转录语音记录的工具。基本上,我正在连接关键事件以播放、暂停和循环使用
audio
标记读入的文件

有许多先进的现有桌面应用程序可以做这类事情(比如——这里有一个例子)。大多数转录工具都有一个内置的波形,可以用来在音频文件中跳转,这非常有帮助,因为转录者可以学习视觉上查找、重复或循环短语

我想知道是否有可能在浏览器中用Javascript模拟这个功能的一个子集。我对信号处理知之甚少,也许它甚至不可行

但我设想的是Javascript从文件中读取声音流,并定期采样振幅。如果振幅非常低,持续时间超过某个阈值,那么这将被标记为短语中断

我认为,这样的标签对转录非常有用。然后,我可以设置关键命令,跳转到前一段沉默时间。因此,假设(想象一个基于jQuery的API):

静默
将包含一个时间列表,因此我可以通过某种方式让用户在各种
静默
中跳跃,然后将
当前时间
设置为所选值,并播放它


甚至可以用Javascript做这种事情吗

据我所知,JavaScript不够强大,无法做到这一点

要做到这一点,您必须求助于flash或某种服务器端处理


使用HTML5音频/视频标签,您可能能够欺骗页面,使其执行类似的操作。您可以(假设)在服务器端识别静默,并将这些静默的时间戳作为页面中的元数据(隐藏字段或其他内容)发送到客户端,然后使用该时间戳允许JavaScript识别音频文件中的那些点。

如果您使用WebWorker线程,您可以在JavaScript中执行此操作,但这需要在浏览器中使用更多线程来完成。您可以将问题分解为多个线程并进行处理,但是,将其与回放同步几乎是不可能的。因此,Javascript可以通过进行一些音频处理来确定静音时段,但由于不能很好地将其与播放链接起来,因此这不是最佳选择

但是,如果您想向用户显示波形,那么可以使用javascript和canvas,但请参阅下一段中的流


你最好的办法是让服务器对音频进行流式传输,它可以进行处理并找到所有的静音。然后,每个文件都应该保存在一个单独的文件中,这样您就可以轻松地在静音之间切换,通过流媒体,您的服务器应用程序可以确定何时加载新文件,这样就不会出现中断。

我不认为JavaScript是您想要用来处理这些音频文件的工具-这是自找麻烦。但是,javascript可以轻松地读取相应的XML文件,该文件描述了这些静音在音频文件中发生的位置,并适当地调整了用户界面。然后,问题是如何生成这些XML文件:

  • 如果需要立即演示该功能,可以手动执行。(使用audacity查看这些音频封套出现的位置)

  • 看看这个,它在C#中创建了一个wav处理库。作者创建了一个从输入文件中提取静默的函数。可能是开始黑客攻击的好地方

  • 只是我最初的两个想法。。。有很多音频处理API,但它们是为特定的框架和应用程序编程语言编写的。在尝试从头开始写东西之前,一定要使用它们。。。除非你真的很喜欢傅里叶变换。

    我认为使用javascript是可能的(当然,也许不可取)。本文:

    。。。讨论如何以二进制数据的形式访问文件,一旦你将音频文件作为二进制数据,你可以用它做任何你喜欢的事情(我想,无论如何-我对javascript不是很在行)。对于WAV格式的音频文件,这将是一个简单的练习,因为数据已经在时域中按样本组织。对于压缩格式(如MP3)的音频文件,用javascript将压缩数据转换回时域样本非常困难,如果你成功地做到了,我会发现你周围有一种宗教信仰

    更新:再次阅读您的问题后,我意识到,实际上可以用javascript实现您正在讨论的内容,即使文件是MP3格式而不是WAV格式。我理解你的问题,你实际上只是在寻找音频流中的静默点,而不是剥离静默延伸

    要定位静默拉伸,您不必将MP3文件的频域数据转换回WAV文件的时域。事实上,识别音频中的安静拉伸实际上可以在频域中比在时域中更可靠地完成。安静拉伸往往具有明显平坦的频率响应图,而在时域中,可听见语音的峰值振幅有时并不比背景噪声的峰值高多少,尤其是在发生自动调平的情况下

    如果文件是CBR(恒定比特率)而不是VBR(可变比特率),用javascript分析MP3文件将非常容易。

    是的,可以使用,更准确地说,您需要。为了给您提供一个简短的概念证明,您可以获得,并将以下代码添加到
    drawTimeDomain()

    var阈值=1000;
    var总和=0;
    for(var i
    
    var audio = $('audio#someid');
    
    var silences = silenceFindingVoodoo(audio);
    
    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);