82
submitted 7 months ago* (last edited 7 months ago) by Communist@lemmy.ml to c/linux@lemmy.ml

I have a dumb work related chrome thing, i'd like to make it so that when a certain notification sound plays in chromium, my computer does a few things automatically for me

Does anyone know a good way to make this happen?

I imagine it'd have to be setup like:

when chrome starts playing audio && check if that audio matches soundfile.ogg && myscript.sh, but I don't know any good cli utilities that could get something like that done, and if there are any better ideas!

edit: to avoid X/Y issues i've summarized the problem in full here:

  1. I have a work program, this notifies me if I get a call or email, the work program then presents an accept/decline page, and does not proceed until I either accept, decline, or it times out.
  2. I want it to do two different things depending on if it's a call or email
  3. It provides no notification other than the sound and an "accept" button on the page
  4. I have a chrome window open that does nothing but this, and I never use chrome for anything else
  5. I want to automatically do various things when I receive either this call or email
  6. I want it to be broadly applicable rather than a script designed for the specific website giving me the notification (so not a chrome extension). This prevents me from having to update any code in the event that the backend changes dramatically, and even if the notification sound changes, i'd just record a new sound as the activation noise.
  7. The noise is always the same, and hasn't changed for many years, and there is a distinct noise between calls and emails
  8. They never overlap, they never play multiple times at the same time, and they never make any noises other than those two. The noises are distinct.

These factors cause me to want to run a script once the noise is recognized, only if the noise is playing in a particular app. I'm using pipewire/hyprland on arch.

My current plan for isolating the noise is to do the following:

pactl load-module module-combine-sink sink_name='Work' slaves='easyeffects_sink'

and then set chrome exclusively to play audio on work.

Then set a script to check the sink work for audio that matches what I want. That should be simpler than the other methods i've seen to isolate the noise.

top 50 comments
sorted by: hot top controversial new old
[-] Album@lemmy.ca 63 points 7 months ago* (last edited 7 months ago)

https://xyproblem.info/

Don't give people your solution and ask them how to do it. Start with your problem out of the gate.

Instead of checking for audio maybe you can write a usescript to run actions based on what's happening on the website. Dunno tho cuz Im making assumptions at what the problem is.

[-] Communist@lemmy.ml 8 points 7 months ago

I actually want the sound thing because I think it would be cool for automating a lot of different things easily

It wouldn't be like, optimal in terms of power consumption, but an audio signal in a specific program being recognized by my computer and executing a script is generalizable and useable in many places.

[-] embed_me@programming.dev 26 points 7 months ago

And also prone to misfires and missed detection

[-] Communist@lemmy.ml 2 points 7 months ago

Not if it's specified to a single app

My chrome is literally only used for this, as are my other ideas, so, as long as it's half-decent at one specific sound per app it should work...

in theory

[-] embed_me@programming.dev 5 points 7 months ago

Sure if it doesn't play any other sound concurrently

[-] Communist@lemmy.ml 2 points 7 months ago
[-] Black616Angel@discuss.tchncs.de 2 points 7 months ago

Why not just fire the automation if chrome plays sound, like at all?

[-] Communist@lemmy.ml 3 points 7 months ago

There are two sounds it makes, they just never overlap

load more comments (2 replies)
[-] teawrecks@sopuli.xyz 2 points 7 months ago

I would be interested in a solution to OP's specific question. I have a friend who will play a particular annoying meme clip over discord. I would like something that can listen for that clip being played, and immediately disconnect him from the voice channel 😁.

Doesn't need to be perfect. Misfires are also acceptable.

[-] Nibodhika@lemmy.world 13 points 7 months ago

You're still only explaining the Y problem, not the X one. Want to solve Y? Here you go https://people.csail.mit.edu/hubert/pyaudio/docs/ also prepare to learn a lot about streams and different audio formats, etc. You might have something usable in a few weeks or months depending on how fast you're able to learn those.

And just so we're clear, you mentioned chromium, so I'm 99.9% sure that there are easier solutions if you tell is the actual problem you're trying to solve. There's a reason no one is providing you with a simple script that does this, i.e. no one has ever needed this, and whenever you're in a situation where no one has ever needed something before you might be a visionary or you might be missing something that's obvious for everyone that came before and had the same problem you did.

[-] Communist@lemmy.ml 2 points 7 months ago* (last edited 7 months ago)

here you go, if you have a better idea, pitch it:

  1. I have a work program, this notifies me if I get a call or email, the work program then presents an accept/decline page, and does not proceed until I either accept, decline, or it times out.
  2. I want it to do two different things depending on if it's a call or email
  3. It provides no notification other than the sound and an "accept" button on the page
  4. I have a chrome window open that does nothing but this, and I never use chrome for anything else
  5. I want to automatically do various things when I receive either this call or email
  6. I want it to be broadly applicable rather than a script designed for the specific website giving me the notification (so not a chrome extension). This prevents me from having to update any code in the event that the backend changes dramatically, and even if the notification sound changes, i'd just record a new sound as the activation noise.
  7. The noise is always the same, and hasn't changed for many years, and there is a distinct noise between calls and emails
  8. They never overlap, they never play multiple times at the same time, and they never make any noises other than those two. The noises are distinct.

but so far my solution is to setup dejavu to listen to a sink i've named work and then set chrome to play on that sink, and that sink will be setup to forward to my default audio device

https://github.com/worldveil/dejavu

load more comments (1 replies)
load more comments (2 replies)
[-] onlinepersona@programming.dev 5 points 7 months ago

Are you on linux? If you're using pipewire (or pulseaudio), you can connect the chromium audio pipe to your audio analyzer, analyze the audio, and execute commands on a match. Here's an example of capturing audio with pipewire. It's in C, but there's also a Rust crate.

Maybe gstreamer could make it easier. Audio analysis will probably be some library that you have to search for.

What you're trying to do is not very straight forward, IMO.

CC BY-NC-SA 4.0

[-] driving_crooner@lemmy.eco.br 3 points 7 months ago

How many audio notifications do you receive? The only ones I get are from the phone.

[-] BCsven@lemmy.ca 48 points 7 months ago

This smells of "So I work from home, but want to sleep, but if my boss pings me on teams I want an alarm to wake me up"

[-] Communist@lemmy.ml 36 points 7 months ago

Is there anything wrong with that? Hahaha, it's pretty similar but not quite that

[-] Quazatron@lemmy.world 21 points 7 months ago

Lazy people tend to be creative people, which is good, especially when confronted with boring activities.

I'd solve it in hardware, maybe an ESP32 dongle with a mic pretending to be a keyboard.

Seriously though, sounds like you need a more creative or fulfilling job.

[-] Communist@lemmy.ml 7 points 7 months ago

Yeah the most fulfilling thing about this job has been figuring out how to automate as much of it as possible while still pretending to be a normal worker. It's pretty terrible, i'm going to switch to herpetology eventually, but can't do that right now for various reasons I don't want to get into on a public forum.

I'm at the top of every performance metric because of my inclination to be lazy as fuck with it though, so, it works.

[-] ReversalHatchery@beehaw.org 4 points 7 months ago

"So I work from home, but want to ~~sleep~~ play games, but if my boss pings me on teams I want an alarm to wake me up"

Depending on your employer it could be well okay

[-] marcie@lemmy.ml 3 points 7 months ago* (last edited 7 months ago)

youre just thinking about it wrong. get an llm going, voice to text, and have a synthesizer copy your voice. 99% of your workload is now gone, no more endless meetings, and you got notes that can be quickly summarized.

lets just hope that they dont ask you what 27 times 38 or something is. could maybe prompt it to say 'Lets circle back around on that in an email' whenever a complex question is asked, lmao

[-] Communist@lemmy.ml 2 points 7 months ago

I don't have any meetings ever. An LLM really wouldn't be able to do almost any of my work.

[-] OsaErisXero@kbin.run 8 points 7 months ago

Modern problems require modern solutions

[-] iiGxC@slrpnk.net 40 points 7 months ago

Be careful: this could be you https://xkcd.com/1172/

[-] mypasswordis1234@lemmy.world 13 points 7 months ago
[-] Communist@lemmy.ml 2 points 7 months ago* (last edited 7 months ago)

It's really not in this case, I can see why people think that since i've been vague, but tbh I thought somebody would have already made an easy sound recognition program and I just hadn't seen it, and that once someone pointed that to me the rest would be easy.

