Initial commit
This commit is contained in:
commit
efc8dc8c2f
1 changed files with 94 additions and 0 deletions
94
soundswitch.py
Executable file
94
soundswitch.py
Executable file
|
@ -0,0 +1,94 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
"""
|
||||
Just a PoC to be able to listen to different audio input devices
|
||||
and press keyboard buttons depending on which one is louder.
|
||||
"""
|
||||
|
||||
import time as t
|
||||
import numpy as np
|
||||
import sounddevice as sd
|
||||
import threading
|
||||
import sys
|
||||
import pyautogui
|
||||
|
||||
# Settings
|
||||
|
||||
# Which hot keys should it press?
|
||||
# First: default if nobody is speaking or both are speaking
|
||||
# Second: first device is louder
|
||||
# Third: second device is louder
|
||||
scene_keys = ['1', '2', '3']
|
||||
|
||||
# At which loudness should we switch to a microphone?
|
||||
# Choose something between 1 and 50
|
||||
min_v=10
|
||||
|
||||
# What difference between laudness needs to be to choose
|
||||
# the specific microphone?
|
||||
# Choose something between 1 and 50
|
||||
dif_v=10
|
||||
|
||||
# How long to stay on microphone after it's quiet?
|
||||
# In seconds
|
||||
timeout_speaking=3
|
||||
|
||||
#
|
||||
# Global variables, don't change
|
||||
#
|
||||
mic1_v=0
|
||||
mic1_t=t.time()
|
||||
mic2_v=0
|
||||
mic2_t=t.time()
|
||||
last_key=scene_keys[1]
|
||||
|
||||
def show_scene():
|
||||
global last_key
|
||||
key=last_key
|
||||
now = t.time()
|
||||
if (mic1_v - mic2_v) > dif_v and mic1_v > min_v:
|
||||
key=scene_keys[1]
|
||||
elif (mic2_v - mic1_v) > dif_v and mic2_v > min_v:
|
||||
key=scene_keys[2]
|
||||
else:
|
||||
now = t.time()
|
||||
if ( (now - mic1_t) > timeout_speaking and (now - mic2_t) > timeout_speaking ):
|
||||
key=scene_keys[0]
|
||||
if last_key != key:
|
||||
last_key = key
|
||||
pyautogui.press(key)
|
||||
# print("mic1:", mic1_v, int(now - mic1_t), "mic2:",mic2_v, int(now - mic2_t), key)
|
||||
threading.Timer(1, show_scene).start()
|
||||
|
||||
def audio_callback_mic1(indata, frames, time, status):
|
||||
global mic1_v
|
||||
global mic1_t
|
||||
mic1_v=int(np.linalg.norm(indata) * 10)
|
||||
if mic1_v > min_v:
|
||||
mic1_t = t.time()
|
||||
|
||||
def audio_callback_mic2(indata, frames, time, status):
|
||||
global mic2_v
|
||||
global mic2_t
|
||||
mic2_v=int(np.linalg.norm(indata) * 10)
|
||||
if mic2_v > min_v:
|
||||
mic2_t = t.time()
|
||||
|
||||
def start(callback, device=None):
|
||||
stream = sd.InputStream(callback=callback, device=device)
|
||||
stream.start()
|
||||
|
||||
if __name__ == "__main__":
|
||||
print(sd.query_devices())
|
||||
print("Choose microphone 1:", end=" ", flush=True)
|
||||
mic1 = int(sys.stdin.readline())
|
||||
print("Choose microphone 2:", end=" ", flush=True)
|
||||
try:
|
||||
mic2 = int(sys.stdin.readline())
|
||||
except ValueError:
|
||||
mic2 = None
|
||||
t1 = threading.Thread(target=start, args=(audio_callback_mic1, mic1,))
|
||||
t2 = threading.Thread(target=start, args=(audio_callback_mic2, mic2,))
|
||||
t1.start()
|
||||
t2.start()
|
||||
show_scene()
|
Loading…
Add table
Add a link
Reference in a new issue