Java:从 2 个不同的麦克风输入中独立捕获音频

Posted

技术标签:

【中文标题】Java:从 2 个不同的麦克风输入中独立捕获音频【英文标题】:Java: Independently Capturing Audio From 2 Different Mic Inputs 【发布时间】:2014-03-19 21:22:40 【问题描述】:

我正在进行一项研究,其中两名参与者在讨论多个主题时将各自佩戴不同的麦克风。我需要能够在 Java 中分析每个参与者的音频输入 - 独立捕获两个音频输入流。我无法结合两个输入流进行分析。

有谁知道我是否可以在 Java 中做到这一点,以及如何做到这一点?

我遇到过this,上面写着“通常,一次只能打开一个输入端口,但也可以使用混合来自多个端口的音频的音频输入混音器。”

谢谢

编辑 1: 捕获和分析必须实时完成。

编辑 2: 我使用的是 Windows 7 64 位操作系统。我的声卡只有一个麦克风端口。我有两个类似于this 的USB 音频适配器。如果我无法在 Java 中完成此操作,那么有什么好的替代解决方案?建议使用 USB 库。我将对音频数据执行的分析是确定每个说话者的发声率(他们说多少)。

结论: 通过使用 Java 中的线程,我能够同时读取两个 TargetDataLines。我的两个 USB 音频适配器都对 Java 可见。

【问题讨论】:

分析必须实时进行吗? @MikeB 是的,分析必须实时完成。 我的最简单建议是在立体声输入流的每个通道上放置一个麦克风,将其重新缓冲到两个单独的数据流中,并让一个线程分析每个通道。当然,分析程序的细节必须由您设计以满足您的研究需要,并且您有责任以足够快的速度执行该操作以保持合理接近实时。 这个必须用Java实现的原因是什么? Mathematica 可能是更好的选择。 @ThorbjørnRavnAndersen 参与者将在交谈时使用多点触控桌面 Java 应用程序。该应用程序将基于音频数据创建可视化。因此,所述应用程序不必执行记录和处理,但我认为单个应用程序解决方案会最简单。 【参考方案1】:

我自己还没有这样做,所以将以下内容作为建议而不是答案。 (我更喜欢用于实时播放的音乐合成和音频效果,例如游戏声音。)

您可能已经在本教程中阅读过,Java 提供了一个名为 Audiosystem 的类,它提供对给定计算机上可用的线路和端口的访问。如果您希望使用的计算机有两条麦克线,那么完全有理由相信这两条线都将对 Java 可见。与 Java 相比,输入限制更多地取决于硬件(正在使用的声卡和它提供的麦克风线数量)以及驱动程序和操作系统。您可能需要购买允许同时进行多路输入的特殊声卡。

另外,我知道在操作系统级别(尤其是某些 Linux 风格)可能存在限制,即一次只允许一条输出线运行。这将限制 Java 可以看到的内容。但我还没有真正用我的 Windows 操作系统探索过这一点。

为了从一行读取数据,通常使用 TargetDataLine 类。通常通过 while 循环从缓冲区块中的该行读取数据(例如,一次 1024 个字节)。过去我有多个 TargetDataLines 同时运行:数据源是各种 Java 软件合成器源。假设每个 TDL 分配给不同的输入线,则可以从该循环中读取每个 TDL,然后将相应的数据传递到不同的分析器。 TargetDataLines 是阻塞线——如果一条线没有准备好数据(通常处理速度比可以呈现音频数据快得多)——那么程序会阻塞,直到数据出现。

Java 能够处理很多实时 DSP。我不知道您希望进行的具体分析形式,但可能有独立来源提供的库。

【讨论】:

感谢您的回复。我在 Edit 2 中添加了有关我的设置的更多信息。我想知道是否可以通过 AudioSystem 类访问带有麦克风的 USB 音频适配器。 不一定是这样。也可以从 AudioInputStream 中读取。该教程确实提到了“网络”数据源是一种可能性,而 AIS 确实提到了能够从流式源中读取数据。我希望我自己解决了这个问题,并且可以给出更明确的答案。

以上是关于Java:从 2 个不同的麦克风输入中独立捕获音频的主要内容,如果未能解决你的问题,请参考以下文章

从浏览器中的麦克风获取音频输入并提取特征

1 个文件中的 5 个独立音频通道

Java Sound API:从目标端口捕获声音输出

使用 Google Speech to Text API 从 Web 应用程序中的麦克风捕获实时音频 [关闭]

如何从WDM流音频源(Realtek HD Audio)捕获

OpenAL播放捕获的音频数据c ++