Here is the entirety of the problem:

  1. I have a work program, this notifies me if I get a call or email, the work program then presents an accept/decline page, and does not proceed until I either accept, decline, or it times out.
  2. I want it to do two different things depending on if it's a call or email
  3. It provides no notification other than the sound and an "accept" button on the page
  4. I have a chrome window open that does nothing but this, and I never use chrome for anything else
  5. I want to automatically do various things when I receive either this call or email
  6. I want it to be broadly applicable rather than a script designed for the specific website giving me the notification (so not a chrome extension). This prevents me from having to update any code in the event that the backend changes dramatically, and even if the notification sound changes, i'd just record a new sound as the activation noise.
  7. The noise is always the same, and hasn't changed for many years, and there is a distinct noise between calls and emails
  8. They never overlap, they never play multiple times at the same time, and they never make any noises other than those two. The noises are distinct.

These factors cause me to want to run a script once the noise is recognized, only if the noise is playing in a particular app. I'm using pipewire/hyprland on arch.

edit: actually they have, it should be really easy with this: https://github.com/worldveil/dejavu

[-] flashgnash@lemm.ee 3 points 7 months ago

This is absolutely an xy problem. Your problem is that you need to programmatically respond to notifications across multiple applications

You are asking for help with a solution based on notification sounds which is one possible solution but a bit of a weird one

load more comments (1 replies)
[-] DaGeek247@fedia.io 1 points 7 months ago
  1. It provides no notification other than the sound and an "accept" button on the page
  2. I have a chrome window open that does nothing but this, and I never use chrome for anything else

https://chromewebstore.google.com/detail/distill-web-monitor/inlikjemeeknofckkjolnjbpehgadgge?pli=1

[-] Communist@lemmy.ml 1 points 7 months ago* (last edited 7 months ago)

That's an interesting solution that i'd rather avoid because it's proprietary

Also, that wouldn't distinguish the two states of call/email, I don't think.

[-] DaGeek247@fedia.io 1 points 7 months ago

It was the first result i found for 'monitor webpage chrome'. There's a very good chance that what you're after is just two or three results lower. I promise it would be a lot easier than developing an entirely new solution that works based on speaker sounds. Bonus, these extensions have basic stuff like sms or email support right out of the box.

load more comments (1 replies)
[-] onlinepersona@programming.dev 9 points 7 months ago

I think it would possibly be easier to write an extension. You can inspire yourself from this extension, intercept media playback, possibly hash the media being played, compare the hash to a known DB you create, and call a script in response to a positive detection.

CC BY-NC-SA 4.0

[-] thevoidzero@lemmy.world 8 points 7 months ago

Someone already talked about the XY problem, so I'll say this.

Why sound notification instead of notification content? If your notification program (dunst in my case) have pattern matching or calling scripts based on patterns and the script has access to which app, notification title, contents etc. then it's just about calling something in your bash script.

And any time you wanna add that functionality to something else, add one more line with a different pattern or add a condition in your script. Comparing text is lot more reliable than audio.

Of course your use case could be completely different, so maybe give some examples of use case so people can give you different ways to solve that instead of just the one you're thinking of.

[-] Communist@lemmy.ml 3 points 7 months ago

It does not make a desktop notification at all, so that won't work

[-] tunetardis@lemmy.ca 8 points 7 months ago

I have some vague recollection of a hacker convention from the 90s where people were challenged to come up with wireless networking in a one night coding marathon. (This was long before wifi.) So some dude used speech synthesis to get a machine to say "one zero one one zero…" and another to assemble the binary data into packets using speech recognition. It was hilarious, and the dev had to keep telling people to shut up and stop laughing so he could complete the demo.

But anyways… what I'm trying to suggest here is you might have the best luck if your notification sounds contain spoken commands and you use speech recognition to trigger scripts? That tech is pretty mature at this point.

load more comments (1 replies)
[-] JovialSodium@lemmy.sdf.org 6 points 7 months ago* (last edited 7 months ago)

Maybe you can do something with the tampermonkey extension to catch when that audio is triggered and have it do an api call that your script catches?

I don't know if that'll actually work, I know of the extension but have never it used nor am I skilled with Javascript but it seems feasible.

