import streamlit as st import soundfile as sf import numpy as np from feat import * from tensorflow.keras.models import load_model from sklearn.preprocessing import LabelEncoder import pandas as pd import librosa import numpy as np from pyAudioAnalysis import audioSegmentation as aS import speech_recognition as sr import wave # Label encoder labelencoder = LabelEncoder() # Load the saved model model_path = 'cnn_lstm.keras' model = load_model(model_path) # Label mapping label_mapping = {0: 'angry', 1: 'excited', 2: 'fear', 3: 'happy', 4: 'neutral', 5: 'sad'} # Set the title of the Streamlit app st.title("Speech Emotion Recognition") # File uploader for audio files audio_file = st.file_uploader("Upload an audio file:", type=["mp3", "wav"]) # Set the interval for segments interval = st.number_input("Set the interval (0.00-15.00 seconds) for emotion detection segments:", min_value=0.00, max_value=15.00, value=3.00, step=0.01) # Button to upload if st.button("Upload"): if audio_file: audio_data, samplerate = sf.read(audio_file) # Convert the audio file to WAV format and save it output_file_path = 'uploaded_audio.wav' sf.write(output_file_path, audio_data, samplerate) st.audio(audio_file) else: st.error("Please upload an audio file.") # Function to process audio and predict emotions def predict_emotions(audio_path, interval): audio_data, samplerate = sf.read(audio_path) duration = len(audio_data) / samplerate emotions = [] for start in np.arange(0, duration, interval): end = start + interval if end > duration: end = duration segment = audio_data[int(start*samplerate):int(end*samplerate)] segment_path = 'segment.wav' sf.write(segment_path, segment, samplerate) feat = features_extractor(segment_path) feat = feat.reshape(1, -1) predictions = model.predict(feat) predicted_label = np.argmax(predictions, axis=1) emotions.append((start, end, label_mapping[predicted_label[0]])) return emotions # Button to predict if st.button("Predict"): if audio_file: print() emotions = predict_emotions('uploaded_audio.wav', interval=interval) # Create a DataFrame to display emotions emotions_df = pd.DataFrame( emotions, columns=["Start", "End", "Emotion"]) st.write(emotions_df) # Save emotions to a log file log_file_path = 'emotion_log.csv' emotions_df.to_csv(log_file_path, index=False) # Extrapolate major emotions major_emotion = emotions_df['Emotion'].mode().values[0] st.write(f"Major emotion: {major_emotion}") st.success(f"Emotion log saved to {log_file_path}") # Add download button for the emotion log file with open(log_file_path, "rb") as file: btn = st.download_button( label="Download Emotion Log", data=file, file_name='emotion_log.csv', mime='text/csv' ) x = word_count1('uploaded_audio.wav') y = get_speaking_rate('uploaded_audio.wav') st.write(f'Number of words = {x[0]}') st.write(f'Transcript = {x[1]}') st.write(f'Speaking rate = {y} syllables per second') else: st.error("Please upload an audio file.") # Additional message at the bottom of the page st.write("Thank you for using the app!") file_path = 'path/to/your/audio/file' try: audio, sr = librosa.load(audio_file, sr=None) except Exception as e: print(f"An error occurred: {e}")