Skip to content

No noise cancellation on ASUS ROG Ally X built-in mic #84

@DrRikuSenpai

Description

@DrRikuSenpai

This issue seems to be on every distro for this device. The built-in microphone sounds atrocious and also picks up the audio from the speakers with echoes and reverberates to an extreme. Inaudible and screeching is how I describe it. So I used AI to help look for some answers wherever I could.

I had moderate success using Easy effects and RNNoise but still picked up the speakers.
I posted my attempts on reddit at a workaround with easy effects running in headless mode to get it in gaming mode. But to varying degrees of success. (I can link if you want to see or post details here but it is not a post solely about the issue.)

Eventually I read into the pipewire wiki for configurations and managed to find what I think was a better solution than easy effects.

In 'home/.config/pipewire/pipewire.conf.d/' I put a fil "10-echo-cancel.conf" with the contents below:

context.modules = [
    { name = libpipewire-module-echo-cancel
        args = {
            # 1. Monitor the speakers to subtract audio from mic
            monitor.mode = true

            # >>> ADD THIS SECTION <<<
            # This turns on the background noise removal (Fans/Static)
            aec.args = "webrtc.noise_suppression=true webrtc.gain_control=true"

            # 2. Naming the nodes
            source.props = {
                node.name        = "echo_cancel_source"
                node.description = "Clean Mic (Echo Cancelled)"
            }
            sink.props = {
                node.name        = "echo-cancel-sink"
                node.description = "Echo Cancel Sink"
            }
        }
    }
]

Then restarted and set Echo Cancel Sink as default and been using it work about a week now playing online and recorded audio with the mic to test.

In addition, I attempted to create audio EQ .conf file, "20-ally-eq.conf" , in the same directory with the attempt of getting better sound and the proper mic:

context.modules = [
    { name = libpipewire-module-filter-chain
        args = {
            node.description = "ROG Ally X Optimized"
            media.name       = "ROG Ally X Optimized"
            filter.graph = {
                nodes = [
                    # --- BAND 1: HIGH PASS (Safety) ---
                    # Cuts frequencies below 50Hz that the Ally can't play anyway
                    {
                        type   = builtin
                        name   = band_1
                        label  = bq_highpass
                        control = { "Freq" = 50.0 "Q" = 0.7 }
                    }

                    # --- BAND 2: BASS BOOST (Warmth) ---
                    # Adds punch to explosions and music
                    {
                        type   = builtin
                        name   = band_2
                        label  = bq_lowshelf
                        control = { "Freq" = 110.0 "Q" = 0.7 "Gain" = 4.0 }
                    }

                    # --- BAND 3: MID SCOOP (Clarity) ---
                    # Removes the "cardboard box" sound
                    {
                        type   = builtin
                        name   = band_3
                        label  = bq_peaking
                        control = { "Freq" = 450.0 "Q" = 1.0 "Gain" = -2.5 }
                    }

                    # --- BAND 4: TREBLE BOOST (Detail) ---
                    # Highlights footsteps and vocals
                    {
                        type   = builtin
                        name   = band_4
                        label  = bq_highshelf
                        control = { "Freq" = 4000.0 "Q" = 0.7 "Gain" = 3.0 }
                    }
                ]
                links = [
                    # Connect the bands in order: 1 -> 2 -> 3 -> 4
                    { output = "band_1:Out" input = "band_2:In" }
                    { output = "band_2:Out" input = "band_3:In" }
                    { output = "band_3:Out" input = "band_4:In" }
                ]
            }
            capture.props = {
                node.name   = "eq_input"
                media.class = "Audio/Sink"
            }
            playback.props = {
                node.name   = "eq_output"
                # We lower the global volume slightly to compensate for the Bass boost (+4dB)
                # to ensure we never clip. 0.7 is approx -3dB.
                audio.volume = 0.7

                # ROUTING: Send this straight to your Echo Canceller
                node.target = "echo-cancel-sink"
            }
        }
    }
]

This EQ profile being set as default does nothing. But using the default "Family Controller " profile works and seems a bit improved in my opinion. However I post this since it is relevant to my attempt at a solution.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions