27

I have dual boot Windows and Ubuntu. Since I don't use any microphone on my desktop, I started using an app named "WO Mic" to connect my Android phone's microphone to my desktop in Windows. A good alternative, right?

Well, sadly, WO Mic is not supported on any Linux-based OS, so I would like to know if there are any alternatives or any app that could use my phone as microphone on Ubuntu over Wi-Fi or USB. (but preferably Wi-Fi).

10

I use Mumble (desktop client) + Murmur (as LAN server) + Plumble (Android/iOS client). This results in the lowest latency I've ever achieved (sounds almost like normal loopback, theoretically 7ms WiFi delay + 2x 10ms codec delay = 27 ms).

For the latest version, see github.com/pzmarzly/mic_over_mumble.

Fragments of README (rev 8c827fe)

  1. Install Mumble (desktop client) + Murmur (server) + Plumble (Android/iOS client). Set all 3 programs to use best quality and minimal latency. Set mobile client to always streaming.

  2. To install Mumble + Murmur on Ubuntu, you can use:

    sudo apt install mumble mumble-server
    sudo systemctl stop mumble-server.service
    sudo systemctl disable mumble-server.service
    
  3. Copy mic_over_mumble anywhere - it will use ~/.mic_over_Mumble as configuration directory.

  4. Run mic_over_mumble. It will start the server on LAN, then start Mumble (if asked for nickname, enter anything other than SuperUser). Then connect your mobile device to the LAN server manually. Please note that Mumble mobile app has some issues.

  5. Then, set up your programs to use either "Monitor_of_Mumble" or "VirtualMic" as input device (they are linked). E.g. in OBS:

    Screenshot of OBS configuration

Copy of mic_over_mumble script (rev 8c827fe)

#!/bin/bash
set -euo pipefail
# PAID = PulseAudio ID
# ID = PID / process ID

function main () {
    if [ ! -e ~/.mic_over_Mumble ]; then
        mkdir ~/.mic_over_Mumble
    fi
    cd ~/.mic_over_Mumble

    rm murmur.ini || true
    echo "bonjour=true" >> murmur.ini
    echo "bandwidth=130000" >> murmur.ini

    if [ ! -e ./initdone ]; then
        echo "You will need to configure Mumble client to use the lowest possible latency."
        echo "We will start Mumble now. Please complete setup wizard and go to settings to increase quality and decrease latency."
        echo "Also, mute your microphone (if you have one) in Mumble."
        echo "Then close Mumble."
        run_mumble_client_wizard
        touch ./initdone
    fi

    echo "Starting Mumble server (murmurd)..."
    run_mumble_server_bg
    sleep 5
    echo "Starting Mumble client..."
    MUMBLE_CLIENT_ID=$(run_mumble_client_bg)
    sleep 15
    echo "Fetching PulseAudio configuration..."
    MUMBLE_CLIENT_PAID=$(get_mumble_client_paid)

    echo "Changing PulseAudio configuration..."
    echo "Adding sink..."
    SINK_MODULE_PAID=$(add_sink)
    sleep 3

    echo "Fetching current configuration to redirect Mumble..."
    SINK_PAID=$(get_sink_paid)
    pacmd move-sink-input "$MUMBLE_CLIENT_PAID" "$SINK_PAID"

    echo "Adding a virtual microphone..."
    SOURCE_MODULE_PAID=$(add_source)

    echo "Done. Please use pavucontrol to ensure everything works."
    echo "Press Return to shut down..."
    read -n1 -s -r
    echo "Shutting down..."

    echo "Stopping Mumble client..."
    kill -KILL "$MUMBLE_CLIENT_ID" || true
    sleep 2
    echo "Stopping Mumble server..."
    # TODO: find a better way to kill murmurd
    # (it forks, so we cannot use its PID)
    pkill murmurd || true
    echo "Restoring PulseAudio configuration..."
    pactl unload-module "$SOURCE_MODULE_PAID"
    pactl unload-module "$SINK_MODULE_PAID"
}

