iamtatsuki05's picture
Synced repo using 'sync_with_huggingface' Github Action
0338d23 verified
import base64
from io import BytesIO
import scipy.io.wavfile as wav
import streamlit as st
from brainwave.config.app import (
BASE_FREQUENCY_DEFAULT,
BASE_FREQUENCY_RANGE_MAX,
BASE_FREQUENCY_RANGE_MIN,
BASE_FREQUENCY_STEP,
BEAT_FREQUENCY_RANGE_MAX,
BEAT_FREQUENCY_RANGE_MIN,
BRAIN_WAVES,
DURATION_DEFAULT,
DURATION_RANGE_MAX,
DURATION_RANGE_MIN,
)
from brainwave.utils.binaural_beats import generate_binaural_beats
def app():
st.title('Binaural Beats Generator')
st.subheader('Brain Wave Selection')
selected_wave: str = st.selectbox(
'Select a type of brain wave:', list(BRAIN_WAVES.keys())
)
default_beat: int = BRAIN_WAVES[selected_wave]
st.subheader('Base Frequency (Hz)')
base_frequency: int = st.slider(
'Base Frequency (Hz):',
min_value=BASE_FREQUENCY_RANGE_MIN,
max_value=BASE_FREQUENCY_RANGE_MAX,
value=BASE_FREQUENCY_DEFAULT,
step=BASE_FREQUENCY_STEP,
)
base_frequency_input: int = st.number_input(
'...or enter the base frequency using the keyboard:',
min_value=BASE_FREQUENCY_RANGE_MIN,
max_value=BASE_FREQUENCY_RANGE_MAX,
value=base_frequency,
step=BASE_FREQUENCY_STEP,
)
st.subheader('Beat Frequency (Hz)')
beat_frequency: int = st.slider(
'Select the beat frequency using the slider:',
min_value=BEAT_FREQUENCY_RANGE_MIN,
max_value=BEAT_FREQUENCY_RANGE_MAX,
value=default_beat,
)
beat_frequency_input: int = st.number_input(
'...or enter the beat frequency using the keyboard:',
min_value=BEAT_FREQUENCY_RANGE_MIN,
max_value=BEAT_FREQUENCY_RANGE_MAX,
value=beat_frequency,
)
st.subheader('Duration (seconds)')
duration: int = st.slider(
'Duration (seconds):',
min_value=DURATION_RANGE_MIN,
max_value=DURATION_RANGE_MAX,
value=DURATION_DEFAULT,
)
duration_input: int = st.number_input(
'...or enter the duration using the keyboard:',
min_value=DURATION_RANGE_MIN,
max_value=DURATION_RANGE_MAX,
value=duration,
)
base_frequency = base_frequency_input
beat_frequency = beat_frequency_input
duration = duration_input
if st.button('Generate Sound'):
audio_data, sample_rate = generate_binaural_beats(
base_frequency, beat_frequency, duration
)
wav_file: BytesIO = BytesIO()
wav.write(wav_file, sample_rate, audio_data)
wav_file.seek(0)
b64: str = base64.b64encode(wav_file.read()).decode()
audio_html: str = (
f'<audio controls loop><source src="data:audio/wav;base64,{b64}" '
f'type="audio/wav"></audio>'
)
st.markdown(audio_html, unsafe_allow_html=True)
href: str = (
f'<a href="data:file/wav;base64,{b64}" download="'
f'binaural_beats_{selected_wave}.wav">Download '
f'{selected_wave} Binaural Beat</a>'
)
st.markdown(href, unsafe_allow_html=True)
if __name__ == '__main__':
app()