Spaces:
Running
Running
import os | |
import sys | |
import pandas as pd | |
import altair as alt | |
import io | |
import streamlit as st | |
from fake_audio_detection.model import predict_audio_blocks | |
parent_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) | |
sys.path.append(parent_dir) | |
st.title("π DeepVoice Detection") | |
APP_DIR = os.path.dirname(os.path.abspath(__file__)) | |
# if you want to code your training part | |
DATASET_DIR = os.path.join(APP_DIR, "dataset/") | |
MODEL_PATH = os.path.join(APP_DIR, "model/noma-1") | |
REAL_DIR = os.path.join(APP_DIR, "audios/real") | |
FAKE_DIR = os.path.join(APP_DIR, "audios/fake") | |
# Then continue as before | |
real_audio = { | |
f"Real - {f}": os.path.join(REAL_DIR, f) | |
for f in os.listdir(REAL_DIR) | |
if f.endswith((".wav", ".mp3")) | |
} | |
fake_audio = { | |
f"Fake - {f}": os.path.join(FAKE_DIR, f) | |
for f in os.listdir(FAKE_DIR) | |
if f.endswith((".wav", ".mp3")) | |
} | |
all_audio = {**real_audio, **fake_audio} | |
selected_label = st.radio("Select an audio file to play:", list(all_audio.keys())) | |
selected_path = all_audio[selected_label] | |
st.write("#### Try with your audios") | |
uploaded_file = st.file_uploader("Choose an audio file", type=["wav", "mp3", "ogg"]) | |
selected_label = "Default Audio" | |
if uploaded_file is not None: | |
st.markdown(f"**Now Playing:** `{uploaded_file.name}`") | |
audio_bytes = uploaded_file.read() | |
file_extension = uploaded_file.name.split(".")[-1].lower() | |
st.audio(audio_bytes, format=f"audio/{file_extension}") | |
else: | |
st.markdown(f"**Now Playing:** `{selected_label}`") | |
with open(selected_path, "rb") as audio_file: | |
audio_bytes = audio_file.read() | |
st.audio(audio_bytes, format="audio/wav") | |
if st.button("Run Prediction") and os.path.exists(MODEL_PATH): | |
audio_bytes = None | |
if uploaded_file: | |
bytes_data = uploaded_file.getvalue() | |
audio_bytes = io.BytesIO(bytes_data) | |
with st.spinner("Analyzing audio..."): | |
times, probas = predict_audio_blocks(MODEL_PATH, selected_path, audio_bytes) | |
preds = probas.argmax(axis=1) | |
confidences = probas.max(axis=1) | |
preds_as_string = ["Fake" if i == 0 else "Real" for i in preds] | |
df = pd.DataFrame( | |
{"Seconds": times, "Prediction": preds_as_string, "Confidence": confidences} | |
) | |
def get_color(row): | |
if row["Confidence"] < 0.3: | |
return "Uncertain" | |
return row["Prediction"] | |
df["Confidence Level"] = df.apply(get_color, axis=1) | |
# Plot | |
st.markdown("### Prediction by 1s Blocks") | |
st.markdown( | |
"Hover above each bar to see the confidence level of each prediction." | |
) | |
chart = ( | |
alt.Chart(df) | |
.mark_bar() | |
.encode( | |
x=alt.X("Seconds:O", title="Seconds"), | |
y=alt.value(30), | |
color=alt.Color( | |
"Confidence Level:N", | |
scale=alt.Scale( | |
domain=["Fake", "Real", "Uncertain"], | |
range=["steelblue", "green", "gray"], | |
), | |
), | |
tooltip=["Seconds", "Prediction", "Confidence"], | |
) | |
.properties(width=700, height=150) | |
) | |
text = ( | |
alt.Chart(df) | |
.mark_text( | |
align="right", | |
baseline="top", | |
dy=10, | |
color="white", | |
xOffset=10, | |
yOffset=-20, | |
fontSize=14, | |
) | |
.encode(x=alt.X("Seconds:O"), y=alt.value(15), text="Prediction:N") | |
) | |
st.altair_chart(chart + text, use_container_width=True) | |
st.markdown("### Overall prediction") | |
if all(element == "Real" for element in preds_as_string): | |
st.markdown("The audio is **Real**") | |
elif all(element == "Fake" for element in preds_as_string): | |
st.markdown("The audio is **Fake**") | |
else: | |
st.markdown("Some parts of the audio have been detected as **Fake**") | |
elif not os.path.exists(MODEL_PATH): | |
st.warning(f"Missing model: {MODEL_PATH}") | |