一、前言
在前面一篇文章《Whisper与ChatGPT联手,轻松实现音频转录文本总结》给大家介绍过如何使用OpenAI的在线API接口和开源的离线Whisper模型做语音转录文本,以及对于转录后的文本内容基于GPT模型进行摘要总结。 主要应用于对音频或视频做文本转录、视频或音频摘要总结、以及视频字幕翻译等场景。 甚至对于实时视频会议转录也是支持的。
实际上当时留了个悬念,本来也有计划再写一篇后续来接着第一篇深入实践,对于长语音分割方面的问题,有位粉丝朋友当天就提出了自己的一些建议,希望对原来的案例进行优化,那今天就接着说说一些优化思路吧。

看得出来,这位朋友确实对于语音这块有过实践,认真思考过,上一篇我们采取的是根据时间间隔来对语音进行分片切割的方案,这个方案其实存在一定的缺陷。我们在将长音频分片进行转录的过程里,是完全按照精确的时间去切割音频文件的。但是实际上音频的断句其实并不在那一毫秒。所以转录的时候,效果也不一定好,特别是在录音的开头和结尾部分,很有可能不是一个完整的句子,也容易出现一些错漏的情况。
二、解决思路
针对长音频文件提供两种分片切割方案,第一种在前面一篇文章中已经介绍,今天重点来介绍第二种方案,顺便结合GPT模型对转录的文本做翻译。
-
将音频文件按固定时间间隔分割成块,并使用Whisper API进行语音识别转录
-
将音频文件根据静音部分分割成块,并使用Whisper API进行语音识别转录
除了以上两种针对开源Whisper模型自己实现的方案外,也有一些比较成熟的商用解决方案,大家可以根据自己的需求进行选择,这里介绍两款产品,可以非常方便的支持可视化流程配置的方式实现LLMs的集成应用。
- Gglot(https://app.gglot.com/register?ref=DYQjn57U)
Gglot 一款非常简单易用的音频和视频转录解决方案,只需要选择音频或视频文件然后指定要翻译的语言即可,也支持Youtube视频直接转录,不过源视频或者音频的质量太差可能效果不好太好。

- Shipyard(https://www.shipyardapp.com/)
Shipyard 设计为一流的工作流程自动化平台,提供了许多开箱即用的功能,可以帮助数据团队比以往更快地投入生产。团队可以在不到 5 分钟的时间内启动、监控、扩展和共享业务解决方案,而无需接触基础设施。用Shipyard只需要不到5分钟即可完成Youtube视频转录翻译的功能。

三、开发实践
接下来,开始对于第二种解决方案音频文件根据静音部分分割成块的方案进行具体的编码实践。
由于OpenAI 限制了 Whisper 一次只能转录25MB大小的文件,因此我们需要将大的播客文件分割成小的片段,转录完后再将它们拼接起来。我们可以使用OpenAI在官方文档中提供的PyDub库来分割文件。
3.1、安装依赖
- 首先确保安装了PyDub库。
%pip install pydub
- 使用开源模型,需安装 openai-whisper 的相关的依赖包。
%pip install openai-whisper
%pip install setuptools-rust
- 如需要翻译则需要安装 `openai` 的相关的依赖包。
!pip install openai --upgrade -q
3.2、音频切割(固定间隔)
我们先来回顾一下采用固定时间间隔进行拼音切割,然后使用Whisper进行转录的一个实际效果。
import os
import whisper
from pydub import AudioSegment
from pydub.silence import split_on_silence
model = whisper.load_model("large")
# 使用Whisper本地进行音频转录
def transcribe_audio_whisper(path):
result = model.transcribe(path)
text = result['text']
return text
# 将音频文件按固定时间间隔分割成块,并使用Whisper API进行语音识别的函数
def get_large_audio_transcription_fixed_interval_whisper(path, minutes=5):
sound = AudioSegment.from_file(path)
chunk_length_ms = int(1000 * 60 * minutes)
chunks = [sound[i:i + chunk_length_ms] for i in range(0, len(sound), chunk_length_ms)]
folder_name = "audio-fixed-chunks"
if not os.path.isdir(folder_name):
os.mkdir(folder_name)
whole_text = ""
for i, audio_chunk in enumerate(chunks, start=1):
chunk_filename = os.path.join(folder_name, f"chunk{i}.mp3")
audio_chunk.export(chunk_filename, format="mp3")
try:
text = transcribe_audio_whisper(chunk_filename)
except Exception as e:
print(
2874



被折叠的 条评论
为什么被折叠?



