Eyuvaraj commited on
Commit
41cfa9c
·
1 Parent(s): 2266c59

heygen api video gen, timestamp clipping

Browse files
audio_clips/clip_0.wav ADDED
Binary file (15.2 kB). View file
 
audio_clips/clip_1.wav ADDED
Binary file (6.38 kB). View file
 
audio_clips/clip_10.wav ADDED
Binary file (9.84 kB). View file
 
audio_clips/clip_11.wav ADDED
Binary file (14.3 kB). View file
 
audio_clips/clip_12.wav ADDED
Binary file (13.1 kB). View file
 
audio_clips/clip_13.wav ADDED
Binary file (11.9 kB). View file
 
audio_clips/clip_14.wav ADDED
Binary file (12.5 kB). View file
 
audio_clips/clip_15.wav ADDED
Binary file (17.6 kB). View file
 
audio_clips/clip_16.wav ADDED
Binary file (17.3 kB). View file
 
audio_clips/clip_17.wav ADDED
Binary file (11.2 kB). View file
 
audio_clips/clip_18.wav ADDED
Binary file (19.5 kB). View file
 
audio_clips/clip_19.wav ADDED
Binary file (18.1 kB). View file
 
audio_clips/clip_2.wav ADDED
Binary file (7.34 kB). View file
 
audio_clips/clip_20.wav ADDED
Binary file (11.9 kB). View file
 
audio_clips/clip_21.wav ADDED
Binary file (16.9 kB). View file
 
audio_clips/clip_22.wav ADDED
Binary file (15.3 kB). View file
 
audio_clips/clip_23.wav ADDED
Binary file (16.9 kB). View file
 
audio_clips/clip_24.wav ADDED
Binary file (22.9 kB). View file
 
audio_clips/clip_25.wav ADDED
Binary file (22.2 kB). View file
 
audio_clips/clip_26.wav ADDED
Binary file (15.6 kB). View file
 
audio_clips/clip_27.wav ADDED
Binary file (22.9 kB). View file
 
audio_clips/clip_28.wav ADDED
Binary file (13.1 kB). View file
 
audio_clips/clip_29.wav ADDED
Binary file (16.7 kB). View file
 
audio_clips/clip_3.wav ADDED
Binary file (7.48 kB). View file
 
audio_clips/clip_30.wav ADDED
Binary file (11.5 kB). View file
 
audio_clips/clip_31.wav ADDED
Binary file (52.3 kB). View file
 
audio_clips/clip_32.wav ADDED
Binary file (19.5 kB). View file
 
audio_clips/clip_4.wav ADDED
Binary file (11 kB). View file
 
audio_clips/clip_5.wav ADDED
Binary file (5.13 kB). View file
 
audio_clips/clip_7.wav ADDED
Binary file (14.4 kB). View file
 
audio_clips/clip_8.wav ADDED
Binary file (6.19 kB). View file
 
audio_clips/clip_9.wav ADDED
Binary file (18.2 kB). View file
 