function run_mumble_client_wizard () {
    mumble >/dev/null 2>&1
}

function run_mumble_client_bg () {
    MUMBLE_URL="mumble://localhost"
    mumble $MUMBLE_URL >/dev/null 2>&1 &
    echo $!
}

function run_mumble_server_bg () {
    murmurd -ini ./murmur.ini &
    # echo $!
    # TODO: here we can get murmur's PID
    # (uncomment the line above)
}

function get_mumble_client_paid () {
    pacmd list-sink-inputs |
        grep -F -e "index: " -e "media.name = " |
        cut_every_second_newline |
        grep -F -e "Mumble" |
        print_second_column
}

function add_sink () {
    pactl load-module \
        module-null-sink \
        sink_name=Loopback_of_Mumble \
        sink_properties=device.description=Loopback_of_Mumble
}

function add_source () {
    pactl load-module \
        module-virtual-source \
        source_name=VirtualMic \
        master=Loopback_of_Mumble.monitor \
        source_properties=device.description=VirtualMic
}

function get_sink_paid () {
    pacmd list-sinks |
        grep -F -e "index: " -e "name: " |
        cut_every_second_newline |
        grep -F -e "Loopback" |
        print_second_column
}

# https://serverfault.com/a/375098/449626
function cut_every_second_newline () {
    awk 'ORS=NR%2?" ":"\n"'
}

function print_second_column () {
    awk '{print $2}'
}

main
1
6

Edit 2020-06-07: The site where the software was initially hosted seems to have been renamed. Please note: I was only answering a question of a user here. I have not used the software myself and I would not endorse a software I do not use myself.


Is WO Mic the program? Have you tried downloading the client/driver and following the instructions for Ubuntu?

  1. Load driver module

     $ sudo insmod wo_snd_capture-x86.ko
    
  2. Connect from client

    • Conenct by Wifi. You can find the IP address on WO Mic app UI.

         $ micclient-ubuntu-x86 -t Wifi 192.168.1.100
      
    • Connect by Bluetooth.

         $ micclient-ubuntu-x86 -t Bluetooth xx:xx:xx:xx:xx:xx
      

      xx:xx:xx:xx:xx:xx represents phone Bluetooth address. You can query it on your phone: Settings -> About phone -> Status -> Bluetooth address.

The above examples are for 32-bit Ubuntu. If you are using 64-bit, replace client and driver file name to xxx-x86_64 ones as downloaded.

6
  • 2
    I got Please first load ALSA snd-aloop., so I needed to do: sudo modprobe snd-aloop and then I had to run the micclient-ubuntu-x86 as root (using sudo). And then it worked, yay. Jul 15 '17 at 7:09
  • 1
    This does not work. Only silence is recorded from the loopback device...
    – Calmarius
    Feb 1 '18 at 20:52
  • 2
    How to connect over USB?
    – abhisekp
    Nov 11 '19 at 16:15
  • 1
    I'm getting segmentation core dump everytime I run it. I'm in Linux Mint 18.3 x64
    – abhisekp
    Nov 11 '19 at 16:19
  • 1
    From where can we download the driver? When I run sudo insmod wo_snd_capture-x86.ko I get this error insmod: ERROR: could not load module wo_snd_capture-x86.ko: No such file or directory. What to do?
    – Puspam
    Jun 4 '20 at 7:54
3

Mmmm I tried that app before but it does not work for me, so I recommend this method:

  • First install ip camera on the phone, then install pulseaudio, when you have that done, open ipcamera and start the server on you phone, make sure that you pc is connected on the same network.
  • Open Chrome or Firefox and type the IP address that ipcamera provides you (the ip will show in the app).
  • In the browser click on audio player and choose HTML5, and make sure that you hear something.
  • Open pulseaudio and go to the Playback tab, then click and show and select All Streams. You will see the chrome or firefox application playing the microphone.
  • On the application section select Lookback for Chrome or Firefox; that will redirect the audio from you phone to the microphone channel, you can do the same but using VLC and deal better with issues like the lag.
