Small garage of one Ford in the big internet
# create a fake output device
pactl load-module module-null-sink sink_name=VirtualMic sink_properties=device.description=VirtualMic
# exposes its monitor as an input (virtual mic). Now “VirtualMic” will show up as a microphone in apps.
pactl load-module module-loopback source=VirtualMic.monitor
# To ensure it routes into the virtual mic, set the default output device to VirtualMic
pactl set-default-sink VirtualMic
import sounddevice as sd
from pydub import AudioSegment
import numpy as np
# Load MP3 file
song = AudioSegment.from_mp3("test.mp3")
samples = np.array(song.get_array_of_samples())
# Convert to stereo float32
samples = samples.astype(np.float32) / (1 << 15)
# Play into PipeWire default sink (VirtualMic)
sd.play(samples, samplerate=song.frame_rate)
sd.wait()