Spaces:
Running
Running
Update app.py
Browse files
app.py
CHANGED
@@ -4,43 +4,47 @@ from moviepy.editor import VideoFileClip
|
|
4 |
import tempfile
|
5 |
import mimetypes
|
6 |
import os
|
|
|
7 |
|
8 |
-
def change_speed(file_path, speed):
|
9 |
mime, _ = mimetypes.guess_type(file_path)
|
10 |
-
|
11 |
if mime and mime.startswith("audio"):
|
12 |
-
return change_audio_speed(file_path, speed)
|
13 |
elif mime and mime.startswith("video"):
|
14 |
-
return change_video_speed(file_path, speed)
|
15 |
else:
|
16 |
raise ValueError("対応していないファイル形式です")
|
17 |
|
18 |
-
def change_audio_speed(audio_file, speed):
|
19 |
audio = AudioSegment.from_file(audio_file)
|
20 |
new_frame_rate = int(audio.frame_rate * speed)
|
21 |
faster_audio = audio._spawn(audio.raw_data, overrides={'frame_rate': new_frame_rate})
|
22 |
faster_audio = faster_audio.set_frame_rate(audio.frame_rate)
|
23 |
|
24 |
-
|
25 |
-
|
|
|
|
|
|
|
26 |
return tmpfile.name
|
27 |
|
28 |
-
def change_video_speed(video_file, speed):
|
29 |
clip = VideoFileClip(video_file)
|
30 |
new_clip = clip.fx(vfx.speedx, speed)
|
31 |
|
32 |
-
|
33 |
-
if
|
34 |
-
ext = ".mov"
|
35 |
-
else:
|
36 |
-
ext = ".mp4"
|
37 |
|
38 |
-
|
39 |
-
|
|
|
|
|
|
|
|
|
|
|
40 |
return tmpfile.name
|
41 |
|
42 |
-
import moviepy.video.fx.all as vfx
|
43 |
-
|
44 |
with gr.Blocks() as demo:
|
45 |
gr.Markdown("# 音声・動画の再生速度を細かく調整して変換")
|
46 |
|
@@ -51,12 +55,17 @@ with gr.Blocks() as demo:
|
|
51 |
minimum=0.1, maximum=3.0, value=1.0, step=0.00001,
|
52 |
label="再生速度(例:0.75 = 25%遅く、1.25 = 25%速く)"
|
53 |
)
|
|
|
|
|
|
|
|
|
|
|
54 |
btn = gr.Button("変換")
|
55 |
|
56 |
with gr.Column():
|
57 |
file_output = gr.File(label="変換後のファイルをダウンロード")
|
58 |
|
59 |
-
btn.click(fn=change_speed, inputs=[file_input, speed_input], outputs=file_output)
|
60 |
|
61 |
if __name__ == "__main__":
|
62 |
demo.launch()
|
|
|
4 |
import tempfile
|
5 |
import mimetypes
|
6 |
import os
|
7 |
+
import moviepy.video.fx.all as vfx
|
8 |
|
9 |
+
def change_speed(file_path, speed, export_format):
|
10 |
mime, _ = mimetypes.guess_type(file_path)
|
11 |
+
|
12 |
if mime and mime.startswith("audio"):
|
13 |
+
return change_audio_speed(file_path, speed, export_format)
|
14 |
elif mime and mime.startswith("video"):
|
15 |
+
return change_video_speed(file_path, speed, export_format)
|
16 |
else:
|
17 |
raise ValueError("対応していないファイル形式です")
|
18 |
|
19 |
+
def change_audio_speed(audio_file, speed, export_format):
|
20 |
audio = AudioSegment.from_file(audio_file)
|
21 |
new_frame_rate = int(audio.frame_rate * speed)
|
22 |
faster_audio = audio._spawn(audio.raw_data, overrides={'frame_rate': new_frame_rate})
|
23 |
faster_audio = faster_audio.set_frame_rate(audio.frame_rate)
|
24 |
|
25 |
+
original_ext = os.path.splitext(audio_file)[-1].lstrip(".")
|
26 |
+
format_ext = original_ext if export_format == "元のまま" else export_format
|
27 |
+
|
28 |
+
with tempfile.NamedTemporaryFile(suffix=f".{format_ext}", delete=False) as tmpfile:
|
29 |
+
faster_audio.export(tmpfile.name, format=format_ext)
|
30 |
return tmpfile.name
|
31 |
|
32 |
+
def change_video_speed(video_file, speed, export_format):
|
33 |
clip = VideoFileClip(video_file)
|
34 |
new_clip = clip.fx(vfx.speedx, speed)
|
35 |
|
36 |
+
original_ext = os.path.splitext(video_file)[-1].lstrip(".")
|
37 |
+
format_ext = original_ext if export_format == "元のまま" else export_format
|
|
|
|
|
|
|
38 |
|
39 |
+
suffix = f".{format_ext}"
|
40 |
+
with tempfile.NamedTemporaryFile(suffix=suffix, delete=False) as tmpfile:
|
41 |
+
new_clip.write_videofile(
|
42 |
+
tmpfile.name,
|
43 |
+
codec="libx264" if format_ext in ["mp4", "mov"] else None,
|
44 |
+
audio_codec="aac"
|
45 |
+
)
|
46 |
return tmpfile.name
|
47 |
|
|
|
|
|
48 |
with gr.Blocks() as demo:
|
49 |
gr.Markdown("# 音声・動画の再生速度を細かく調整して変換")
|
50 |
|
|
|
55 |
minimum=0.1, maximum=3.0, value=1.0, step=0.00001,
|
56 |
label="再生速度(例:0.75 = 25%遅く、1.25 = 25%速く)"
|
57 |
)
|
58 |
+
export_format_input = gr.Dropdown(
|
59 |
+
choices=["元のまま", "wav", "mp3", "mp4", "mov"],
|
60 |
+
value="元のまま",
|
61 |
+
label="出力フォーマット"
|
62 |
+
)
|
63 |
btn = gr.Button("変換")
|
64 |
|
65 |
with gr.Column():
|
66 |
file_output = gr.File(label="変換後のファイルをダウンロード")
|
67 |
|
68 |
+
btn.click(fn=change_speed, inputs=[file_input, speed_input, export_format_input], outputs=file_output)
|
69 |
|
70 |
if __name__ == "__main__":
|
71 |
demo.launch()
|