Web音频: 我如何让移动麦克风从远处拾取音频?

11

使用 navigator.getUserMedia 获取用户麦克风的访问权限非常容易。但如果我使用移动浏览器并想从远处获取音频,例如“扬声器”模式,该怎么办?

我该如何实现这一点?似乎有本地应用程序可以实现这一点,但 Web Audio 可以吗?

这是为了通过 DTMF 在设备之间发送消息。我已经在我的笔记本电脑上实现了这一点,因为其麦克风可以从很远的距离记录周围的音频,但我接触到的任何手机似乎只能记录“口音”的附近音频,因此即使将手机极度靠近源扬声器,也只有微小的机会收到消息。这样做就失去了目的,除非我可以让移动麦克风从远处捕捉音频。

编辑:所谓远距离指的是大于几英尺,而不是仅仅几厘米。环境声音,而不是紧邻麦克风的声音。


智能手机的环境麦克风可能是几个物理设备,但我认为它们在操作系统中是一个设备。因此,当您想要更好的音频时,只需增加麦克风的增益,浏览器会让操作系统处理它。我正在做出一些假设,但这应该是它的工作方式。因此,请尝试增加增益,如下所示(在Chrome中应该可以工作,其他浏览器不确定):http://www.html5rocks.com/en/tutorials/webaudio/intro/ - Gokhan Kurt
@Blindman67 你们两位的评论都是我问题的相关答案,如果你们中的任何一位想要详细说明一下你们的评论,那就太好了。简而言之,实际上有一个单独的扬声器模式;通过在第一个链接中适应mediaDevices示例,设备实际上会出现为“扬声器”。虽然我现在非常确定这已经是我的默认设置了。使用gainNode还可以调整麦克风的音量,如html5rocks教程所示。但事实证明,我的问题可能与麦克风输入无关。 - Ten Bitcomb
@Gökhan Kurt 请参见上文^^。 - Ten Bitcomb
好的@Ravenstine,我今晚会稍微试一下。我想应该是增益和BiQuad滤波器的组合等等...另外,似乎信号传输到音频API时可能有一个门控,因为即使在数字世界中,麦克风也应该随着增益的增加而变得更加敏感。你可以先从那里开始查找,并确认是否存在这样的门控(噪声门),或者是否有某些默认设置用于压缩扩展。没有理由你不能处理几英尺之外的信号。 - Charlie
请注意:此演示仅适用于桌面版Chrome浏览器,在三星Galaxy S5和HTC One S的移动版Chrome浏览器上无法正常运行。 - Ten Bitcomb
显示剩余10条评论
3个回答

3

我在这里回答自己的问题。感谢所有帮助过我的人,尽管这里发布的实际答案都不令人满意。

在更新版本的Chrome浏览器中,navigator.mediaDevices有一个名为enumerateDevices的函数,可用于列出可用的硬件设备,包括麦克风。事实证明,在我的Android手机上,这确实返回了一个“扬声器电话”设备。因此,如果您有一个设备,在其中怀疑扬声器电话未设置为默认浏览器麦克风,并且您(或您的用户)使用的是Chrome 47或更高版本,则可以使用enumerateDevices返回的设备ID来指定特定的麦克风。

因此,如果您的用户选择选择元素中特定的麦克风设备选项,则会获取该设备的ID并将其传递给getUserMedia

navigator.getUserMedia({ audio: {deviceId: {exact: <insert device uuid here>}} }, callback)

请注意,截至发布本文时,enumerateDevices API仅在Chrome浏览器中可用。在其他任何浏览器或Web视图中,这可能不起作用。
如果麦克风的音量对您的应用程序太低,您可以通过为您的AudioContext创建一个gainNode来增加它。
volume     = context.createGain()
volume.gain.value = 3 // raises the volume to 300%
audioInput = context.createMediaStreamSource(e)
audioInput.connect(volume)

如果你正在处理原始样本,你可以在将它们传递给任何用于处理它们的函数之前,直接通过乘以一个数字来处理每个样本。


2

这是无法完成的,因为它直接与设备的硬件有关。如果设备硬件(麦克风)不能从几米之外捕捉声音,那么也无法做任何事情。


1
如果我的硬件不支持这个,那么这就是正确的。请参见上面的评论;我的原始问题已经得到了回答,只是没有被写成正式的答案。事实证明,虽然确实有一个“免提”模式,但它并不是实际的问题,因为那是默认设备。实际的问题似乎也不是增益节点音量。此时,我认为这是一个软件问题,因为我的目标是捕捉频率存在,并且我有应用程序可以做到这一点,但我似乎无法在移动Chrome上实现这一点(但我可以在桌面上)。 - Ten Bitcomb
1
根据上面的评论,您确实可以欢迎修改您的答案。毕竟,还有一份赏金要颁发给某个人。 :) - Ten Bitcomb
好的,也许一个网络音频文档可以帮助回答是否可能在移动版Chrome上实现这个功能。 - user5294439

0
两年前,我实现了一个基于Google示例的webrtc,在移动Web浏览器上运行,并且声音被捕获时具有环境水平。我真的没有对Google库进行深入的代码分析,但也许你可以从这里开始。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接