chyoso-toolkit/chyoso_toolkit_ui.py
2024-09-18 15:02:32 +08:00

187 lines
6.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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("# 大模型工具集")
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 转 Word"):
gr.Markdown("## Markdown 转 Word 转换器")
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")