4

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

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

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

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

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

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

var silences = silenceFindingVoodoo(audio);

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

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

4

5 回答 5

3

是的,使用Web Audio API是可能的,更准确地说,您将需要AnalyserNode。为了给您一个简短的概念证明,您可以获取此示例,并将以下代码添加到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 毫秒的静音都应该被视为真正的静音)

于 2019-01-10T14:21:10.000 回答
1

据我所知,JavaScript 的功能还不足以做到这一点。

您将不得不求助于闪存或某种服务器端处理来执行此操作。

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

于 2009-10-01T02:13:13.520 回答
1

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

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

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

于 2009-10-01T02:22:25.843 回答
1

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

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

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

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

于 2009-10-01T02:39:55.450 回答
1

我认为使用 javascript 可以做到这一点(当然,虽然可能不建议这样做)本文:

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

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

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

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

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

于 2009-10-01T02:41:10.563 回答