After this update espeak stopped working

After this update, espeak is stopped working.
When I enter:

$ espeak -k20 -s150 "Hello"

It doesn’t say anything and hangs out without showing any output until I exit by pressing Ctrl + c.
But before this update it was working correctly.
Does anyone has a fix for this problem?

Did you install it from the AUR, or as a Flatpak? If so, uninstall it and use espeak-ng from the Arch/Manjaro repositories. This will make sure it’s updated as needed rather than breaking with every Manjaro update. Cheers.

I installed it from AUR but I also have espeak-ng installed and it has the same problem too :smiling_face_with_tear:
Should I reinstall espeak-ng or it doesn’t make any sense?

@vilmil

It makes no sense to have both installed. Espeak-ng is the better choice to keep, so remove the AUR version; you should only have one version installed (two will probably conflict leaving neither working). This is possibly the issue.

@yoda_1

I understood that you were asking to clarify command usage:

See the @Yochanan post for the note about archlinux-keyring.

Cheers.

When I tried to remove the espeak, I faced a strange problem. :thinking:
When I try to remove it, it claim that espeak does not exists and not installed:

$ sudo pacman -Rnsu espeak
[sudo] password for milad: 
error: target not found: espeak

Or if I try to remove it using yay, I get same error:

$ yay -Rnsu espeak
[sudo] password for milad: 
error: target not found: espeak
 -> exit status 1

But I can find its location using following command:

$ which espeak
/usr/bin/espeak

I’m think of removing espeak-ng itself and see what happens to espeak :thinking:

I suggest removing both; and then installing a fresh copy of espeak-ng.

2 Likes

I did so and it didn’t fix the problem.
Also I realized that espeak is not from the AUR but just a symbolic link to espeak-ng:

$ ls /usr/bin/esp* -al                                                                                                                                          
-rwxr-xr-x 1 root root  1567 May 28  2021 /usr/bin/espdiff
lrwxrwxrwx 1 root root     9 Sep 17  2022 /usr/bin/espeak -> espeak-ng
-rwxr-xr-x 1 root root 27280 Sep 17  2022 /usr/bin/espeak-ng

Also I find out that by piping output of espeak-ng to aplay I can make it work:

$ espeak-ng "hello" --stdout | aplay

I think it means that maybe espeak-ng is trying to use a wrong audio output device but I wasn’t able to find its configuration file.
Anyway, I appreciate your effort to solve my problem and if you had anymore suggestion I’m willingly ready to know.
Thank you

Yes, that works with mine; as does simply espeak "hello". I couldn’t find any documentation related to configuration; apart from ./configure used when compiling the program. Perhaps the issue is pulse/pipewire rather than configuration related.

What is the output of

pacman -Qs espeak

I have espeak installed and it was working without any problem.
But after my last night update, it stopped working.
When I enter:

$ espeak "hello"

It doesn’t show anything and don’t make any sound but hangs out until I terminate it with Ctrl + c.
Does anyone has a solution for this problem?

System Information

Output of inxi command
$ inxi --full --admin --filter --width
System:
  Kernel: 6.1.55-1-MANJARO arch: x86_64 bits: 64 compiler: gcc v: 13.2.1
    clocksource: tsc available: hpet,acpi_pm
    parameters: BOOT_IMAGE=/vmlinuz-6.1-x86_64
    root=UUID=1af94ad5-bab8-48d2-be7e-0e84601d10a9 rw quiet
    resume=UUID=9a4f6dd4-2389-4af2-9442-47e9e869e8ae udev.log_priority=3
    sysrq_always_enabled=1
  Desktop: KDE Plasma v: 5.27.8 tk: Qt v: 5.15.11 info: cairo-dock
    wm: kwin_x11 vt: 2 dm: SDDM Distro: Manjaro Linux base: Arch Linux
Machine:
  Type: Laptop System: LENOVO product: 80NJ v: ideapad 305-15IBD
    serial: <superuser required> Chassis: type: 10 v: ideapad 305-15IBD
    serial: <superuser required>
  Mobo: LENOVO model: ideapad 305-15IB v: No DPK serial: <superuser required>
    UEFI-[Legacy]: LENOVO v: A8CN38WW(V2.03) date: 04/24/2015
