File size: 2,709 Bytes
b5ff3a4
 
f89e539
b5ff3a4
e85bb51
 
a671301
b5ff3a4
65c9ca0
f89e539
 
b5ff3a4
e85bb51
 
b5ff3a4
e85bb51
f89e539
e85bb51
416c906
4cf6559
 
 
a31425b
 
4cf6559
e85bb51
 
a31425b
 
 
 
 
e85bb51
a31425b
e85bb51
 
 
 
 
a671301
895e3ae
e85bb51
 
895e3ae
e85bb51
a671301
e85bb51
d5e4e4a
e85bb51
 
895e3ae
e85bb51
a31425b
a671301
5fde344
a31425b
 
e85bb51
 
 
 
 
a47efdc
895e3ae
a671301
 
 
 
 
 
 
 
 
 
895e3ae
a671301
 
 
895e3ae
 
a0a9509
d5e4e4a
a671301
895e3ae
 
 
 
 
 
 
9302019
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
80
81
82
83
84
85
86
87
88
89
90
91
92
import os
import duckdb
import streamlit as st
from huggingface_hub import hf_hub_download
import pandas as pd
import tempfile
import re

HF_REPO_ID = "stcoats/temp-duckdb-upload"
HF_FILENAME = "ycsep.duckdb"
LOCAL_PATH = "./ycsep.duckdb"

st.set_page_config(layout="wide")
st.title("YCSEP Audio Dataset Viewer")

# Download database if missing
if not os.path.exists(LOCAL_PATH):
    st.write("Downloading from HF Hub...")
    hf_hub_download(
        repo_id=HF_REPO_ID,
        repo_type="dataset",
        filename=HF_FILENAME,
        local_dir=".",
        local_dir_use_symlinks=False
    )
    st.success("Download complete.")

# Connect (only once)
@st.cache_resource(show_spinner=False)
def get_duckdb_connection():
    return duckdb.connect(LOCAL_PATH, read_only=True)

try:
    con = get_duckdb_connection()
    st.success("Connected to DuckDB.")
except Exception as e:
    st.error(f"DuckDB connection failed: {e}")
    st.stop()

# Search
query = st.text_input("Search text (case-insensitive)", "").strip()

if query:
    query_like = f"%{query.lower()}%"
    sql = """
        SELECT id, channel, video_id, speaker, start_time, end_time, upload_date, text, pos_tags, audio
        FROM data
        WHERE LOWER(text) LIKE ?
        LIMIT 100
    """
    df = con.execute(sql, [query_like]).df()
else:
    df = con.execute("""
        SELECT id, channel, video_id, speaker, start_time, end_time, upload_date, text, pos_tags, audio
        FROM data
        LIMIT 100
    """).df()

st.markdown(f"### Showing {len(df)} results")

if len(df) == 0:
    st.warning("No matches found.")
else:
    def render_audio(audio_bytes):
        try:
            if isinstance(audio_bytes, (bytes, bytearray, memoryview)):
                data = bytes(audio_bytes)
            elif isinstance(audio_bytes, list):
                data = bytes(audio_bytes)
            else:
                return ""
            with tempfile.NamedTemporaryFile(delete=False, suffix=".mp3") as tmp:
                tmp.write(data)
                tmp.flush()
                return f'<audio controls style="height:20px; width:100px;"> <source src="file://{tmp.name}" type="audio/mpeg"></audio>'
        except Exception:
            return ""

    df["Audio"] = df["audio"].apply(render_audio)
    df_display = df.drop(columns=["audio"]).copy()

    st.markdown("### Results Table (Sortable with Audio Column)")
    st.markdown("(Scroll right to view audio controls)")

    st.dataframe(df_display.drop(columns=["Audio"]))

    st.markdown("### Audio Previews")
    for i, row in df_display.iterrows():
        st.markdown(f"**{row['speaker']} | {row['text']}**")
        st.markdown(df.loc[i, "Audio"], unsafe_allow_html=True)