File size: 2,421 Bytes
aaed37a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
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):
    # Load the audio file
    y, sr = librosa.load(audio_file)
    
    # Pitch shift using librosa (female voice typically higher pitch)
    y_shifted = librosa.effects.pitch_shift(y, sr=sr, n_steps=pitch_factor)
    
    # Apply some feminine characteristics
    # Smooth the audio slightly
    y_smooth = librosa.effects.preemphasis(y_shifted)
    
    # Normalize audio
    y_normalized = librosa.util.normalize(y_smooth)
    
    return y_normalized, sr

def save_audio(audio_data, sr):
    # Save processed audio to BytesIO object
    buffer = BytesIO()
    sf.write(buffer, audio_data, sr, format='WAV')
    return buffer

st.title("Voice Changer - Female Voice Conversion")

# File uploader
uploaded_file = st.file_uploader("Upload an audio file", type=['wav', 'mp3'])

if uploaded_file is not None:
    # Save uploaded file temporarily
    with tempfile.NamedTemporaryFile(delete=False, suffix='.wav') as tmp_file:
        tmp_file.write(uploaded_file.getvalue())
        tmp_path = tmp_file.name

    # Pitch adjustment slider
    pitch_factor = st.slider("Pitch Adjustment", 0.0, 12.0, 8.0, 0.5)
    
    if st.button("Convert to Female Voice"):
        # Process the audio
        try:
            processed_audio, sr = process_audio(tmp_path, pitch_factor)
            
            # Save processed audio
            audio_buffer = save_audio(processed_audio, sr)
            
            # Create download button
            st.audio(audio_buffer, format='audio/wav')
            
            # Add download button
            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)}")

# Add instructions
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
""")