Battery:
  ID-1: BAT1 charge: 12.3 Wh (100.0%) condition: 12.3/31.7 Wh (39.0%)
    power: 1053.5 W volts: 16.1 min: 14.4 model: COMPAL PABAS0241231 type: Li-ion
    serial: <filter> status: full
CPU:
  Info: model: Intel Core i5-5200U bits: 64 type: MT MCP arch: Broadwell
    gen: core 5 level: v3 note: check built: 2015-18 process: Intel 14nm
    family: 6 model-id: 0x3D (61) stepping: 4 microcode: 0x2F
  Topology: cpus: 1x cores: 2 tpc: 2 threads: 4 smt: enabled cache:
    L1: 128 KiB desc: d-2x32 KiB; i-2x32 KiB L2: 512 KiB desc: 2x256 KiB
    L3: 3 MiB desc: 1x3 MiB
  Speed (MHz): avg: 2200 min/max: 500/2700 scaling: driver: intel_cpufreq
    governor: schedutil cores: 1: 2200 2: 2200 3: 2200 4: 2200 bogomips: 17604
  Flags: avx avx2 ht lm nx pae sse sse2 sse3 sse4_1 sse4_2 ssse3
  Vulnerabilities:
  Type: gather_data_sampling status: Not affected
  Type: itlb_multihit status: KVM: VMX unsupported
  Type: l1tf mitigation: PTE Inversion
  Type: mds mitigation: Clear CPU buffers; SMT vulnerable
  Type: meltdown mitigation: PTI
  Type: mmio_stale_data status: Unknown: No mitigations
  Type: retbleed status: Not affected
  Type: spec_rstack_overflow status: Not affected
  Type: spec_store_bypass mitigation: Speculative Store Bypass disabled via
    prctl
  Type: spectre_v1 mitigation: usercopy/swapgs barriers and __user pointer
    sanitization
  Type: spectre_v2 mitigation: Retpolines, IBPB: conditional, IBRS_FW,
    STIBP: conditional, RSB filling, PBRSB-eIBRS: Not affected
  Type: srbds mitigation: Microcode
  Type: tsx_async_abort status: Not affected
