| import streamlit as st |
| import librosa |
| import soundfile as sf |
| import numpy as np |
| from io import BytesIO |
| import tempfile |
|
|
| def process_audio(audio_file, pitch_factor=8): |
| |
| y, sr = librosa.load(audio_file) |
| |
| |
| y_shifted = librosa.effects.pitch_shift(y, sr=sr, n_steps=pitch_factor) |
| |
| |
| |
| y_smooth = librosa.effects.preemphasis(y_shifted) |
| |
| |
| y_normalized = librosa.util.normalize(y_smooth) |
| |
| return y_normalized, sr |
|
|
| def save_audio(audio_data, sr): |
| |
| buffer = BytesIO() |
| sf.write(buffer, audio_data, sr, format='WAV') |
| return buffer |
|
|
| st.title("Voice Changer - Female Voice Conversion") |
|
|
| |
| uploaded_file = st.file_uploader("Upload an audio file", type=['wav', 'mp3']) |
|
|
| if uploaded_file is not None: |
| |
| with tempfile.NamedTemporaryFile(delete=False, suffix='.wav') as tmp_file: |
| tmp_file.write(uploaded_file.getvalue()) |
| tmp_path = tmp_file.name |
|
|
| |
| pitch_factor = st.slider("Pitch Adjustment", 0.0, 12.0, 8.0, 0.5) |
| |
| if st.button("Convert to Female Voice"): |
| |
| try: |
| processed_audio, sr = process_audio(tmp_path, pitch_factor) |
| |
| |
| audio_buffer = save_audio(processed_audio, sr) |
| |
| |
| st.audio(audio_buffer, format='audio/wav') |
| |
| |
| st.download_button( |
| label="Download Converted Audio", |
| data=audio_buffer, |
| file_name="female_voice.wav", |
| mime="audio/wav" |
| ) |
| |
| except Exception as e: |
| st.error(f"Error processing audio: {str(e)}") |
|
|
| |
| st.markdown(""" |
| ### Instructions: |
| 1. Upload a WAV or MP3 audio file |
| 2. Adjust the pitch slider (higher values = more feminine voice) |
| 3. Click 'Convert to Female Voice' |
| 4. Play the converted audio |
| 5. Download the result if satisfied |
| |
| ### Notes: |
| - Best results with clear audio input |
| - Recommended pitch adjustment: 6-8 for natural-sounding results |
| - Larger files may take longer to process |
| """) |