Re: How to create a virtual microphone with source set as default monitor device?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This project started attempting to capture the output of
window.speechSynthesis.speak().

Consider https://stackoverflow.com/a/43553706.

If run $ pacmd list-sink-inputs will get

    index: 219
    driver: <protocol-native.c>
    flags:
    state: RUNNING
    sink: 4 <alsa_output.pci-0000_00_14.2.analog-stereo>
    volume: mono: 64460 /  98% / -0.43 dB
            balance 0.00
    muted: no
    current latency: 0.00 ms
    requested latency: 0.59 ms
    sample spec: s16le 1ch 22050Hz
    channel map: mono
                 Mono
    resample method: speex-float-1
    module: 14
    client: 192 <speech-dispatcher-espeak-ng>
    properties:
        media.name = "playback"
        application.name = "speech-dispatcher-espeak-ng"
        native-protocol.peer = "UNIX socket client"
        native-protocol.version = "33"
        application.process.id = "45464"
        application.process.user = "ubuntu-studio"
        application.process.host = "ubuntu-studio"
        application.process.binary = "sd_espeak-ng"
        application.language = "C"
        window.x11.display = ":0.0"
        application.process.machine_id = "<id>"
        application.process.session_id = "<id>"
        module-stream-restore.id =
"sink-input-by-application-name:speech-dispatcher-espeak-ng"

$ pacmd list-sources

2 source(s) available.
  * index: 4
    name: <alsa_input.usb-046d_0804_0B17FC60-02.mono-fallback>
    driver: <module-alsa-card.c>
    flags: HARDWARE HW_MUTE_CTRL HW_VOLUME_CTRL DECIBEL_VOLUME LATENCY
DYNAMIC_LATENCY
    state: RUNNING
    suspend cause: (none)
    priority: 9040
    volume: mono: 0 /   0% / -inf dB
            balance 0.00
    base volume: 20724 /  32% / -30.00 dB
    volume steps: 65537
    muted: yes
    current latency: 4.60 ms
    max rewind: 0 KiB
    sample spec: s16le 1ch 48000Hz
    channel map: mono
                 Mono
    used by: 1
    linked by: 1
    configured latency: 40.00 ms; range is 0.50 .. 2000.00 ms
    card: 1 <alsa_card.usb-046d_0804_0B17FC60-02>
    module: 8
    properties:
        alsa.resolution_bits = "16"
        device.api = "alsa"
        device.class = "sound"
        alsa.class = "generic"
        alsa.subclass = "generic-mix"
        alsa.name = "USB Audio"
        alsa.id = "USB Audio"
        alsa.subdevice = "0"
        alsa.subdevice_name = "subdevice #0"
        alsa.device = "0"
        alsa.card = "1"
        alsa.card_name = "USB Device 0x46d:0x804"
        alsa.long_card_name = "USB Device 0x46d:0x804 at
usb-0000:00:12.0-1.4, high speed"
        alsa.driver_name = "snd_usb_audio"
        device.bus_path = "pci-0000:00:12.0-usb-0:1.4:1.2"
        sysfs.path =
"/devices/pci0000:00/0000:00:12.0/usb1/1-1/1-1.4/1-1.4:1.2/sound/card1"
        udev.id = "usb-046d_0804_0B17FC60-02"
        device.bus = "usb"
        device.vendor.id = "046d"
        device.vendor.name = "<vendor>"
        device.product.id = "0804"
        device.product.name = "<name>"
        device.serial = "046d_0804_0B17FC60"
        device.form_factor = "webcam"
        device.string = "hw:1"
        device.buffering.buffer_size = "192000"
        device.buffering.fragment_size = "96000"
        device.access_mode = "mmap+timer"
        device.profile.name = "mono-fallback"
        device.profile.description = "Mono"
        device.description = "<description>"
        module-udev-detect.discovered = "1"
        device.icon_name = "camera-web-usb"
    ports:
        analog-input-mic: Microphone (priority 8700, latency offset 0
usec, available: unknown)
            properties:
                device.icon_name = "audio-input-microphone"
    active port: <analog-input-mic>

One part of what am trying to do is create a virtual microphone that
takes input from speech-dispatcher-espeak-ng persistently or route
output from speech-dispatcher-espeak-ng to the microphone, so that
when capture the microphone the output will be from speech-dispatcher.
How to achieve that?