Graphics:
  Device-1: Intel HD Graphics 5500 vendor: Lenovo driver: i915 v: kernel
    arch: Gen-8 process: Intel 14nm built: 2014-15 ports: active: eDP-1
    empty: DP-1,HDMI-A-1 bus-ID: 00:02.0 chip-ID: 8086:1616 class-ID: 0300
  Device-2: AMD Sun XT [Radeon HD 8670A/8670M/8690M / R5 M330 M430 Radeon
    520 Mobile] vendor: Lenovo driver: radeon v: kernel alternate: amdgpu
    arch: GCN-1 code: Southern Islands process: TSMC 28nm built: 2011-20 pcie:
    gen: 2 speed: 5 GT/s lanes: 4 link-max: gen: 3 speed: 8 GT/s lanes: 8
    bus-ID: 0a:00.0 chip-ID: 1002:6660 class-ID: 0380 temp: 44.0 C
  Device-3: IMC Networks Lenovo EasyCamera driver: uvcvideo type: USB
    rev: 2.0 speed: 480 Mb/s lanes: 1 mode: 2.0 bus-ID: 2-6:2 chip-ID: 13d3:5727
    class-ID: 0e02 serial: <filter>
  Display: x11 server: X.Org v: 21.1.8 with: Xwayland v: 23.2.1
    compositor: kwin_x11 driver: X: loaded: modesetting,radeon unloaded: vesa
    alternate: fbdev dri: iris gpu: i915 display-ID: :0 screens: 1
  Screen-1: 0 s-res: 1366x768 s-dpi: 96 s-size: 361x203mm (14.21x7.99")
    s-diag: 414mm (16.31")
  Monitor-1: eDP-1 model: ChiMei InnoLux 0x15bd built: 2013 res: 1366x768
    hz: 60 dpi: 101 gamma: 1.2 size: 344x193mm (13.54x7.6") diag: 394mm (15.5")
    ratio: 16:9 modes: 1366x768
  API: EGL v: 1.5 hw: drv: intel iris drv: amd radeonsi platforms: device: 0
    drv: iris device: 1 drv: radeonsi device: 2 drv: swrast gbm: drv: kms_swrast
    surfaceless: drv: iris x11: drv: iris inactive: wayland
  API: OpenGL v: 4.6 compat-v: 4.5 vendor: intel mesa v: 23.1.9-manjaro1.1
    glx-v: 1.4 direct-render: yes renderer: Mesa Intel HD Graphics 5500 (BDW GT2)
    device-ID: 8086:1616 memory: 15.18 GiB unified: yes
  API: Vulkan v: 1.3.264 layers: 5 device: 0 type: integrated-gpu name: Intel
    HD Graphics 5500 (BDW GT2) driver: mesa intel v: 23.1.9-manjaro1.1
    device-ID: 8086:1616 surfaces: xcb,xlib
Audio:
  Device-1: Intel Broadwell-U Audio vendor: Lenovo driver: snd_hda_intel
    v: kernel bus-ID: 00:03.0 chip-ID: 8086:160c class-ID: 0403
  Device-2: Intel Wildcat Point-LP High Definition Audio vendor: Lenovo
    driver: snd_hda_intel v: kernel bus-ID: 00:1b.0 chip-ID: 8086:9ca0
    class-ID: 0403
  API: ALSA v: k6.1.55-1-MANJARO status: kernel-api with: aoss
    type: oss-emulator tools: alsactl,alsamixer,amixer
  Server-1: JACK v: 1.9.22 status: off tools: N/A
  Server-2: PipeWire v: 0.3.81 status: active with: 1: pipewire-pulse
    status: active 2: pipewire-media-session status: active 3: pipewire-alsa
    type: plugin tools: pactl,pw-cat,pw-cli
Network:
  Device-1: Realtek RTL8111/8168/8411 PCI Express Gigabit Ethernet
    vendor: Lenovo driver: r8168 v: 8.052.01-NAPI modules: r8169 pcie: gen: 1
    speed: 2.5 GT/s lanes: 1 port: 4000 bus-ID: 08:00.0 chip-ID: 10ec:8168
    class-ID: 0200
  IF: enp8s0 state: down mac: <filter>
  Device-2: Intel Wireless 3160 driver: iwlwifi v: kernel pcie: gen: 1
    speed: 2.5 GT/s lanes: 1 bus-ID: 09:00.0 chip-ID: 8086:08b4 class-ID: 0280
  IF: wlp9s0 state: up mac: <filter>
Bluetooth:
  Device-1: Intel Bluetooth wireless interface driver: btusb v: 0.8 type: USB
    rev: 2.0 speed: 12 Mb/s lanes: 1 mode: 1.1 bus-ID: 2-7:3 chip-ID: 8087:07dc
    class-ID: e001
  Report: btmgmt ID: hci0 rfk-id: 3 state: down bt-service: enabled,running
    rfk-block: hardware: no software: yes address: <filter> bt-v: 4.0 lmp-v: 6
    status: discoverable: yes pairing: yes
Drives:
  Local Storage: total: 1.82 TiB used: 61.77 GiB (3.3%)
  SMART Message: Unable to run smartctl. Root privileges required.
  ID-1: /dev/sda maj-min: 8:0 vendor: Samsung model: SSD 870 EVO 1TB
    size: 931.51 GiB block-size: physical: 512 B logical: 512 B speed: 6.0 Gb/s
    tech: SSD serial: <filter> fw-rev: 2B6Q scheme: MBR
  ID-2: /dev/sdb maj-min: 8:16 vendor: Western Digital
    model: WD10JPCX-24UE4T0 size: 931.51 GiB block-size: physical: 4096 B
    logical: 512 B speed: 3.0 Gb/s tech: HDD rpm: 5400 serial: <filter>
    fw-rev: 1A01 scheme: MBR
Partition:
  ID-1: / raw-size: 39.06 GiB size: 38.15 GiB (97.67%) used: 34.74 GiB (91.1%)
    fs: ext4 dev: /dev/sda10 maj-min: 8:10
  ID-2: /boot raw-size: 1000 MiB size: 965.9 MiB (96.59%)
    used: 310.8 MiB (32.2%) fs: ext4 dev: /dev/sda9 maj-min: 8:9
  ID-3: /home raw-size: 30.27 GiB size: 29.62 GiB (97.87%)
    used: 26.72 GiB (90.2%) fs: ext4 dev: /dev/sda11 maj-min: 8:11
Swap:
  Kernel: swappiness: 10 (default 60) cache-pressure: 100 (default) zswap: yes
    compressor: zstd max-pool: 20%
  ID-1: swap-1 type: partition size: 7.81 GiB used: 0 KiB (0.0%) priority: -2
    dev: /dev/sda8 maj-min: 8:8
Sensors:
  System Temperatures: cpu: 46.0 C mobo: N/A gpu: radeon temp: 44.0 C
  Fan Speeds (rpm): N/A
Info:
  Processes: 219 Uptime: 15m wakeups: 1 Memory: total: 16 GiB
  available: 15.54 GiB used: 3.82 GiB (24.6%) Init: systemd v: 254
  default: graphical tool: systemctl Compilers: gcc: 13.2.1 clang: 16.0.6
  Packages: pm: dpkg pkgs: 0 pm: pacman pkgs: 2417 libs: 493
  tools: octopi,pacaur,pamac,yay pm: flatpak pkgs: 0 Shell: Zsh v: 5.9
  running-in: konsole inxi: 3.3.30

Hi @vilmil,

How did you install espeak?

Because, it seems it could have been either the extra repository, or the AUR:

$ pamac search espeak
[...]
espeak-ng  1.51.1-2                                                                                                                                                                                                                                     extra
Multi-lingual software speech synthesizer
espeak  1:1.48.04-4                                                                                                                                                                                                                                       AUR
Text to Speech engine for English, with support for other languages
3 Likes

I cannot reproduce - so I am afraid I have no solution.

It could however relate to how you installed it as @Mirdarthos rightfully question.

If you used a custom package - then an update may cause the custom package to cease function - in such case you need to rebuild the package.

As such custom package is maintained locally by you - any cease to function after an update is legitimate when it comes to custom packages - it is not a Manjaro issue.

There is a package in the repo named espeak-ng - thus it will update with normal system sync.

2 Likes

I have installed espeak from AUR but I also have espeak-ng installed from extra repository but the problem is that espeak-ng has the same problem too.
Here is output of searching espeak:

$ pamac search espeak                                                                                                                                  
gst-plugins-espeak  0.5.0-4                                                                                                                                        extra
    Use espeak as a sound source for gstreamer
espeakup  0.90-2                                                                                                                                                   extra
    A light weight connector for espeak-ng and speakup
espeak-ng  1.51.1-2 [Installed]                                                                                                                                    extra
    Multi-lingual software speech synthesizer

@linux-aarhus Thank you for your reply.
I checked out espeak-ng but it has the same problem too.

You should check your audio installation, in context, anything related to audio (pulse, pipewire, alsa) and related configuration.

As I noted above - I cannot reproduce a hang, as I am getting the expected result.

espeak "hello, I am your computer. I can only do, what you tell me to do."

I searched more and I found some information which may help you to figure out my problem.

  1. When I try to run espeak-ng with sudo privileges, it raises following error and exits without making any sound:
$ sudo espeak-ng "hello"
error: Host is down
  1. I can make both espeak and espeak-ng to work by piping to aplay:
$ espeak-ng "hello" --stdout | aplay                                                                                                                             
Playing WAVE 'stdin' : Signed 16 bit Little Endian, Rate 22050 Hz, Mono
$ espeak "hello" --stdout | aplay                                                                                                                                 
Playing WAVE 'stdin' : Signed 16 bit Little Endian, Rate 22050 Hz, Mono

Which both works without problem.

As your issue is not reproducable :man_shrugging: it is next to impossible to provide a meaningful response.

Running with sudo means nothing.

The Linux sound system is run in the context of the user. When using sudo you are elevating permissions but as you are not logged in as root the soundserver for root user is not available - thus the error Host is down.

As I stated above - you need to recheck your configurations.

2 Likes

Here is the output:

$ pacman -Qs espeak                                                                                                                                              
local/espeak-ng 1.51.1-2
    Multi-lingual software speech synthesizer

So, espeak is not installed. Why?

You maybe right because I didn’t find any configuration file for espeak too.
My audio server is pipewire and the only configuration file of pipewire is located at /usr/share/pipewire/pipewire.conf according to this page in my case (Other mentioned directories are empty and there is no other configuration file).
I think you are right and the problem is originated from pipewire because the pipewire-related packages got updated in last update. Here is the configuration at /usr/share/pipewire/pipewire.conf:

# Daemon config file for PipeWire version "0.3.81" #
#
# Copy and edit this file in /etc/pipewire for system-wide changes
# or in ~/.config/pipewire for local changes.
#
# It is also possible to place a file with an updated section in
# /etc/pipewire/pipewire.conf.d/ for system-wide changes or in
# ~/.config/pipewire/pipewire.conf.d/ for local changes.
#

context.properties = {
    ## Configure properties in the system.
    #library.name.system                   = support/libspa-support
    #context.data-loop.library.name.system = support/libspa-support
    #support.dbus                          = true
    #link.max-buffers                      = 64
    link.max-buffers                       = 16                       # version < 3 clients can't handle more
    #mem.warn-mlock                        = false
    #mem.allow-mlock                       = true
    #mem.mlock-all                         = false
    #clock.power-of-two-quantum            = true
    #log.level                             = 2
    #cpu.zero.denormals                    = false

    core.daemon = true              # listening for socket connections
    core.name   = pipewire-0        # core name and socket name

    ## Properties for the DSP configuration.
    #default.clock.rate          = 48000
    #default.clock.allowed-rates = [ 48000 ]
    #default.clock.quantum       = 1024
    #default.clock.min-quantum   = 32
    #default.clock.max-quantum   = 2048
    #default.clock.quantum-limit = 8192
    #default.video.width         = 640
    #default.video.height        = 480
    #default.video.rate.num      = 25
    #default.video.rate.denom    = 1
    #
    #settings.check-quantum      = false
    #settings.check-rate         = false
    #
    # These overrides are only applied when running in a vm.
    vm.overrides = {
        default.clock.min-quantum = 1024
    }

    # keys checked below to disable module loading
    module.x11.bell = true
    # enables autoloading of access module, when disabled an alternative
    # access module needs to be loaded.
    module.access = true
    # enables autoloading of module-jackdbus-detect
    module.jackdbus-detect = true
}

context.spa-libs = {
    #<factory-name regex> = <library-name>
    #
    # Used to find spa factory names. It maps an spa factory name
    # regular expression to a library name that should contain
    # that factory.
    #
    audio.convert.* = audioconvert/libspa-audioconvert
    avb.*           = avb/libspa-avb
    api.alsa.*      = alsa/libspa-alsa
    api.v4l2.*      = v4l2/libspa-v4l2
    api.libcamera.* = libcamera/libspa-libcamera
    api.bluez5.*    = bluez5/libspa-bluez5
    api.vulkan.*    = vulkan/libspa-vulkan
    api.jack.*      = jack/libspa-jack
    support.*       = support/libspa-support
    #videotestsrc   = videotestsrc/libspa-videotestsrc
    #audiotestsrc   = audiotestsrc/libspa-audiotestsrc
}

context.modules = [
    #{ name = <module-name>
    #    ( args  = { <key> = <value> ... } )
    #    ( flags = [ ( ifexists ) ( nofail ) ] )
    #    ( condition = [ { <key> = <value> ... } ... ] )
    #}
    #
    # Loads a module with the given parameters.
    # If ifexists is given, the module is ignored when it is not found.
    # If nofail is given, module initialization failures are ignored.
    # If condition is given, the module is loaded only when the context
    # properties all match the match rules.
    #

    # Uses realtime scheduling to boost the audio thread priorities. This uses
    # RTKit if the user doesn't have permission to use regular realtime
    # scheduling.
    { name = libpipewire-module-rt
        args = {
            nice.level    = -11
            #rt.prio      = 88
            #rt.time.soft = -1
            #rt.time.hard = -1
        }
        flags = [ ifexists nofail ]
    }

    # The native communication protocol.
    { name = libpipewire-module-protocol-native }

    # The profile module. Allows application to access profiler
    # and performance data. It provides an interface that is used
    # by pw-top and pw-profiler.
    { name = libpipewire-module-profiler }

    # Allows applications to create metadata objects. It creates
    # a factory for Metadata objects.
    { name = libpipewire-module-metadata }

    # Creates a factory for making devices that run in the
    # context of the PipeWire server.
    { name = libpipewire-module-spa-device-factory }

    # Creates a factory for making nodes that run in the
    # context of the PipeWire server.
    { name = libpipewire-module-spa-node-factory }

    # Allows creating nodes that run in the context of the
    # client. Is used by all clients that want to provide
    # data to PipeWire.
    { name = libpipewire-module-client-node }

    # Allows creating devices that run in the context of the
    # client. Is used by the session manager.
    { name = libpipewire-module-client-device }

    # The portal module monitors the PID of the portal process
    # and tags connections with the same PID as portal
    # connections.
    { name = libpipewire-module-portal
        flags = [ ifexists nofail ]
    }

    # The access module can perform access checks and block
    # new clients.
    { name = libpipewire-module-access
        args = {
            # access.allowed to list an array of paths of allowed
            # apps.
            #access.allowed = [
            #    /usr/bin/pipewire-media-session
            #]

            # An array of rejected paths.
            #access.rejected = [ ]

            # An array of paths with restricted access.
            #access.restricted = [ ]

            # Anything not in the above lists gets assigned the
            # access.force permission.
            #access.force = flatpak
        }
        condition = [ { module.access = true } ]
    }

    # Makes a factory for wrapping nodes in an adapter with a
    # converter and resampler.
    { name = libpipewire-module-adapter }

    # Makes a factory for creating links between ports.
    { name = libpipewire-module-link-factory }

    # Provides factories to make session manager objects.
    { name = libpipewire-module-session-manager }

    # Use libcanberra to play X11 Bell
    { name = libpipewire-module-x11-bell
        args = {
            #sink.name = ""
            #sample.name = "bell-window-system"
            #x11.display = null
            #x11.xauthority = null
        }
        flags = [ ifexists nofail ]
        condition = [ { module.x11.bell = true } ]
    }
    { name = libpipewire-module-jackdbus-detect
        args {
            #jack.library     = libjack.so.0
            #jack.server      = null
            #jack.client-name = PipeWire
            #jack.connect     = true
            #tunnel.mode      = duplex  # source|sink|duplex
            source.props = {
                #audio.channels = 2
                #midi.ports = 1
                #audio.position = [ FL FR ]
                # extra sink properties
            }
            sink.props = {
                #audio.channels = 2
                #midi.ports = 1
                #audio.position = [ FL FR ]
                # extra sink properties
            }
        }
        flags = [ ifexists nofail ]
        condition = [ { module.jackdbus-detect = true } ]
    }
]

context.objects = [
    #{ factory = <factory-name>
    #    ( args  = { <key> = <value> ... } )
    #    ( flags = [ ( nofail ) ] )
    #    ( condition = [ { <key> = <value> ... } ... ] )
    #}
    #
    # Creates an object from a PipeWire factory with the given parameters.
    # If nofail is given, errors are ignored (and no object is created).
    # If condition is given, the object is created only when the context properties
    # all match the match rules.
    #
    #{ factory = spa-node-factory   args = { factory.name = videotestsrc node.name = videotestsrc node.description = videotestsrc Spa:Pod:Object:Param:Props:patternType = 1 } }
    #{ factory = spa-device-factory args = { factory.name = api.jack.device foo=bar } flags = [ nofail ] }
    #{ factory = spa-device-factory args = { factory.name = api.alsa.enum.udev } }
    #{ factory = spa-node-factory   args = { factory.name = api.alsa.seq.bridge node.name = Internal-MIDI-Bridge } }
    #{ factory = adapter            args = { factory.name = audiotestsrc node.name = my-test node.description = audiotestsrc } }
    #{ factory = spa-node-factory   args = { factory.name = api.vulkan.compute.source node.name = my-compute-source } }

    # A default dummy driver. This handles nodes marked with the "node.always-driver"
    # property when no other driver is currently active. JACK clients need this.
    { factory = spa-node-factory
        args = {
            factory.name    = support.node.driver
            node.name       = Dummy-Driver
            node.group      = pipewire.dummy
            priority.driver = 20000
            #clock.id       = monotonic # realtime | tai | monotonic-raw | boottime
            #clock.name     = "clock.system.monotonic"
        }
    }
    { factory = spa-node-factory
        args = {
            factory.name    = support.node.driver
            node.name       = Freewheel-Driver
            priority.driver = 19000
            node.group      = pipewire.freewheel
            node.freewheel  = true
        }
    }

    # This creates a new Source node. It will have input ports
    # that you can link, to provide audio for this source.
    #{ factory = adapter
    #    args = {
    #        factory.name     = support.null-audio-sink
    #        node.name        = "my-mic"
    #        node.description = "Microphone"
    #        media.class      = "Audio/Source/Virtual"
    #        audio.position   = "FL,FR"
    #    }
    #}

    # This creates a single PCM source device for the given
    # alsa device path hw:0. You can change source to sink
    # to make a sink in the same way.
    #{ factory = adapter
    #    args = {
    #        factory.name           = api.alsa.pcm.source
    #        node.name              = "alsa-source"
    #        node.description       = "PCM Source"
    #        media.class            = "Audio/Source"
    #        api.alsa.path          = "hw:0"
    #        api.alsa.period-size   = 1024
    #        api.alsa.headroom      = 0
    #        api.alsa.disable-mmap  = false
    #        api.alsa.disable-batch = false
    #        audio.format           = "S16LE"
    #        audio.rate             = 48000
    #        audio.channels         = 2
    #        audio.position         = "FL,FR"
    #    }
    #}

    # Use the metadata factory to create metadata and some default values.
    #{ factory = metadata
    #    args = {
    #        metadata.name = my-metadata
    #        metadata.values = [
    #            { key = default.audio.sink   value = { name = somesink } }
    #            { key = default.audio.source value = { name = somesource } }
    #        ]
    #    }
    #}
]

context.exec = [
    #{   path = <program-name>
    #    ( args = "<arguments>" )
    #    ( condition = [ { <key> = <value> ... } ... ] )
    #}
    #
    # Execute the given program with arguments.
    # If condition is given, the program is executed only when the context
    # properties all match the match rules.
    #
    # You can optionally start the session manager here,
    # but it is better to start it as a systemd service.
    # Run the session manager with -h for options.
    #
    #{ path = "/usr/bin/pipewire-media-session" args = ""
    #  condition = [ { exec.session-manager = null } { exec.session-manager = true } ] }
    #
    # You can optionally start the pulseaudio-server here as well
    # but it is better to start it as a systemd service.
    # It can be interesting to start another daemon here that listens
    # on another address with the -a option (eg. -a tcp:4713).
    #
    #{ path = "/usr/bin/pipewire" args = "-c pipewire-pulse.conf"
    #  condition = [ { exec.pipewire-pulse = null } { exec.pipewire-pulse = true } ] }
]

Because I’m installing the espeak-ng which is official but espeak is maintained by AUR.