是否可以使用 Javascript 在音频文件中找到一段无声的片段?

Posted

技术标签:

【中文标题】是否可以使用 Javascript 在音频文件中找到一段无声的片段?【英文标题】:Is it possible to find stretches of silence in audio files with Javascript? 【发布时间】:2009-10-01 02:10:07 【问题描述】:

我一直在研究一种使用 javascript 转录语音录音的工具。基本上,我正在连接关键事件来播放、暂停和循环使用audio 标签读入的文件。

有许多先进的现有桌面应用程序可以执行此类操作(例如 Transcriber -- 这里是 screenshot)。大多数转录工具都有一个内置的波形,可用于在音频文件中跳转,这非常有用,因为转录者可以学习在视觉上查找和重复或循环短语。

我想知道是否可以使用 Javascript 在浏览器中模拟此功能的一个子集。我对信号处理了解不多,也许根本不可行。

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

我认为,这样的标签对转录非常有用。然后我可以设置关键命令来跳转到之前的静音期。所以假设(想象一个基于 jQuery 的 API):

var audio = $('audio#someid');

var silences = silenceFindingVoodoo(audio);

silences 然后将包含一个时间列表,所以我可以连接一些方法让用户在各种silences 中跳转,然后将currentTime 设置为选定的值,然后播放.

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

【问题讨论】:

【参考方案1】:

是的,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 毫秒的静默都应该被视为真正的静默)

【讨论】:

【参考方案2】:

我认为这是 可能 使用 javascript (虽然可能不建议,当然)。本文:

https://developer.mozilla.org/En/Using_XMLHttpRequest#Handling_binary_data

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

更新:再次阅读您的问题后,我意识到即使文件是 MP3 格式而不是 WAV 格式,实际上也可以用 javascript 执行您正在讨论的内容。据我了解您的问题,您实际上只是想在音频流中找到静音点,而不是实际去除静音片段。

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

如果文件是 CBR(恒定比特率)而不是 VBR(可变比特率),则在 javascript 中分析 MP3 文件会容易得多。

【讨论】:

感谢MusiGenesis。看起来一个新的音频 API 正在攻击 Firefox,它可以完成所有这些以及更多:wiki.mozilla.org/Audio_Data_API 超级疯狂太棒了。【参考方案3】:

据我所知,JavaScript 的功能还不够强大。

您必须借助闪存或某种服务器端处理来执行此操作。

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

【讨论】:

【参考方案4】:

如果您使用 WebWorker 线程,您也许可以在 Javascript 中执行此操作,但这需要在浏览器中使用更多线程来执行此操作。您可以将问题分解为多个线程并对其进行处理,但是几乎不可能将其与播放同步。因此,Javascript 可以通过进行一些音频处理来确定静默期,但由于您无法将其与播放很好地关联起来,因此它不是最佳选择。

但是,如果您想向用户显示波形,则可以使用 javascript 和 canvas,但请参阅下一段流式传输。

最好的办法是让服务器流式传输音频,它可以进行处理并找到所有静音。然后,每一个都应保存在一个单独的文件中,以便您可以轻松地在静音之间跳转,并且通过流式传输,您的服务器应用可以确定何时加载新文件,因此不会中断。

【讨论】:

【参考方案5】:

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

    如果您需要立即演示该功能,您可以手动进行。 (大胆地查看这些音频包络出现的位置)

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

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

【讨论】:

以上是关于是否可以使用 Javascript 在音频文件中找到一段无声的片段?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以将使用 javascript 生成的 html 音频录制到后端的音频文件中?

在 iOS 6.0 中找不到 AVAudioPlayer

使用javascript从视频流中提取音频

如何使用fineuploader或javascript检测MP4文件是音频还是视频?

Javascript mp3 音频数据

是否可以将立体声音频输入 Chrome?