[-] Communist@lemmy.ml 4 points 7 months ago

That sounds like a somewhat appealing solution, however, i'd like this to be more broadly applicable, i'd like it if even if it wasn't chrome, and was some other application making a particular noise, I could easily execute a script whenever that particular noise is played, allowing me to automate a bunch of things rather than just one specific weird thing.

[-] tsonfeir@lemm.ee 5 points 7 months ago
[-] Communist@lemmy.ml 7 points 7 months ago

it might as well be, I hallucinate the noise regularly, although if it actually was screaming that would be a lot scarier.

load more comments (2 replies)
[-] qjkxbmwvz@startrek.website 4 points 7 months ago

Can you isolate the call to the sound from the DevTools? And if so, does DevTools allow you to edit the function? Perhaps you could GET/POST something on localhost which could trigger a shell script.

[-] enix@reddthat.com 4 points 7 months ago* (last edited 7 months ago)

I think sox is what you want

I went ahead and asked a free AI how to use sox and played audio to trigger a script. Probably won't be 100% accurate but maybe send you down the right path. Good luck.

  1. Install 'sox' if you haven't already. You can use the package manager of your Linux distribution to install it.

  2. Open a terminal and use the 'rec' command from 'sox' to continuously listen to the audio input:

    sox -d -t .wav - silence 1 0.1 3% 1 1.0 3%
    

    This command will listen for audio and create a .wav file when it detects sound.

  3. Write a script that will be triggered when a sound is detected. For example, you can create a script called "myscript.sh" with the following content:

    #!/bin/bash
    echo "Sound detected! Running my script."
    # Add your desired actions here
    
  4. Make the script executable by running the following command in the terminal:

    chmod +x myscript.sh
    
  5. Use the 'rec' command along with the 'play' command from 'sox' to continuously listen for sound and execute your script when sound is detected:

    sox -d -t .wav - silence 1 0.1 3% 1 1.0 3% | while read -r; do ./myscript.sh; done
    

    This command will continuously listen for sound and execute your script each time sound is detected.

Remember to customize the script "myscript.sh" with your desired actions.

[-] tmjaea@lemmy.world 5 points 7 months ago

How would this not just trigger from any sound rather one specific?

[-] ace_garp@lemmy.world 4 points 7 months ago

Expect automates things, based on text-input captured from a terminal.

Not sure if it has been extended/hacked to take sound as an input.

[-] bloodfart@lemmy.ml 2 points 7 months ago

My assumption is that you don’t care if your notification gets spoofed, ex. Someone rings a little bell and the script deletes all cookies from porn websites as if the little bell notification played.

So I think the hardest and best way to do this is to have the script run on a separate device than the sound plays on.

First record the sound you want to trigger with. Use the script executing device with the microphone and interface you’ll be using in production set up in the location of production to make it easier on yourself.

Now reduce the bitrate of the target sound a lot. No, more than that, keep going, a little more, that’s perfect.

Now write something that will capture the last target_sound_length seconds of audio and compare it with the bitcrushed version. Depending on your device, there may be a buffer object in the adc you can interface with, although if it’s running a normal operating system you won’t be able to just get to it without going through the os first.

If you can go through the chrome notificationing machine, figure out the hook used to trigger the notification you want to respond to and intercept and perform the script. No nyquist needed!

[-] D_Air1@lemmy.ml 1 points 7 months ago

Sounds like a case where machine learning would actually be useful.

load more comments
view more: next ›
this post was submitted on 03 Apr 2024
82 points (100.0% liked)

Linux

48047 readers
687 users here now

From Wikipedia, the free encyclopedia

Linux is a family of open source Unix-like operating systems based on the Linux kernel, an operating system kernel first released on September 17, 1991 by Linus Torvalds. Linux is typically packaged in a Linux distribution (or distro for short).

Distributions include the Linux kernel and supporting system software and libraries, many of which are provided by the GNU Project. Many Linux distributions use the word "Linux" in their name, but the Free Software Foundation uses the name GNU/Linux to emphasize the importance of GNU software, causing some controversy.

Rules

Related Communities

Community icon by Alpár-Etele Méder, licensed under CC BY 3.0

founded 5 years ago
MODERATORS