AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / computer / 问题 / 1621243
Accepted
MikeEVMM
MikeEVMM
Asked: 2021-01-28 06:49:42 +0800 CST2021-01-28 06:49:42 +0800 CST 2021-01-28 06:49:42 +0800 CST

将选定应用程序的声音与语音结合到虚拟麦克风中 (Linux)

  • 772

有时我想通过 Skype、Discord 等与朋友分享音乐。

我不想分享我的声卡的全部输出(我可以通过将相应的监视器设置为麦克风来做到这一点),因为这样我的朋友可以听到他们自己的声音(这很烦人),而且可能还有其他声音在播放我也不希望他们听到的音乐(例如通知)。此外,当我这样做时,我不再能够在通话中说话(因为我的麦克风设置为其他东西)。

如何将某些应用程序的输出声音与麦克风的声音混合,并通过语音聊天发送该信号?

我正在使用 Linux Mint。

audio microphone
  • 1 1 个回答
  • 1964 Views

1 个回答

  • Voted
  1. Best Answer
    MikeEVMM
    2021-01-28T06:50:06+08:002021-01-28T06:50:06+08:00

    (下面我将假设使用类似 Ubuntu 的 Linux 发行版 --- 在我的情况下,我使用的是 Linux Mint 20.1 Cinnamon --- 并且安装了 Pulse Audio Volume Control;您可以使用sudo apt install pavucontrol.对于任何 Linux 发行版,如果你没有做一些太奇怪的事情,但我不保证。我还想出了以下内容,因此对任何不准确之处深表歉意。)

    首先,让我回顾一下 Pulse Audio 相关的一些概念,这将使下面的解释更容易理解:

    • 接收器是“消耗”音频信号的东西(可能将该信号转换为类似实际声音的东西)。例如,这意味着您的扬声器是一个水槽。您也可以将它们称为输出设备。

    • 源是相反的概念;它是产生信号的东西,例如麦克风。您也可以将它们称为输入设备。

    • 监视器是为计算机上的每个输出设备(接收器)创建的虚构(虚拟)输入设备(源)。它只是复制相应源上输出的声音,就好像它进入计算机一样。

    您还应该知道,在使用 Pulse Audio 时,有三个主要工具:Pulse Audio Volume ControlGUI 界面,您可以从终端开始使用pavucontrol、pactl命令和pacmd命令。

    该命令的大部分功能(我们感兴趣的)pactl都是通过内置的“模块”实现的。您可以调用这些模块

    pactl load-module <module name> <parameters>
    

    并用

    pactl unload-module <module name>
    

    对此所做的更改不是永久性的。在恐慌中退出并重新登录,您应该能够重新开始。

    pactl的反馈也很差——只要你的命令有问题,它就会半静默地失败,并显示“失败:模块初始化失败”——但你可以在这里找到一个很好的文档参考。

    好的,因此,以下是我们可用的成分和游戏计划:

    1. 我们可以创建所谓的“空汇”。这些是能够像扬声器一样接收信号但不播放声音的虚拟接收设备。这些是使用module-null-sink模块创建的。

    2. 我们可以将声音从源“环回”回接收器。将其视为转发,例如,从麦克风直接进入扬声器的声音。这是通过module-loopback模块实现的。

    3. 我们可以使用pavucontrol界面选择将每个应用程序的声音播放到哪个接收器中;只要有多个接收器,您就可以在“播放”选项卡中为每个应用程序选择要使用的接收器。

    那么,计划如下:

    1. 找出我们声卡的源(内置麦克风)和接收器(扬声器/耳机)

    2. 创建一个transmit接收我们要广播的应用程序声音的空接收器设备 ( )

    3. 将声音从transmit我们的声卡环回,这样我们也可以听到我们正在广播的内容(因为请记住,空接收器只会丢弃它们接收到的内容)

    4. 创建另一个接收麦克风声音和声音的空接收器设备 ( combined) --- 这是我们想要广播的信号,但不是我们想要听到的信号,因为我们不想听到自己说话transmit

    5. 在 Skype 通话中使用显示器combined作为我们的虚拟麦克风

    以便将计划付诸实施:

    0. 找出我们的内置接收器/源

    pactl让我们轻松枚举我们的接收器/源:

    pactl list sinks
    

    告诉我们一个水槽

    Sink #0
        State: IDLE
        Name: alsa_output.pci-0000_00_1f.3.analog-stereo
        Description: Built-in Audio Analog Stereo
        
        (... more information ...)
    

    这是我的声卡的输出,即笔记本电脑的扬声器或耳机,我们可以找到源

    pactl list sources
    

    产生

    Source #0
        State: RUNNING
        Name: alsa_output.pci-0000_00_1f.3.analog-stereo.monitor
        Description: Monitor of Built-in Audio Analog Stereo
        
        (... more information ...)
        
        Properties:
            device.description = "Monitor of Built-in Audio Analog Stereo"
            device.class = "monitor"
            alsa.card = "0"
            alsa.card_name = "HDA Intel PCH"
    
        (... more information ...)
    
    Source #1
        State: RUNNING
        Name: alsa_input.pci-0000_00_1f.3.analog-stereo
        Description: Built-in Audio Analog Stereo
            
        (... more information ...)
    

    我在我的电脑上设置了两个源:alsa_input.pci-0000_00_1f.3.analog-stereo一个是我的内置麦克风(来自声卡),alsa_output.pci-0000_00_1f.3.analog-stereo.monitor另一个是接收器的监视器alsa_output.pci-0000_00_1f.3.analog-stereo,即从我的扬声器或耳机中发出的声音就好像它来了进入电脑。

    1.创建transmit水槽

    这很简单module-null-sink:

    pactl load-module module-null-sink sink_name=transmit
    

    请注意,我们已将这个新接收器命名为transmit,但如果您查看pavucontrol,在输出设备选项卡下,您会发现确实有一个新设备,但它被称为“空输出”。这是因为pavucontrol将设备的描述显示为显示名称;如果我们再次枚举我们的接收器......

    $ pactl list sinks
    
    (... other sinks ...)
    
    Sink #6
        State: IDLE
        Name: transmit
        Description: Null Output
        
        (... more information ...)
    
        Properties:
            device.description = "Null Output"
            device.class = "abstract"
            device.icon_name = "audio-card"
        Formats:
            pcm
    

    我们可以看到 sink 确实被调用transmit了,但是它的device.description属性是“Null Output”。我们可以解决这个问题pacmd:

    pacmd 'update-sink-proplist transmit device.description="Signals to Transmit"'
    

    (如果您收到“无法解析 proplist。”,请注意单引号。)

    当我们创建我们的 null sinktransmit时,相应的监视器源 ,transmit.monitor也被创建了。(您可以通过pactl list sources再次调用来检查。)我们也应该修复它的名称,我们可以再次使用pacmd:

    pacmd 'update-source-proplist transmit.monitor device.description="Monitor of Signals to Transmit"'
    

    现在,如果您播放一些音乐,例如,您将能够将该信号转发到 Playback 标签下的新接收器pavucontrol。但是,该信号不再可听到,因为它正在播放到空接收器;让我们解决这个问题。

    2. 回送声音transmit

    回想一下,当发送到(在我的情况下)接收器 0 时,扬声器/耳机会播放声音alsa_output.pci-0000_00_1f.3.analog-stereo。然后,如果我们将进入 sink 的声音回transmit传到这个 sink,我们应该能够再次听到它。当然,我们不能从接收器环回信号,信号必须来自源。幸运的是,监视器正是进入接收器的信号,呈现为源。

    然后让我们环回transmit.monitor我们的声卡,使用module-loopback:

    pactl load-module module-loopback source=transmit.monitor sink=alsa_output.pci-0000_00_1f.3.analog-stereo
    

    您现在应该能够再次听到发送到“要传输的信号”接收器的声音。

    3.结合transmit和麦克风

    现在的程序与第 1 点和第 2 点非常相似;我们将创建另一个接收transmit.monitor信号和麦克风输入的空接收器。该信号的监视器将用作要使用的虚拟麦克风。

    我们首先创建空接收器combined...

    pactl load-module module-null-sink sink_name=combined
    

    ...并修复出现在pavucontrol...中的默认名称

    pacmd 'update-sink-proplist combined device.description="Transmit+Microphone Sink"'
    pacmd 'update-source-proplist combined.monitor device.description="Transmit+Microphone"'
    

    ...最后将我们的麦克风和transmit监视器环回组合通道:

    pactl load-module module-loopback source=alsa_input.pci-0000_00_1f.3.analog-stereo sink=combined
    pactl load-module module-loopback source=transmit.monitor sink=combined
    

    4. 利润

    现在,在设置通话时,应该可以使用名为“Transmit+Microphone”的麦克风 --- 这是您选择的声音和您的声音的组合信号。

    请注意,所有这些环回等可能会产生 CPU 开销,但我的笔记本电脑根本不是很强大,除了一些延迟之外我没有任何问题。要撤消上述所有操作,请致电

    pactl unload-module module-loopback
    pactl unload-module module-null-sink
    

    或注销并重新打开。

    TL;博士

    pactl load-module module-null-sink sink_name=transmit
    pacmd 'update-sink-proplist transmit device.description="Signals to Transmit"'
    pacmd 'update-source-proplist transmit.monitor device.description="Monitor of Signals to Transmit"'
    pactl load-module module-null-sink sink_name=combined
    pacmd 'update-sink-proplist combined device.description="Transmit+Microphone Sink"'
    pacmd 'update-source-proplist combined.monitor device.description="Transmit+Microphone"'
    pactl load-module module-loopback source=alsa_input.pci-0000_00_1f.3.analog-stereo sink=combined
    pactl load-module module-loopback source=transmit.monitor sink=combined
    pactl load-module module-loopback source=transmit.monitor sink=alsa_output.pci-0000_00_1f.3.analog-stereo
    

    如果这对您来说失败了,请阅读该帖子,但alsa_input.pci-0000_00_1f.3.analog-stereo对您来说可能会有所不同。

    • 3

