加入ui.py
加入requirements.txt
This commit is contained in:
parent
3af4a6ee98
commit
f35052ad49
1
requirements.txt
Normal file
1
requirements.txt
Normal file
@ -0,0 +1 @@
|
|||||||
|
gradio==4.44.0
|
||||||
187
ui.py
Normal file
187
ui.py
Normal file
@ -0,0 +1,187 @@
|
|||||||
|
import gradio as gr
|
||||||
|
import subprocess
|
||||||
|
import os
|
||||||
|
|
||||||
|
|
||||||
|
def convert_to_wav(audio_file):
|
||||||
|
# 使用 ffmpeg 将音频文件转换为 wav 格式
|
||||||
|
output_wav_file = "output.wav"
|
||||||
|
print(f"开始转换音频文件 {audio_file} 为 WAV 格式...")
|
||||||
|
subprocess.run([
|
||||||
|
"ffmpeg", "-y", "-i", audio_file,
|
||||||
|
"-ac", "1",
|
||||||
|
"-ar", "16000",
|
||||||
|
output_wav_file
|
||||||
|
])
|
||||||
|
print(f"音频文件 {audio_file} 已转换为 WAV 格式,输出文件为 {output_wav_file}")
|
||||||
|
return output_wav_file
|
||||||
|
|
||||||
|
|
||||||
|
def transcribe_audio(wav_file, original_filename, offset_time, duration_time):
|
||||||
|
# 调用 whisper 命令行程序进行转写
|
||||||
|
whisper_cmd = [
|
||||||
|
"/home/tmfc/apps/whisper/main",
|
||||||
|
"--language", "Chinese",
|
||||||
|
"-otxt",
|
||||||
|
"-ot", str(offset_time * 1000),
|
||||||
|
"-d", str(duration_time * 1000),
|
||||||
|
"-of", "/home/tmfc/apps/whisper/" + original_filename,
|
||||||
|
"-m", "/home/tmfc/apps/whisper/models/ggml-large-v3-q5_0.bin",
|
||||||
|
wav_file
|
||||||
|
]
|
||||||
|
print(whisper_cmd)
|
||||||
|
print(f"开始转写音频文件 {wav_file}...")
|
||||||
|
result = subprocess.run(whisper_cmd, capture_output=True, text=True)
|
||||||
|
print(result)
|
||||||
|
# 将转写结果保存为 txt 文件
|
||||||
|
# txt_file = "transcription.txt"
|
||||||
|
# with open(txt_file, "w") as f:
|
||||||
|
# f.write(result.stdout)
|
||||||
|
|
||||||
|
txt_file = original_filename + ".txt"
|
||||||
|
print(f"音频文件 {wav_file} 转写完成,结果已保存为 {txt_file}")
|
||||||
|
|
||||||
|
return txt_file
|
||||||
|
|
||||||
|
|
||||||
|
def process_audio(audio_file, offset_time, duration_time):
|
||||||
|
print("开始处理音频文件...")
|
||||||
|
# 获取上传的文件名
|
||||||
|
original_filename = os.path.basename(audio_file)
|
||||||
|
|
||||||
|
# 转换音频文件为 wav 格式
|
||||||
|
wav_file = convert_to_wav(audio_file)
|
||||||
|
|
||||||
|
# 转写音频文件
|
||||||
|
txt_file = transcribe_audio(wav_file, original_filename, offset_time, duration_time)
|
||||||
|
|
||||||
|
print("音频文件处理完成")
|
||||||
|
return txt_file
|
||||||
|
|
||||||
|
|
||||||
|
def direct_transcribe(audio_file, offset_time, duration_time):
|
||||||
|
print("开始直接转写音频文件...")
|
||||||
|
|
||||||
|
# 转写音频文件
|
||||||
|
txt_file = transcribe_audio("output.wav", "output.wav", offset_time, duration_time)
|
||||||
|
|
||||||
|
print("音频文件直接转写完成")
|
||||||
|
return txt_file
|
||||||
|
|
||||||
|
|
||||||
|
batch_directory = '/mnt/d/share/audio/'
|
||||||
|
|
||||||
|
|
||||||
|
def list_files():
|
||||||
|
# 获取目录下的所有文件
|
||||||
|
files = os.listdir(batch_directory)
|
||||||
|
# 过滤掉目录,只保留文件
|
||||||
|
files = [f for f in files if os.path.isfile(os.path.join(batch_directory, f)) and f.lower().endswith(('.mp3', '.m4a'))]
|
||||||
|
return files
|
||||||
|
|
||||||
|
|
||||||
|
log_content = ""
|
||||||
|
|
||||||
|
|
||||||
|
def batch_transcribe():
|
||||||
|
global log_content
|
||||||
|
files = list_files()
|
||||||
|
result_file = []
|
||||||
|
for file in files:
|
||||||
|
# 转换音频文件为 wav 格式
|
||||||
|
log_entry = "转换" + file + "为 wav\n"
|
||||||
|
log_content += log_entry
|
||||||
|
wav_file = convert_to_wav(batch_directory + file)
|
||||||
|
log_entry = "转换wav成功,开始转写\n"
|
||||||
|
log_content += log_entry
|
||||||
|
# 转写音频文件
|
||||||
|
txt_file = transcribe_audio(wav_file, file, 10, 0)
|
||||||
|
log_entry = "转写 " + file + "完成\n"
|
||||||
|
log_content += log_entry
|
||||||
|
result_file.append(txt_file)
|
||||||
|
return result_file
|
||||||
|
|
||||||
|
|
||||||
|
def display_files():
|
||||||
|
files = list_files()
|
||||||
|
return "\n".join(files)
|
||||||
|
|
||||||
|
|
||||||
|
def get_log():
|
||||||
|
global log_content
|
||||||
|
return log_content
|
||||||
|
|
||||||
|
|
||||||
|
def update_log_output():
|
||||||
|
return gr.update(value=get_log())
|
||||||
|
|
||||||
|
|
||||||
|
def convert_to_docx(text):
|
||||||
|
if text.strip() == "":
|
||||||
|
return "输入框不能为空!"
|
||||||
|
|
||||||
|
# 将输入内容写入 file.md 文件
|
||||||
|
with open("file.md", "w") as file:
|
||||||
|
file.write(text)
|
||||||
|
|
||||||
|
# 使用 pandoc 将 file.md 转换为 file.docx
|
||||||
|
try:
|
||||||
|
subprocess.run(["pandoc", "file.md", "-o", "file.docx"], check=True)
|
||||||
|
except subprocess.CalledProcessError as e:
|
||||||
|
return f"转换失败: {e}"
|
||||||
|
|
||||||
|
# 返回 file.docx 文件供用户下载
|
||||||
|
return "file.docx"
|
||||||
|
|
||||||
|
|
||||||
|
with gr.Blocks() as iface:
|
||||||
|
gr.Markdown("# 音频文件转换为 WAV 格式并转录为文字")
|
||||||
|
with gr.Tabs():
|
||||||
|
with gr.TabItem("处理并转写"):
|
||||||
|
with gr.Row():
|
||||||
|
audio_input = gr.Audio(type="filepath", label="上传音频文件")
|
||||||
|
with gr.Column():
|
||||||
|
offset_input = gr.Number(label="偏移时间 (秒)")
|
||||||
|
duration_input = gr.Number(label="转写时长 (秒)")
|
||||||
|
|
||||||
|
with gr.Row():
|
||||||
|
process_button = gr.Button("处理并转写")
|
||||||
|
direct_transcribe_button = gr.Button("直接转写")
|
||||||
|
|
||||||
|
output_file = gr.File(label="转写结果")
|
||||||
|
|
||||||
|
process_button.click(process_audio, inputs=[audio_input, offset_input, duration_input], outputs=output_file)
|
||||||
|
direct_transcribe_button.click(direct_transcribe, inputs=[audio_input, offset_input, duration_input],
|
||||||
|
outputs=output_file)
|
||||||
|
with gr.TabItem("批量处理"):
|
||||||
|
with gr.Row():
|
||||||
|
link_upload = gr.HTML(value='<a href="https://webd.willking.tech" target="_blank">点击上传文件</a>')
|
||||||
|
with gr.Row():
|
||||||
|
file_list = gr.Textbox(label="文件列表")
|
||||||
|
with gr.Column():
|
||||||
|
list_file_button = gr.Button("刷新文件")
|
||||||
|
batch_process_button = gr.Button("批量处理")
|
||||||
|
with gr.Column():
|
||||||
|
batch_output_file = gr.File(label="批量转写结果")
|
||||||
|
|
||||||
|
with gr.Row():
|
||||||
|
log_output = gr.Textbox(label="日志信息", lines=10)
|
||||||
|
|
||||||
|
list_file_button.click(fn=display_files, outputs=file_list)
|
||||||
|
|
||||||
|
batch_process_button.click(batch_transcribe, outputs=batch_output_file)
|
||||||
|
|
||||||
|
with gr.Tab("Markdown 转 DOCX"):
|
||||||
|
gr.Markdown("## Markdown 转 DOCX 转换器")
|
||||||
|
with gr.Row():
|
||||||
|
text_input = gr.Textbox(lines=10, placeholder="请在此输入 Markdown 内容...")
|
||||||
|
with gr.Row():
|
||||||
|
convert_button = gr.Button("转换")
|
||||||
|
with gr.Row():
|
||||||
|
output_file = gr.File(label="下载转换后的文件")
|
||||||
|
|
||||||
|
convert_button.click(convert_to_docx, inputs=text_input, outputs=output_file)
|
||||||
|
|
||||||
|
iface.load(fn=update_log_output, outputs=[log_output], every=1)
|
||||||
|
|
||||||
|
iface.launch(server_name="0.0.0.0")
|
||||||
Loading…
x
Reference in New Issue
Block a user