-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Provide a supported callback or method for setting/ensuring microphone volume/gain #624
Comments
talon.microphone was removed entirely in Talon 0.4, so the above code no longer works. The recommendation was to switch to polling instead; see below (change the interval to whatever works for you, and of course change the path to nircmdc.exe). import subprocess
from talon import Context, actions, app, cron
ctx = Context()
ctx.matches = """
os: windows
"""
# Fluency Direct often adjusts the microphone volume (gain); Talon doesn't like that.
def fix_volume():
subprocess.run(
[r"C:\Users\nriley\Apps\nircmdc.exe", "setsysvolume", "65535", "default_record"]
)
@ctx.action_class("speech")
class SpeechActions:
def enable():
actions.next()
fix_volume()
def fix_volume_if_mic_changes():
previous_microphone = actions.sound.active_microphone()
def fix_volume_if_mic_changed():
nonlocal previous_microphone
if (microphone := actions.sound.active_microphone()) != previous_microphone:
if microphone != 'None':
fix_volume()
previous_microphone = microphone
fix_volume()
cron.interval("2s", fix_volume_if_mic_changed)
if app.platform == "windows":
app.register("ready", fix_volume_if_mic_changes) |
I've used the from talon import cron
try:
from comtypes import CLSCTX_ALL
from pycaw.pycaw import AudioUtilities, IAudioEndpointVolume
ENABLED = True
except ImportError:
ENABLED = False
def main():
devices = AudioUtilities.GetMicrophone()
interface = devices.Activate(IAudioEndpointVolume._iid_, CLSCTX_ALL, None)
volume = interface.QueryInterface(IAudioEndpointVolume)
current_level = volume.GetMasterVolumeLevel()
_, hi, _ = volume.GetVolumeRange()
if current_level < hi:
print("Setting mic volume to max: was %s, now %s" % (current_level, hi))
volume.SetMasterVolumeLevel(hi, None)
print("Done setting mic volume to max: was %s, now %s" % (current_level, hi))
if ENABLED:
cron.interval("1m", main) |
Can I use this issue as a standin for a |
On Windows particularly, there seem to be lots of apps/system services that try to "intelligently" reset the microphone volume despite my best efforts to disable such features. This causes Talon recognition quality to substantially drop and sometimes I don't notice.
Here's what I've written to work around it.
This seems to catch all the common places where I see microphone volume change - when switching speech on/off, when launching Talon and when turning my microphone on. The mic_change callback is deprecated so one option would be to provide a supported version, but if Talon could also give me an option to say "I never want the volume on this microphone to change from X" that'd be fine too.
Thanks!
The text was updated successfully, but these errors were encountered: