您知道我如何才能花费合理的时间和精力来实现上述结果吗?
过去几个小时我一直在研究和尝试不同的方法。
- 模块角色逃避似乎是一个热门候选人。然而,Discord 没有具体说明媒体角色属性,所以如果我不能自己设置它,它就不会起作用。即使添加该属性确实有效,据我所知,我的音乐也会被永久屏蔽,因为这些语音聊天客户端在无人说话时不会暂停/断开连接。
- 我看了频谱分析仪看看我是否可以拦截语音聊天应用程序的声音输出,这样我就可以自己完成所有工作(计算语音聊天音量,相应地设置音乐音量),但我无法胜任这项任务——我没有找到任何有用的指南。据我所知,这种方法还需要为语音聊天应用程序创建另一个接收器。
- 我可以关注这种方法将语音聊天音频传输到自定义脚本,该脚本执行2。但我该如何处理这些原始音频信息?
- 脉冲效应很棒,但它不允许应用程序之间进行这样的交互
- 咕哝 VoIP执行实际的躲避其他应用程序的部分,所以这是绝对可行的。
答案1
它仍处于早期阶段,但我已经制作了我想要的工作原型!
https://github.com/NicoWeio/PulseDucking
我将粘贴如何实现来自我的自述文件的部分,以供将来参考。
- 对于每个当前正在运行扳机应用程序,启动一个新线程。
- 在每个线程中,
parec --monitor-stream=<STREAM_INDEX>
被调用。它传输应用程序的原始音频。 - 通过简单检查
0x00
,就可以检测到静音/噪音。 pacmd set-sink-input-volume <SINK_INPUT_INDEX> <VOLUME>
发送给所有人躲避应用程序。- 循环确保新的应用程序也被考虑在内。
因此,事实证明,检测原始音频流中的绝对静音并不困难,并且由于......从单个应用程序获取原始音频不需要创建接收器/环回/ parec --monitor-stream=<STREAM_INDEX>
...。
关于 1.,手动设置流的属性是可能使用pacmd update-sink-input-proplist <INDEX> media.role="…"
。我还没有检查是否模块角色逃避那么就可以了。