相关问题

  • audioSprite / ffmpeg 中的单声道音频与立体声具有相同的比特率

  • 蓝牙设备 Bose Soundlink Revolve 烦人地在 Windows 10 启动时自动打开

  • 如何使用 FFmpeg 获得最终的 LUF 值?

  • 最低比特率 ffmpeg 输出的编解码器和设置

  • 索尼WH-1000XMX2蓝牙耳机无法自动正确连接

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何减少“vmmem”进程的消耗?

    • 11 个回答
  • Marko Smith

    从 Microsoft Stream 下载视频

    • 4 个回答
  • Marko Smith

    Google Chrome DevTools 无法解析 SourceMap:chrome-extension

    • 6 个回答
  • Marko Smith

    Windows 照片查看器因为内存不足而无法运行?

    • 5 个回答
  • Marko Smith

    支持结束后如何激活 WindowsXP?

    • 6 个回答
  • Marko Smith

    远程桌面间歇性冻结

    • 7 个回答
  • Marko Smith

    子网掩码 /32 是什么意思?

    • 6 个回答
  • Marko Smith

    鼠标指针在 Windows 中按下的箭头键上移动?

    • 1 个回答
  • Marko Smith

    VirtualBox 无法以 VERR_NEM_VM_CREATE_FAILED 启动

    • 8 个回答
  • Marko Smith

    应用程序不会出现在 MacBook 的摄像头和麦克风隐私设置中

    • 5 个回答
  • Martin Hope
    Saaru Lindestøkke 为什么使用 Python 的 tar 库时 tar.xz 文件比 macOS tar 小 15 倍? 2021-03-14 09:37:48 +0800 CST
  • Martin Hope
    CiaranWelsh 如何减少“vmmem”进程的消耗? 2020-06-10 02:06:58 +0800 CST
  • Martin Hope
    Jim Windows 10 搜索未加载,显示空白窗口 2020-02-06 03:28:26 +0800 CST
  • Martin Hope
    v15 为什么通过电缆(同轴电缆)的千兆位/秒 Internet 连接不能像光纤一样提供对称速度? 2020-01-25 08:53:31 +0800 CST
  • Martin Hope
    andre_ss6 远程桌面间歇性冻结 2019-09-11 12:56:40 +0800 CST
  • Martin Hope
    Riley Carney 为什么在 URL 后面加一个点会删除登录信息? 2019-08-06 10:59:24 +0800 CST
  • Martin Hope
    zdimension 鼠标指针在 Windows 中按下的箭头键上移动? 2019-08-04 06:39:57 +0800 CST
  • Martin Hope
    jonsca 我所有的 Firefox 附加组件突然被禁用了,我该如何重新启用它们? 2019-05-04 17:58:52 +0800 CST
  • Martin Hope
    MCK 是否可以使用文本创建二维码? 2019-04-02 06:32:14 +0800 CST
  • Martin Hope
    SoniEx2 更改 git init 默认分支名称 2019-04-01 06:16:56 +0800 CST

热门标签

windows-10 linux windows microsoft-excel networking ubuntu worksheet-function bash command-line hard-drive

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve