Spaces:
Runtime error
Runtime error
import streamlit as st | |
import numpy as np | |
import pandas as pd | |
import librosa | |
from io import BytesIO | |
import matplotlib.pyplot as plt | |
from src.features.extraction.low_level_features_extractor import LowLevelFeatureExtractor | |
from src.features.extraction.high_level_features_extractor import HighLevelFeatureExtractor | |
from src.models.predict import predict | |
# Set page layout | |
st.set_page_config(page_title="Audio Deepfake Detection", layout="wide") | |
# Add a custom style for background and font | |
st.markdown(""" | |
<style> | |
.main { | |
background-color: #f7f9fc; | |
} | |
.title { | |
font-family: 'Courier New', Courier, monospace; | |
color: #493628; | |
} | |
.section-header { | |
font-size: 24px; | |
font-weight: bold; | |
margin-top: 10px; /* Reduced margin to minimize vertical gap */ | |
} | |
.confidence-score { | |
font-size: 20px; | |
font-weight: bold; | |
color: #ff6f61; | |
} | |
</style> | |
""", unsafe_allow_html=True) | |
# App title | |
st.markdown('<h1 class="title">Audio Deepfake Detection</h1>', unsafe_allow_html=True) | |
st.write("This application helps you detect whether an audio file is a deepfake or genuine.") | |
# File uploader | |
uploaded_file = st.file_uploader("Choose an audio file", type=["wav", "mp3", "ogg"]) | |
# Extract features from audio | |
def extract_features(audio_data, sample_rate): | |
df = pd.DataFrame({ | |
'audio_id': [0], | |
'audio_arr': [audio_data], | |
'srate': [sample_rate], | |
'real_or_fake': [0] | |
}) | |
audio_processor = LowLevelFeatureExtractor(target_sr=16000, include_only=['spectral', 'prosodic', 'voice_quality']) | |
feature_computer = HighLevelFeatureExtractor() | |
low_level_gen = audio_processor.low_level_feature_generator(df) | |
high_level_features = list(feature_computer.high_level_feature_generator(low_level_gen)) | |
features_df = pd.DataFrame(high_level_features) | |
return features_df | |
# Plot waveform | |
def plot_waveform(audio_data, sample_rate): | |
fig, ax = plt.subplots(figsize=(10, 2)) # Wide and short waveform plot | |
ax.plot(np.linspace(0, len(audio_data) / sample_rate, len(audio_data)), audio_data) | |
ax.set_xlabel("Time (s)") | |
ax.set_ylabel("Amplitude") | |
st.pyplot(fig) | |
# Process the uploaded file | |
if uploaded_file is not None: | |
# Use columns to display the audio player, waveform, prediction, and confidence side by side | |
col1, col2 = st.columns(2) | |
with col1: | |
st.subheader("Uploaded Audio") | |
st.audio(uploaded_file) | |
# Show waveform | |
st.subheader("Audio Waveform") | |
audio_bytes = uploaded_file.read() | |
audio_data, sample_rate = librosa.load(BytesIO(audio_bytes), sr=None) | |
plot_waveform(audio_data, sample_rate) | |
with col2: | |
# Extract features | |
features_df = extract_features(audio_data, sample_rate) | |
predictions, prediction_probabilities = predict(features_df) | |
# Display prediction and confidence score | |
st.subheader("Prediction Results") | |
prediction = predictions[0] | |
confidence_score = prediction_probabilities[0][1] * 100 | |
if prediction == 1: | |
st.error("This audio is classified as a Deepfake!") | |
else: | |
st.success("This audio is classified as Genuine!") | |
# Show confidence score using a progress bar | |
st.markdown('<h3 class="confidence-score">Confidence Score</h3>', unsafe_allow_html=True) | |
st.progress(confidence_score / 100) | |
st.write(f"The model is {confidence_score:.2f}% confident in its prediction.") | |
# Footer or additional information | |
st.markdown('<h2 class="section-header">How It Works</h2>', unsafe_allow_html=True) | |
st.write(""" | |
This app uses machine learning models trained on various audio features, such as spectral, prosodic, and voice quality metrics. | |
It analyzes the audio to classify whether it is a genuine recording or a deepfake, providing a confidence score for its prediction. | |
""") | |