加入ui.py

加入requirements.txt
This commit is contained in:
william 2024-09-18 13:56:21 +08:00
parent 3af4a6ee98
commit f35052ad49
2 changed files with 188 additions and 0 deletions

1
requirements.txt Normal file
View File

@ -0,0 +1 @@
gradio==4.44.0

187
ui.py Normal file
View 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")