HapticStudio / app.py
Rahatara's picture
Update app.py
7f89414 verified
import gradio as gr
import numpy as np
from scipy.io.wavfile import read, write
import tempfile
def dynamic_vibration_simulation(file):
try:
# Read the uploaded WAV file
sample_rate, data = read(file)
# Debug: Print sample rate and shape
print(f"Sample Rate: {sample_rate}, Data Shape: {data.shape}")
# Convert to mono if stereo
if len(data.shape) > 1:
data = data.mean(axis=1)
# Normalize the data to range [-1, 1]
data = data / np.max(np.abs(data))
# Parameters for vibration simulation
segment_duration = 0.1 # Analyze 0.1-second segments
segment_length = int(sample_rate * segment_duration)
# Initialize the low-frequency waveform
low_freq_wave = []
for i in range(0, len(data), segment_length):
segment = data[i:i + segment_length]
if len(segment) < segment_length:
break # Skip incomplete segment at the end
# Calculate amplitude (RMS value) of the segment
rms_amplitude = np.sqrt(np.mean(segment**2))
print(f"RMS Amplitude for segment {i // segment_length}: {rms_amplitude}")
# Map amplitude to vibration parameters
if rms_amplitude > 0.5:
freq = 50 # Strong vibration frequency (50 Hz)
duration = segment_duration
elif rms_amplitude > 0.2:
freq = 30 # Medium vibration frequency (30 Hz)
duration = segment_duration
else:
freq = 0 # Silence (no vibration)
duration = segment_duration
# Generate waveform for this segment
t = np.linspace(0, duration, int(sample_rate * duration), endpoint=False)
if freq > 0:
wave = 0.5 * np.sin(2 * np.pi * freq * t)
else:
wave = np.zeros_like(t) # Silence
# Append the generated wave
low_freq_wave.extend(wave)
# Convert the waveform to 16-bit PCM
low_freq_wave = (np.array(low_freq_wave) * 32767).astype(np.int16)
# Save the generated waveform to a temporary file
temp_file = tempfile.NamedTemporaryFile(delete=False, suffix=".wav")
write(temp_file.name, sample_rate, low_freq_wave)
print("Output WAV file generated successfully.")
return temp_file.name
except Exception as e:
print(f"Error: {e}")
return "Error in processing the uploaded WAV file."
# Gradio Interface
interface = gr.Interface(
fn=dynamic_vibration_simulation,
inputs=gr.Audio(label="Upload a WAV file", type="filepath"),
outputs=gr.Audio(label="Dynamic Vibration Audio"),
title="Dynamic Vibration Simulation",
description="Upload a WAV file. The vibration simulation dynamically adapts based on the sound's amplitude and variation."
)
interface.launch()