import gradio as gr import numpy as np import sounddevice as sd def generate_tone(freq, duration=1.0, sample_rate=44100, volume=0.1): t = np.linspace(0, duration, int(sample_rate * duration), False) return (volume * np.sin(2 * np.pi * freq * t)).astype(np.float32) def play_tone(freq, volume): tone = generate_tone(freq, volume=volume) sd.play(tone, samplerate=44100, blocking=True) return f"Played tone at {freq} Hz" def calculate_sequence_frequencies(tinnitus_freq): return [ int(tinnitus_freq * 0.77), int(tinnitus_freq * 0.9), int(tinnitus_freq * 1.1), int(tinnitus_freq * 1.4) ] def play_sequence(tinnitus_freq, volume): frequencies = calculate_sequence_frequencies(tinnitus_freq) sequence = [] for freq in frequencies: tone = generate_tone(freq, duration=0.5, volume=volume) sequence.extend(tone) sequence.extend(np.zeros(int(44100 * 0.1))) # 0.1s pause between tones sd.play(np.array(sequence), samplerate=44100, blocking=True) return f"Played sequence: {frequencies} Hz" def update_frequencies(tinnitus_freq): frequencies = calculate_sequence_frequencies(tinnitus_freq) return f"frequencies used in sequence: {', '.join(map(str, frequencies))}" with gr.Blocks(title="ACRN Tinnitus Protocol") as demo: gr.Markdown( """ # ACRN Tinnitus Protocol This is my attempt at implementing the Acoustic Coordinated Reset Neuromodulation tinnitus treatment protocol using [this paper](https://link-to-paper) as a guide. - First lower the volume on your device, so it is not too loud to start. - Start the tone by pressing the "Play Tone" button. - Adjust the frequency slider until it matches your tinnitus tone. You can also type in the frequency if you know it already. - Adjust the volume until it is a little bit louder than your tinnitus tone. - Switch from "Tone" to "Sequence" mode Inspired by [this thread on tinnitustalk.com](https://link-to-thread) and [this reddit thread](https://link-to-reddit-thread). """ ) with gr.Row(): tone_btn = gr.Button("Tone") sequence_btn = gr.Button("Sequence") with gr.Row(): freq_slider = gr.Slider(minimum=100, maximum=20000, value=12694, step=1, label="Frequency") freq_number = gr.Number(value=12694, label="Frequency") volume_slider = gr.Slider(minimum=0.01, maximum=1.0, value=0.1, step=0.01, label="Volume") output = gr.Textbox(label="Output") freq_output = gr.Markdown() def update_freq(value, slider): return gr.Number.update(value=value) if slider else gr.Slider.update(value=value) freq_slider.change(update_freq, inputs=[freq_slider, gr.State(True)], outputs=freq_number) freq_number.change(update_freq, inputs=[freq_number, gr.State(False)], outputs=freq_slider) freq_slider.change(update_frequencies, inputs=[freq_slider], outputs=[freq_output]) freq_number.change(update_frequencies, inputs=[freq_number], outputs=[freq_output]) tone_btn.click(play_tone, inputs=[freq_slider, volume_slider], outputs=[output]) sequence_btn.click(play_sequence, inputs=[freq_slider, volume_slider], outputs=[output]) demo.launch()