clementBE commited on
Commit
bbaea7c
·
verified ·
0 Parent(s):

initial commit

Browse files
Files changed (4) hide show
  1. .gitattributes +35 -0
  2. README.md +12 -0
  3. app.py +57 -0
  4. requirements.txt +7 -0
.gitattributes ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ *.7z filter=lfs diff=lfs merge=lfs -text
2
+ *.arrow filter=lfs diff=lfs merge=lfs -text
3
+ *.bin filter=lfs diff=lfs merge=lfs -text
4
+ *.bz2 filter=lfs diff=lfs merge=lfs -text
5
+ *.ckpt filter=lfs diff=lfs merge=lfs -text
6
+ *.ftz filter=lfs diff=lfs merge=lfs -text
7
+ *.gz filter=lfs diff=lfs merge=lfs -text
8
+ *.h5 filter=lfs diff=lfs merge=lfs -text
9
+ *.joblib filter=lfs diff=lfs merge=lfs -text
10
+ *.lfs.* filter=lfs diff=lfs merge=lfs -text
11
+ *.mlmodel filter=lfs diff=lfs merge=lfs -text
12
+ *.model filter=lfs diff=lfs merge=lfs -text
13
+ *.msgpack filter=lfs diff=lfs merge=lfs -text
14
+ *.npy filter=lfs diff=lfs merge=lfs -text
15
+ *.npz filter=lfs diff=lfs merge=lfs -text
16
+ *.onnx filter=lfs diff=lfs merge=lfs -text
17
+ *.ot filter=lfs diff=lfs merge=lfs -text
18
+ *.parquet filter=lfs diff=lfs merge=lfs -text
19
+ *.pb filter=lfs diff=lfs merge=lfs -text
20
+ *.pickle filter=lfs diff=lfs merge=lfs -text
21
+ *.pkl filter=lfs diff=lfs merge=lfs -text
22
+ *.pt filter=lfs diff=lfs merge=lfs -text
23
+ *.pth filter=lfs diff=lfs merge=lfs -text
24
+ *.rar filter=lfs diff=lfs merge=lfs -text
25
+ *.safetensors filter=lfs diff=lfs merge=lfs -text
26
+ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
27
+ *.tar.* filter=lfs diff=lfs merge=lfs -text
28
+ *.tar filter=lfs diff=lfs merge=lfs -text
29
+ *.tflite filter=lfs diff=lfs merge=lfs -text
30
+ *.tgz filter=lfs diff=lfs merge=lfs -text
31
+ *.wasm filter=lfs diff=lfs merge=lfs -text
32
+ *.xz filter=lfs diff=lfs merge=lfs -text
33
+ *.zip filter=lfs diff=lfs merge=lfs -text
34
+ *.zst filter=lfs diff=lfs merge=lfs -text
35
+ *tfevents* filter=lfs diff=lfs merge=lfs -text
README.md ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ title: Video2novel
3
+ emoji: 😻
4
+ colorFrom: red
5
+ colorTo: pink
6
+ sdk: gradio
7
+ sdk_version: 5.35.0
8
+ app_file: app.py
9
+ pinned: false
10
+ ---
11
+
12
+ Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
app.py ADDED
@@ -0,0 +1,57 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ def process_video(url, cookies_file=None):
2
+ session_id = str(uuid.uuid4())
3
+ base_dir = os.path.join("session_data", session_id)
4
+ os.makedirs(base_dir, exist_ok=True)
5
+
6
+ screenshots_dir = os.path.join(base_dir, "screenshots")
7
+ plots_dir = os.path.join(base_dir, "plots")
8
+ os.makedirs(screenshots_dir, exist_ok=True)
9
+ os.makedirs(plots_dir, exist_ok=True)
10
+
11
+ # Save cookies file if uploaded
12
+ cookies_path = None
13
+ if cookies_file is not None:
14
+ cookies_path = os.path.join(base_dir, "cookies.txt")
15
+ with open(cookies_path, "wb") as f:
16
+ f.write(cookies_file.read())
17
+
18
+ # Step 1: Download with cookies support
19
+ video_id, video_path, audio_path = download_video_audio(url, base_dir, cookies_path)
20
+
21
+ # Rest remains the same ...
22
+ result = model.transcribe(audio_path)
23
+ vtt_path = os.path.join(base_dir, f"{video_id}.vtt")
24
+ write_vtt(result["segments"], vtt_path)
25
+
26
+ entries = parse_vtt(vtt_path)
27
+
28
+ y, sr = librosa.load(audio_path, sr=None)
29
+ S = np.abs(librosa.stft(y, n_fft=2048, hop_length=512))
30
+ freqs = librosa.fft_frequencies(sr=sr, n_fft=2048)
31
+ voice_band = (freqs >= 300) & (freqs <= 3000)
32
+ voice_energy = S[voice_band, :].mean(axis=0)
33
+ voice_db = 20 * np.log10(voice_energy + 1e-6)
34
+ time_stamps = librosa.frames_to_time(np.arange(len(voice_db)), sr=sr, hop_length=512)
35
+
36
+ for entry in entries:
37
+ start = entry[0].split(" --> ")[0]
38
+ start_sec = parse_timestamp(start)
39
+ screenshot_path = os.path.join(screenshots_dir, f"{video_id}_{int(start_sec)}.jpg")
40
+ capture_screenshot(video_path, start_sec, screenshot_path)
41
+
42
+ plot_path = os.path.join(plots_dir, f"{video_id}_{int(start_sec)}_sound.png")
43
+ plt.figure(figsize=(8, 3))
44
+ plt.plot(time_stamps, voice_db, color="purple")
45
+ plt.axvline(x=start_sec, color="red", linestyle="--")
46
+ y_interp = np.interp(start_sec, time_stamps, voice_db)
47
+ plt.scatter([start_sec], [y_interp], color="red")
48
+ plt.xlabel("Time (s)")
49
+ plt.ylabel("dB (voice band)")
50
+ plt.tight_layout()
51
+ plt.savefig(plot_path)
52
+ plt.close()
53
+
54
+ html_output_path = os.path.join(base_dir, f"{video_id}.html")
55
+ final_html = generate_html(entries, video_id, url, screenshots_dir, plots_dir, html_output_path)
56
+
57
+ return final_html
requirements.txt ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ gradio
2
+ yt-dlp
3
+ openai-whisper
4
+ librosa
5
+ matplotlib
6
+ soundfile
7
+ ffmpeg-python