2
2

If your linux release is using pavucontrol(pulseaudio), you should do:

$ pulseaudio -k
$ killall micclient-x86_64.AppImage
$ sudo modprobe -r snd-aloop
$ sudo vi /etc/pulse/default.pa

add into default.pa:

load-module module-alsa-source device=hw:CARD=Loopback,DEV=1,SUBDEV=0
$ sudo modprobe snd-aloop
$ pulseaudio --start
$ sudo cp micclient-x86_64.AppImage /usr/bin/MicClient
$ while true; do nohup MicClient -t Wifi 192.168.1.100 > /dev/null 2>&1; sleep 1; done &

192.168.1.100 is my phone IP in local network, you should change it to your phone's LAN ip.

In pavucontrol(Volume Control), in "Input Devices" tab, enable "Built-in Audio"(not "Built-in Audio Analog Stereo") as input device.

And redirect MicClient audio to virtual output device, first in "pavucontrol/Input Devices" to tick "Built-in Audio" to "Set as fallback" and then:

$ pactl load-module module-loopback latency_msec=1

Now with WoMic in android and micclient-x86_64.AppImage in x64 linux, you have a set of home karaoke equipment with near 0 latency.

If you hear many noises, you could try to switch the "WO Mic Settings/Audio source" in your android phone, for example: nexus 6p should choose "Mic(mode 2)".

To disable redirecting MicCleint audio to Output Device:

$ pactl unload-module module-loopback

Refer: https://gist.github.com/diyism/5959444e324a1b38509d956beb760e6a

2
  • Thanks! It worked for me Sep 30 '20 at 21:14
  • There is no Built-in Audio on Input Devices on my arch linux
    – Nurul Huda
    Feb 20 at 7:08
2

If your phone has an audio jack, you can connect an aux cable from it to your desktop's microphone jack. Then just install an app that redirects your phone's microphone input out of the speaker such as Microphone.

Note: Make sure you have your phone's volume off mute. I normally have it on mute and thought it wasn't working at first.

In order to site my sources, I should mention that I didn't come up with this idea myself. I figured it out from a youtube video

1

WO Mic for Linux

From official WO Mic site:

  1. Install WO Mic cient

    Currently we only support x86 64-bits architecture. Download micclient-x86_64.AppImage, then change it to be executable

    $ chmod +x micclient-x86_64.AppImage
    
  2. WO Mic Client Operations

    1. Load aloop module. The module shall form a full-duplex loopback soundcard.

      $ sudo modprobe snd-aloop
      
    2. Connect from client.

      Run below commands to connect. WO Mic client shall write audio data into loopback device. If you meet glitches, please try to run the program as root so that its scheduling can be more aggressive.

      • Conenct by Wifi. You can find the IP address on WO Mic app UI.

        $ ./micclient-x86_64.AppImage -t Wifi 192.168.1.100
        
      • Connect by Bluetooth. xx:xx:xx:xx:xx:xx represents phone Bluetooth address. You can query it on your phone: Settings -> About phone -> Status -> Bluetooth address.

        $ ./micclient-x86_64.AppImage -t Bluetooth xx:xx:xx:xx:xx:xx
        
    3. Now third party program can make use of captured data through loopback device. One example:

      $ arecord -c 1 -r 48000 -f S16_LE -D "hw:CARD=Loopback,DEV=1,SUBDEV=0" foo.wav
      
1
  • This command is not quite clear, I have connected over wifi, now what? Do i have to run below command i.e replace arecord with my application ?.. arecord -c 1 -r 48000 -f S16_LE -D "hw:CARD=Loopback,DEV=1,SUBDEV=0" foo.wav Nov 21 '20 at 15:32

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.