audio_clips/clips_metadata.json ADDED
@@ -0,0 +1,194 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {[
2
+ {
3
+ "clip_number": 0,
4
+ "start_time_ms": 0,
5
+ "end_time_ms": 316,
6
+ "file_name": "clip_0.wav"
7
+ },
8
+ {
9
+ "clip_number": 1,
10
+ "start_time_ms": 696,
11
+ "end_time_ms": 828,
12
+ "file_name": "clip_1.wav"
13
+ },
14
+ {
15
+ "clip_number": 2,
16
+ "start_time_ms": 1239,
17
+ "end_time_ms": 1391,
18
+ "file_name": "clip_2.wav"
19
+ },
20
+ {
21
+ "clip_number": 3,
22
+ "start_time_ms": 1822,
23
+ "end_time_ms": 1977,
24
+ "file_name": "clip_3.wav"
25
+ },
26
+ {
27
+ "clip_number": 4,
28
+ "start_time_ms": 2433,
29
+ "end_time_ms": 2661,
30
+ "file_name": "clip_4.wav"
31
+ },
32
+ {
33
+ "clip_number": 5,
34
+ "start_time_ms": 3067,
35
+ "end_time_ms": 3173,
36
+ "file_name": "clip_5.wav"
37
+ },
38
+ {
39
+ "clip_number": 7,
40
+ "start_time_ms": 3803,
41
+ "end_time_ms": 4103,
42
+ "file_name": "clip_7.wav"
43
+ },
44
+ {
45
+ "clip_number": 8,
46
+ "start_time_ms": 4450,
47
+ "end_time_ms": 4578,
48
+ "file_name": "clip_8.wav"
49
+ },
50
+ {
51
+ "clip_number": 9,
52
+ "start_time_ms": 5016,
53
+ "end_time_ms": 5394,
54
+ "file_name": "clip_9.wav"
55
+ },
56
+ {
57
+ "clip_number": 10,
58
+ "start_time_ms": 5772,
59
+ "end_time_ms": 5976,
60
+ "file_name": "clip_10.wav"
61
+ },
62
+ {
63
+ "clip_number": 11,
64
+ "start_time_ms": 6369,
65
+ "end_time_ms": 6665,
66
+ "file_name": "clip_11.wav"
67
+ },
68
+ {
69
+ "clip_number": 12,
70
+ "start_time_ms": 7080,
71
+ "end_time_ms": 7352,
72
+ "file_name": "clip_12.wav"
73
+ },
74
+ {
75
+ "clip_number": 13,
76
+ "start_time_ms": 7809,
77
+ "end_time_ms": 8056,
78
+ "file_name": "clip_13.wav"
79
+ },
80
+ {
81
+ "clip_number": 14,
82
+ "start_time_ms": 8503,
83
+ "end_time_ms": 8763,
84
+ "file_name": "clip_14.wav"
85
+ },
86
+ {
87
+ "clip_number": 15,
88
+ "start_time_ms": 9167,
89
+ "end_time_ms": 9532,
90
+ "file_name": "clip_15.wav"
91
+ },
92
+ {
93
+ "clip_number": 16,
94
+ "start_time_ms": 9951,
95
+ "end_time_ms": 10311,
96
+ "file_name": "clip_16.wav"
97
+ },
98
+ {
99
+ "clip_number": 17,
100
+ "start_time_ms": 10667,
101
+ "end_time_ms": 10900,
102
+ "file_name": "clip_17.wav"
103
+ },
104
+ {
105
+ "clip_number": 18,
106
+ "start_time_ms": 11242,
107
+ "end_time_ms": 11648,
108
+ "file_name": "clip_18.wav"
109
+ },
110
+ {
111
+ "clip_number": 19,
112
+ "start_time_ms": 11998,
113
+ "end_time_ms": 12374,
114
+ "file_name": "clip_19.wav"
115
+ },
116
+ {
117
+ "clip_number": 20,
118
+ "start_time_ms": 12782,
119
+ "end_time_ms": 13029,
120
+ "file_name": "clip_20.wav"
121
+ },
122
+ {
123
+ "clip_number": 21,
124
+ "start_time_ms": 13454,
125
+ "end_time_ms": 13805,
126
+ "file_name": "clip_21.wav"
127
+ },
128
+ {
129
+ "clip_number": 22,
130
+ "start_time_ms": 14243,
131
+ "end_time_ms": 14561,
132
+ "file_name": "clip_22.wav"
133
+ },
134
+ {
135
+ "clip_number": 23,
136
+ "start_time_ms": 14999,
137
+ "end_time_ms": 15351,
138
+ "file_name": "clip_23.wav"
139
+ },
140
+ {
141
+ "clip_number": 24,
142
+ "start_time_ms": 15744,
143
+ "end_time_ms": 16220,
144
+ "file_name": "clip_24.wav"
145
+ },
146
+ {
147
+ "clip_number": 25,
148
+ "start_time_ms": 16632,
149
+ "end_time_ms": 17093,
150
+ "file_name": "clip_25.wav"
151
+ },
152
+ {
153
+ "clip_number": 26,
154
+ "start_time_ms": 17443,
155
+ "end_time_ms": 17767,
156
+ "file_name": "clip_26.wav"
157
+ },
158
+ {
159
+ "clip_number": 27,
160
+ "start_time_ms": 18088,
161
+ "end_time_ms": 18564,
162
+ "file_name": "clip_27.wav"
163
+ },
164
+ {
165
+ "clip_number": 28,
166
+ "start_time_ms": 18970,
167
+ "end_time_ms": 19241,
168
+ "file_name": "clip_28.wav"
169
+ },
170
+ {
171
+ "clip_number": 29,
172
+ "start_time_ms": 19638,
173
+ "end_time_ms": 19986,
174
+ "file_name": "clip_29.wav"
175
+ },
176
+ {
177
+ "clip_number": 30,
178
+ "start_time_ms": 20328,
179
+ "end_time_ms": 20566,
180
+ "file_name": "clip_30.wav"
181
+ },
182
+ {
183
+ "clip_number": 31,
184
+ "start_time_ms": 21078,
185
+ "end_time_ms": 22167,
186
+ "file_name": "clip_31.wav"
187
+ },
188
+ {
189
+ "clip_number": 32,
190
+ "start_time_ms": 22752,
191
+ "end_time_ms": 23158,
192
+ "file_name": "clip_32.wav"
193
+ }
194
+ ]}
clips_metadata.json ADDED
@@ -0,0 +1,194 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "clip_number": 0,
4
+ "start_time_ms": 0,
5
+ "end_time_ms": 356,
6
+ "file_name": "1_cut.mp4"
7
+ },
8
+ {
9
+ "clip_number": 1,
10
+ "start_time_ms": 656,
11
+ "end_time_ms": 868,
12
+ "file_name": "2_cut.mp4"
13
+ },
14
+ {
15
+ "clip_number": 2,
16
+ "start_time_ms": 1199,
17
+ "end_time_ms": 1431,
18
+ "file_name": "3_cut.mp4"
19
+ },
20
+ {
21
+ "clip_number": 3,
22
+ "start_time_ms": 1782,
23
+ "end_time_ms": 2017,
24
+ "file_name": "4_cut.mp4"
25
+ },
26
+ {
27
+ "clip_number": 4,
28
+ "start_time_ms": 2393,
29
+ "end_time_ms": 2701,
30
+ "file_name": "5_cut.mp4"
31
+ },
32
+ {
33
+ "clip_number": 5,
34
+ "start_time_ms": 3027,
35
+ "end_time_ms": 3213,
36
+ "file_name": "6_cut.mp4"
37
+ },
38
+ {
39
+ "clip_number": 7,
40
+ "start_time_ms": 3763,
41
+ "end_time_ms": 4143,
42
+ "file_name": "7_cut.mp4"
43
+ },
44
+ {
45
+ "clip_number": 8,
46
+ "start_time_ms": 4410,
47
+ "end_time_ms": 4618,
48
+ "file_name": "8_cut.mp4"
49
+ },
50
+ {
51
+ "clip_number": 9,
52
+ "start_time_ms": 4976,
53
+ "end_time_ms": 5434,
54
+ "file_name": "9_cut.mp4"
55
+ },
56
+ {
57
+ "clip_number": 10,
58
+ "start_time_ms": 5732,
59
+ "end_time_ms": 6016,
60
+ "file_name": "10_cut.mp4"
61
+ },
62
+ {
63
+ "clip_number": 11,
64
+ "start_time_ms": 6329,
65
+ "end_time_ms": 6705,
66
+ "file_name": "20_cut.mp4"
67
+ },
68
+ {
69
+ "clip_number": 12,
70
+ "start_time_ms": 7040,
71
+ "end_time_ms": 7392,
72
+ "file_name": "30_cut.mp4"
73
+ },
74
+ {
75
+ "clip_number": 13,
76
+ "start_time_ms": 7769,
77
+ "end_time_ms": 8096,
78
+ "file_name": "40_cut.mp4"
79
+ },
80
+ {
81
+ "clip_number": 14,
82
+ "start_time_ms": 8463,
83
+ "end_time_ms": 8803,
84
+ "file_name": "50_cut.mp4"
85
+ },
86
+ {
87
+ "clip_number": 15,
88
+ "start_time_ms": 9127,
89
+ "end_time_ms": 9572,
90
+ "file_name": "60_cut.mp4"
91
+ },
92
+ {
93
+ "clip_number": 16,
94
+ "start_time_ms": 9911,
95
+ "end_time_ms": 10351,
96
+ "file_name": "70_cut.mp4"
97
+ },
98
+ {
99
+ "clip_number": 17,
100
+ "start_time_ms": 10627,
101
+ "end_time_ms": 10940,
102
+ "file_name": "80_cut.mp4"
103
+ },
104
+ {
105
+ "clip_number": 18,
106
+ "start_time_ms": 11202,
107
+ "end_time_ms": 11688,
108
+ "file_name": "90_cut.mp4"
109
+ },
110
+ {
111
+ "clip_number": 19,
112
+ "start_time_ms": 11958,
113
+ "end_time_ms": 12414,
114
+ "file_name": "11_cut.mp4"
115
+ },
116
+ {
117
+ "clip_number": 20,
118
+ "start_time_ms": 12742,
119
+ "end_time_ms": 13069,
120
+ "file_name": "12_cut.mp4"
121
+ },
122
+ {
123
+ "clip_number": 21,
124
+ "start_time_ms": 13414,
125
+ "end_time_ms": 13845,
126
+ "file_name": "13_cut.mp4"
127
+ },
128
+ {
129
+ "clip_number": 22,
130
+ "start_time_ms": 14203,
131
+ "end_time_ms": 14601,
132
+ "file_name": "14_cut.mp4"
133
+ },
134
+ {
135
+ "clip_number": 23,
136
+ "start_time_ms": 14959,
137
+ "end_time_ms": 15391,
138
+ "file_name": "15_cut.mp4"
139
+ },
140
+ {
141
+ "clip_number": 24,
142
+ "start_time_ms": 15704,
143
+ "end_time_ms": 16260,
144
+ "file_name": "16_cut.mp4"
145
+ },
146
+ {
147
+ "clip_number": 25,
148
+ "start_time_ms": 16592,
149
+ "end_time_ms": 17133,
150
+ "file_name": "17_cut.mp4"
151
+ },
152
+ {
153
+ "clip_number": 26,
154
+ "start_time_ms": 17403,
155
+ "end_time_ms": 17807,
156
+ "file_name": "18_cut.mp4"
157
+ },
158
+ {
159
+ "clip_number": 27,
160
+ "start_time_ms": 18048,
161
+ "end_time_ms": 18604,
162
+ "file_name": "19_cut.mp4"
163
+ },
164
+ {
165
+ "clip_number": 28,
166
+ "start_time_ms": 18930,
167
+ "end_time_ms": 19281,
168
+ "file_name": "100_cut.mp4"
169
+ },
170
+ {
171
+ "clip_number": 29,
172
+ "start_time_ms": 19598,
173
+ "end_time_ms": 20026,
174
+ "file_name": "1000_cut.mp4"
175
+ },
176
+ {
177
+ "clip_number": 30,
178
+ "start_time_ms": 20288,
179
+ "end_time_ms": 20606,
180
+ "file_name": "100000_cut.mp4"
181
+ },
182
+ {
183
+ "clip_number": 31,
184
+ "start_time_ms": 21038,
185
+ "end_time_ms": 22207,
186
+ "file_name": "Intro_cut.mp4"
187
+ },
188
+ {
189
+ "clip_number": 32,
190
+ "start_time_ms": 22712,
191
+ "end_time_ms": 23198,
192
+ "file_name": "Conclusion_cut.mp4"
193
+ }
194
+ ]
male_audio.m4a ADDED
Binary file (299 kB). View file
 
process_audio.py ADDED
@@ -0,0 +1,92 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from pydub import AudioSegment
2
+ from pydub.silence import detect_silence
3
+ import os
4
+ import json
5
+
6
+ def split_audio_on_silence(input_audio_path, output_dir, silence_thresh=-40, min_silence_len=120, keep_silence=30):
7
+ """
8
+ Splits an audio file into multiple clips when silence is detected and generates a JSON with timestamps.
9
+
10
+ :param input_audio_path: Path to the input audio file
11
+ :param output_dir: Directory to save the output clips
12
+ :param silence_thresh: Silence threshold in dBFS (default: -40 dBFS)
13
+ :param min_silence_len: Minimum silence length to detect in milliseconds (default: 500 ms)
14
+ :param keep_silence: Milliseconds of silence to retain at the beginning and end of each clip (default: 200 ms)
15
+ """
16
+ # Load the audio file
17
+ audio = AudioSegment.from_file(input_audio_path)
18
+
19
+ # Detect silences in the audio
20
+ silence_ranges = detect_silence(audio, min_silence_len=min_silence_len, silence_thresh=silence_thresh)
21
+
22
+ # Adjust silence ranges to keep a bit of silence in each segment
23
+ adjusted_ranges = [(start - keep_silence, end + keep_silence) for start, end in silence_ranges]
24
+ adjusted_ranges = [(max(0, start), min(len(audio), end)) for start, end in adjusted_ranges]
25
+
26
+ # List to store clip metadata
27
+ clips_metadata = []
28
+
29
+ # If no silences are detected, save the whole audio as one clip
30
+ if not adjusted_ranges:
31
+ output_path = os.path.join(output_dir, "clip_0.wav")
32
+ audio.export(output_path, format="wav")
33
+ clips_metadata.append({
34
+ "clip_number": 0,
35
+ "start_time_ms": 0,
36
+ "end_time_ms": len(audio),
37
+ "file_name": "clip_0.wav"
38
+ })
39
+ print(f"No silences detected. Entire audio saved as {output_path}")
40
+ # Save metadata to JSON
41
+ with open(os.path.join(output_dir, "clips_metadata.json"), "w") as json_file:
42
+ json.dump(clips_metadata, json_file, indent=4)
43
+ return
44
+
45
+ # Split audio into clips based on silence
46
+ start_idx = 0
47
+ for i, (start, end) in enumerate(adjusted_ranges):
48
+ if start > start_idx:
49
+ clip = audio[start_idx:start]
50
+ file_name = f"clip_{i}.wav"
51
+ output_path = os.path.join(output_dir, file_name)
52
+ clip.export(output_path, format="wav")
53
+ print(f"Saved clip: {output_path}")
54
+
55
+ # Add metadata for the clip
56
+ clips_metadata.append({
57
+ "clip_number": i,
58
+ "start_time_ms": start_idx,
59
+ "end_time_ms": start,
60
+ "file_name": file_name
61
+ })
62
+ start_idx = end
63
+
64
+ # Save the last segment after the final silence
65
+ if start_idx < len(audio):
66
+ file_name = f"clip_{len(adjusted_ranges)}.wav"
67
+ output_path = os.path.join(output_dir, file_name)
68
+ audio[start_idx:].export(output_path, format="wav")
69
+ print(f"Saved clip: {output_path}")
70
+
71
+ # Add metadata for the last clip
72
+ clips_metadata.append({
73
+ "clip_number": len(adjusted_ranges),
74
+ "start_time_ms": start_idx,
75
+ "end_time_ms": len(audio),
76
+ "file_name": file_name
77
+ })
78
+
79
+ # Save metadata to JSON
80
+ json_path = os.path.join(output_dir, "clips_metadata.json")
81
+ with open(json_path, "w") as json_file:
82
+ json.dump(clips_metadata, json_file, indent=4)
83
+ print(f"Clip metadata saved to {json_path}")
84
+
85
+
86
+ if __name__ == "__main__":
87
+ input_audio = "male_audio.m4a"
88
+ output_directory = "audio_clips"
89
+
90
+ os.makedirs(output_directory, exist_ok=True)
91
+
92
+ split_audio_on_silence(input_audio, output_directory)