基于Whisper实现一个本地可运行音视频转文字/字幕应用
实现语音转文字功能:从模型加载到实时转录的完整指南
在这篇文章中,我将分享一个基于Whisper模型的语音转文字项目,展示如何使用faster-whisper和Gradio库构建一个实时转录和处理音频文件的应用。这个项目同时支持多语言的语音转录,甚至可以通过AI对转录结果进行润色。
该项目的主要功能包括
1.实时音频转录:通过麦克风录音并进行实时的语音识别。
2.音频文件上传:支持上传音频文件并进行转录。
3.语言支持:支持多种语言的语音转录。
4.字幕生成:支持生成字幕格式的转录输出。
5.AI润色:调用AI接口对转录后的文本进行错别字修正和句子润色。
下面我将详细介绍项目的各个功能模块及其实现方式。
1. 环境与依赖安装
首先,确保你的环境中安装了以下依赖:
faster-whisper: 语音识别库,提供高效的Whisper模型推理。
gradio: 前端界面库,用于构建Web应用。
zhconv: 中文简繁转换工具。
requests、av等。
安装方法如下:
pip install faster-whisper gradio zhconv av requests
2. 检测CUDA支持
为了提升转录性能,我们首先通过nvidia-smi命令检查CUDA是否可用,如果可用则加载GPU模式的Whisper模型:
def check_cuda_available():
try:
result = subprocess.run(['nvidia-smi'], capture_output=True, text=True)
return result.returncode == 0
except FileNotFoundError:
return False
cuda_available = check_cuda_available()
path = "./models/faster-whisper-large-v2"
model = WhisperModel(model_size_or_path=path, device="cuda", compute_type="float16") if cuda_available else WhisperModel(model_size_or_path=path, device="cpu", compute_type="int8"
3. 录音和实时转录
我们使用Gradio的Audio组件来处理实时录音,并通过faster-whisper进行语音识别。以下是录音和转录的实现流程:
- 录音数据被写入队列。
- 使用VAD(语音活动检测)进行语音分段。
- 将音频帧转换为文本。
实时录音与转录的关键代码如下:
def start_recording():
global recording, total_frames, text_arr
recording = True
total_frames = np.array([], dtype=np.float32)
text_arr = []
threading.Thread(target=transcribe_process, daemon=True).start()
def transcribe_process():
global recording
while recording:
time.sleep(0.5)
if not data_queue.empty():
datas = [data_queue.get() for _ in range(data_queue.qsize())]
audio_data = resample_audio(np.concatenate(datas), 16000)
audio_data = audio_data.astype(np.float32) / 32768.0
total_frames = np.concatenate((total_frames, audio_data))
speech_chunks = get_speech_timestamps(total_frames, vad_parameters)
if speech_chunks:
transcribe_frames = collect_chunks(total_frames, [speech_chunks[0]])
result = transcribe(transcribe_frames)
if text_arr: text_arr.pop()
text_arr.append(result)
4. 多语言与字幕格式支持
该应用支持多种语言的语音识别,你可以在界面中选择转录的语言。为了方便用户理解每个语言选项,我们添加了语言标签:
python
复制代码
language_arr = ["zh", "en", "fr", "es"] # 示例语言列表
language_label = ["中文", "英语", "法语", "西班牙语"] # 对应的语言标签
此外,用户可以选择生成字幕格式的转录结果:
python
复制代码
output_type_checkbox = gr.Checkbox(label="字幕格式", value=is_subtitles, interactive=True)
5. AI润色功能
为了提升语音识别的文本质量,我们集成了一个AI润色接口。用户可以通过点击按钮,将转录文本发送到AI模型,进行错别字修正和格式优化:
python
复制代码
def ai_summary(text):
headers = {'Content-Type': 'application/json', 'Authorization': 'Bearer <token>'}
data = {
"messages": [
{"role": "system", "content": sys_prompt},
{"role": "user", "content": text}
],
"model": "gpt-4o-mini"
}
response = requests.post(ai_srvice, headers=headers, json=data)
ai_text = ''.join([json.loads(line)["choices"][0]["delta"].get("content", '') for line in response.iter_lines() if line])
return ai_text
6. 代码中其他关键模块
- 音频重采样:将录制的音频数据从48kHz重采样到16kHz,以便更好地与语音识别模型兼容。
- 音频文件转录:用户可以上传音频文件,并通过
faster-whisper对文件内容进行转录。
7. 界面与交互
我们使用Gradio构建了一个简洁的用户界面,支持实时转录、文件上传、重新转录以及AI润色功能。主要交互如下:
python
复制代码
with gr.Blocks() as iface:
gr.Markdown("<h4>GitHub仓库地址(欢迎star、贡献代码):<a href='https://github.com/caiwuu/Voice2Text'>Voice2Text</a>;模型仓库:<a href='https://huggingface.co/Systran'>https://huggingface.co/Systran</a></h4>")
gr.Markdown(f"<h4>{md_notice}</h4>")
with gr.Row():
input_record = gr.Audio(label="实时转录", sources=["microphone"], streaming=True)
upload_file = gr.File(label="上传音频或者视频")
with gr.Column():
beam_size_slider = gr.Slider(2, 10, step=1.0, value=beam_size, info="增加可提高识别率,也会牺牲性能", label="beam_size", interactive=True)
language_label_selector = gr.Dropdown(language_label, type="index", value=language_value, label="输出语言", interactive=True)
output_type_checkbox = gr.Checkbox(label="字幕格式", value=is_subtitles, interactive=True, info="实时转录无法使字幕格式")
beam_size_slider.change(settings_change, inputs=[beam_size_slider, language_label_selector, output_type_checkbox])
language_label_selector.change(settings_change, inputs=[beam_size_slider, language_label_selector, output_type_checkbox])
output_type_checkbox.change(settings_change, inputs=[beam_size_slider, language_label_selector, output_type_checkbox])
with gr.Row():
with gr.Column():
play_audio = gr.Audio(label="提取音频", type="filepath")
with gr.Row():
regen = gr.Button("重新转录", variant="primary")
output_text = gr.Textbox(label="转录结果", interactive=True)
summary_button = gr.Button("AI润色", variant="primary")
prompt_text = gr.Textbox(label="提示词", interactive=True, value=sys_prompt)
summary_output = gr.Textbox(label="AI 润色结果", interactive=True)
summary_button.click(ai_summary, inputs=output_text, outputs=summary_output)
prompt_text.change(sys_prompt_change, inputs=[prompt_text])
regen.click(re_transcribe, outputs=output_text)
upload_file.upload(file_uploaded, inputs=upload_file, outputs=[play_audio, output_text])
input_record.change(input_audio_change, inputs=input_record)
input_record.start_recording(start_recording, outputs=output_text)
input_record.stop_recording(stop_recording, outputs=play_audio)
iface.launch()
8. 总结
本项目实现了一个完整的语音转文字系统,利用了Whisper模型的强大能力并通过Gradio提供了易用的界面。我们还结合了AI进行润色和多语言支持,极大提升了语音识别的效果和易用性。
你可以在GitHub上找到完整的代码:Voice2Text项目。