hivecorp commited on
Commit
d011be0
·
verified ·
1 Parent(s): 12ef859

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +33 -25
app.py CHANGED
@@ -3,7 +3,7 @@ import edge_tts
3
  import asyncio
4
  import tempfile
5
  import os
6
- from moviepy.editor import AudioFileClip, concatenate_audioclips
7
 
8
  # 获取所有可用的语音
9
  async def get_voices():
@@ -27,10 +27,8 @@ async def text_to_speech(text, voice, rate, pitch):
27
  return tmp_path, None
28
 
29
  # 生成SRT文件
30
- def generate_srt(words, audio_duration, fps=24):
31
- srt_path = os.path.join(tempfile.gettempdir(), "output_subtitles.srt")
32
  with open(srt_path, 'w', encoding='utf-8') as srt_file:
33
- # Split audio duration into segments for SRT
34
  segment_duration = audio_duration / len(words) # Average duration per word
35
  current_time = 0
36
 
@@ -38,7 +36,6 @@ def generate_srt(words, audio_duration, fps=24):
38
  start_time = current_time
39
  end_time = start_time + segment_duration
40
 
41
- # Convert to SRT format
42
  start_time_str = format_srt_time(start_time)
43
  end_time_str = format_srt_time(end_time)
44
  srt_file.write(f"{i + 1}\n{start_time_str} --> {end_time_str}\n{word}\n\n")
@@ -58,7 +55,6 @@ def format_srt_time(seconds):
58
 
59
  # 文字转音频和SRT功能
60
  async def text_to_audio_and_srt(text, voice, rate, pitch):
61
- # Generate audio for the entire text
62
  audio_path, warning = await text_to_speech(text, voice, rate, pitch)
63
  if warning:
64
  return None, None, warning
@@ -67,8 +63,10 @@ async def text_to_audio_and_srt(text, voice, rate, pitch):
67
  audio_duration = audio_clip.duration
68
 
69
  # Generate SRT file based on the entire text
 
 
70
  words = text.split()
71
- srt_path = generate_srt(words, audio_duration)
72
 
73
  return audio_path, srt_path, None
74
 
@@ -81,24 +79,34 @@ def tts_interface(text, voice, rate, pitch):
81
  async def create_demo():
82
  voices = await get_voices()
83
 
84
- demo = gr.Interface(
85
- fn=tts_interface,
86
- inputs=[
87
- gr.Textbox(label="Input Text", lines=5),
88
- gr.Dropdown(choices=[""] + list(voices.keys()), label="Select Voice", value=""),
89
- gr.Slider(minimum=-50, maximum=50, value=0, label="Rate Adjustment (%)", step=1),
90
- gr.Slider(minimum=-20, maximum=20, value=0, label="Pitch Adjustment (Hz)", step=1),
91
- ],
92
- outputs=[
93
- gr.Audio(label="Generated Audio", type="filepath"),
94
- gr.File(label="Generated SRT", file_count="single"),
95
- gr.Markdown(label="Warning", visible=False)
96
- ],
97
- title="Edge TTS Text to Speech with Subtitles",
98
- description="Convert text to speech and generate subtitles (SRT) using Microsoft Edge TTS.",
99
- analytics_enabled=False,
100
- allow_flagging=False,
101
- )
 
 
 
 
 
 
 
 
 
 
102
 
103
  return demo
104
 
 
3
  import asyncio
4
  import tempfile
5
  import os
6
+ from moviepy.editor import AudioFileClip
7
 
8
  # 获取所有可用的语音
9
  async def get_voices():
 
27
  return tmp_path, None
28
 
29
  # 生成SRT文件
30
+ def generate_srt(words, audio_duration, srt_path, fps=24):
 
31
  with open(srt_path, 'w', encoding='utf-8') as srt_file:
 
32
  segment_duration = audio_duration / len(words) # Average duration per word
33
  current_time = 0
34
 
 
36
  start_time = current_time
37
  end_time = start_time + segment_duration
38
 
 
39
  start_time_str = format_srt_time(start_time)
40
  end_time_str = format_srt_time(end_time)
41
  srt_file.write(f"{i + 1}\n{start_time_str} --> {end_time_str}\n{word}\n\n")
 
55
 
56
  # 文字转音频和SRT功能
57
  async def text_to_audio_and_srt(text, voice, rate, pitch):
 
58
  audio_path, warning = await text_to_speech(text, voice, rate, pitch)
59
  if warning:
60
  return None, None, warning
 
63
  audio_duration = audio_clip.duration
64
 
65
  # Generate SRT file based on the entire text
66
+ base_name = os.path.splitext(audio_path)[0]
67
+ srt_path = f"{base_name}_subtitle.srt"
68
  words = text.split()
69
+ generate_srt(words, audio_duration, srt_path)
70
 
71
  return audio_path, srt_path, None
72
 
 
79
  async def create_demo():
80
  voices = await get_voices()
81
 
82
+ with gr.Blocks() as demo:
83
+ gr.Markdown(
84
+ """
85
+ <h1 style="text-align: center; color: #333;">Text to Speech with Subtitles</h1>
86
+ <p style="text-align: center; color: #555;">Convert your text to natural-sounding speech and generate subtitles (SRT) for your audio.</p>
87
+ """,
88
+ elem_id="header"
89
+ )
90
+
91
+ with gr.Row():
92
+ with gr.Column():
93
+ text_input = gr.Textbox(label="Input Text", lines=5, placeholder="Enter text here...")
94
+ voice_dropdown = gr.Dropdown(choices=[""] + list(voices.keys()), label="Select Voice", value="")
95
+ rate_slider = gr.Slider(minimum=-50, maximum=50, value=0, label="Rate Adjustment (%)", step=1)
96
+ pitch_slider = gr.Slider(minimum=-20, maximum=20, value=0, label="Pitch Adjustment (Hz)", step=1)
97
+
98
+ with gr.Column():
99
+ generate_button = gr.Button("Generate Audio and Subtitles", variant="primary")
100
+
101
+ output_audio = gr.Audio(label="Generated Audio", type="filepath")
102
+ output_srt = gr.File(label="Generated SRT", file_count="single")
103
+ warning_msg = gr.Markdown(label="Warning", visible=False)
104
+
105
+ generate_button.click(
106
+ fn=tts_interface,
107
+ inputs=[text_input, voice_dropdown, rate_slider, pitch_slider],
108
+ outputs=[output_audio, output_srt, warning_msg]
109
+ )
110
 
111
  return demo
112