On Tue, Sep 8, 2020 at 9:24 PM Sean Greenslade <sean@xxxxxxxxxxxxxxxxxx> wrote:
>
> On Mon, Sep 07, 2020 at 05:03:59PM -0700, guest271314 wrote:
> > > I doubt that will be possible. Pavucontrol makes use of the native
> > > pulseaudio APIs, which are not exposed to javascript.
> >
> > If mpv can be embedded in an HTML document
> > https://github.com/Kagami/mpv.js it should be possible to embed
> > pavucontrol or pavucontrol-qt
> > (https://doc.qt.io/qt-5/qtwebchannel-javascript.html ;
> > https://medium.com/@petar.koretic/why-you-should-use-qt-qml-for-you-next-cross-platform-application-part-1-desktop-5e6d8856b7b4)
> > in particular in a browser; for example using WebAssembly; WASI;
> > Native Messaging; at least the ability to control Recording tab (-t 2)
> > from JavaScript or an HTML form.
>
> Electron is a whole separate discussion. Electron applications have
> different levels of access to the system than the vanilla chromium
> browser.
>
> > > After reading through those bug reports and related issue links, it's
> > > pretty clear that this is not a use case that they are particularly
> > > interested in supporting.
> >
> > The majority of own repositories at github are dedicated to fixing
> > WontFix; supporting SSML parsing; variable width and height video
> > capture with ability to merge multiple tracks into a single media
> > container, or stream media without a container; streaming audio
> > potentially infinite input streams, that is, a dynamic Internet radio
> > station; capturing speech synthesis output from Web Speech API, which
> > is the origin of this use case of capturing system audio output.
> >
> > > May I perhaps suggest using a different
> > > browser?  Firefox had no problem with monitor inputs last time I
> > > checked.
> >
> > Interestingly, am completing testing of another workaround where since
> > Firefox does capture monitor devices, a new, dedicated instance of
> > Nightly is started prior to launching Chromium, the MediaStreamTrack
> > and MediaStream therefrom are added to a WebRTC RTCPeerConnection, and
> > currently using clipboard for signaling which is not ideal though is
> > one way to exchange text data between different browsers, accessing
> > the monitor device at Chromium instance generated at Nightly
> > https://gist.github.com/guest271314/04a539c00926e15905b86d05138c113c.
> > That approach avoids writing and reading raw PCM to memory.
>
> With the amount of work you're seeming to have put into workarounds,
> maybe you would be better off writing a proper native application?
>
> > > No idea, I've never done it myself. The example listed in the online
> > > docs shows a simple stereo swap, so you could presumably adapt it by
> > > switching the channels to be non-swapped (and of course substitute your
> > > specific master source name).
> >
> > Not sure precisely how to begin.
> >
> > Am still trying to gather the specific commands in code that
> > pavucontrol uses when setting the stream at the UI. Am not certain
> > what to pass to pactl move-source-output at what time
> > https://gitlab.freedesktop.org/pulseaudio/pavucontrol/-/issues/91#note_590795.
>
> If you read the documentation (e.g. man pactl), it seems pretty
> straightforward:
>
> > move-source-output ID SOURCE
> >      Move the specified recording stream (identified by its numerical index) to the specified source (identified by its symbolic name or numerical index).
>
> So you need to find the specific source output index (ID) and your new
> target source (SOURCE). I started an audacity session recording my
> microphone, and ran the "pactl list source-outputs" command. This gave
> me the index. I then ran the "pactl list sources" to find my target
> source name. The switch command (for my setup) then looked like this:
>
> > pactl move-source-output 203 pulse_send_nofx.monitor
>
> --Sean
>
> _______________________________________________
> pulseaudio-discuss mailing list
> pulseaudio-discuss@xxxxxxxxxxxxxxxxxxxxx
> https://lists.freedesktop.org/mailman/listinfo/pulseaudio-discuss
_______________________________________________
pulseaudio-discuss mailing list
pulseaudio-discuss@xxxxxxxxxxxxxxxxxxxxx
https://lists.freedesktop.org/mailman/listinfo/pulseaudio-discuss



[Index of Archives]     [Linux Audio Users]     [AMD Graphics]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux