文章目录
- 前言
- 一、准备
- 二、使用Whisper进行语音转文字
- 三.Whisper转换结果分析
- 总结
前言
语音转文字在许多不同领域都有着广泛的应用。以下是一些例子:
1.字幕制作:语音转文字可以帮助视频制作者快速制作字幕,这在影视行业和网络视频领域非常重要。通过使用语音转文字工具,字幕制作者可以更快地生成字幕,从而缩短制作时间,节省人工成本,并提高制作效率。
2.法律文书:在法律领域,语音转文字可以帮助律师和律所将听证会、辩论和其他法律活动的录音转化为文字文档。这些文档可以用于研究、起草文件和法律分析等目的,从而提高工作效率。
3.医疗文档:医疗专业人员可以使用语音转文字技术来记录病人的医疗记录、手术记录和其他相关信息。这可以减少错误和遗漏,提高记录的准确性和完整性,为患者提供更好的医疗服务。
4.市场调查和分析:语音转文字可以帮助企业快速收集和分析消费者反馈、电话调查和市场研究结果等数据。这可以帮助企业更好地了解其目标受众和市场趋势,从而制定更有效的营销策略和商业计划。
总之,语音转文字技术在许多不同的行业和场景中都有着广泛的应用,可以提高工作效率、减少成本和错误,并为企业和个人带来更多商业价值。
语音转文字是一项重要的技术,但市场上大部分语音转文字工具存在诸多问题,效果非常差。如果你需要高效而准确的语音转文字解决方案,你应该考虑使用Whisper。
可以看到,即便是语速这么快的情况下,Whisper 依然实现了近乎完美的转换。
在接下来的教程中,我们将介绍如何使用Whisper来轻松地完成语音转文字任务。
一、准备
开始之前,你要确保Python和pip已经成功安装在电脑上,如果没有,可以访问这篇文章:超详细Python安装指南 进行安装。
(可选1) 如果你用Python的目的是数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手—Anaconda,它内置了Python和pip.
(可选2) 此外,推荐大家用VSCode编辑器,它有许多的优点:Python 编程的最好搭档—VSCode 详细指南。
请选择以下任一种方式输入命令安装依赖:
- Windows 环境 打开 Cmd (开始-运行-CMD)。
- MacOS 环境 打开 Terminal (command+空格输入Terminal)。
- 如果你用的是 VSCode编辑器 或 Pycharm,可以直接使用界面下方的Terminal.
pip install openai-whisper
此外你还需要安装ffmpeg。
安装ffmpeg
Windows:
- 进入 http://ffmpeg.org/download.html#build-windows,点击 windows 对应的图标,进入下载界面点击 download 下载按钮,
- 解压下载好的zip文件到指定目录
- 将解压后的文件目录中 bin 目录(包含 ffmpeg.exe )添加进 path 环境变量中
- DOS 命令行输入 ffmpeg -version, 出现以下界面说明安装完成:
Mac (打开终端(Terminal), 用 homebrew 安装):
brew install ffmpeg --with-libvorbis --with-sdl2 --with-theora
Linux:
apt-get install ffmpeg libavcodec-extra
二、使用Whisper进行语音转文字
简单的使用例子:
import whisper
whisper_model = whisper.load_model("large")
result = whisper_model.transcribe(r"C:\Users\win10\Downloads\test.wav")
print(", ".join([i["text"] for i in result["segments"] if i is not None]))
首先,我们建议使用Whisper的large-v2模型。根据我的实测结果,这个模型的表现非常优秀,它可以识别多种语言,包括中文,而且中文识别效果非常出色。在某些文字转换的场景中,它的表现甚至优于腾讯云、阿里云。
如果你无法下载到模型,可以用我们的模型镜像下载地址:https://pythondict.com/download/openai-whisper-large-v2/
使用前将模型文件放到指定位置:
Windows: C:\Users\你的用户名.cache\whisper/large-v2.pt
Linux/MacOS: ~/.cache/whisper/large-v2.pt
然后重新运行程序即可得到转换结果。比如我们转换下面这个音频:
效果如下:
# 公众号:Python实用宝典
# 转载请附带注释
import whisper
whisper_model = whisper.load_model("large")
result = whisper_model.transcribe(r"C:\Users\win10\Downloads\test.wav")
print(", ".join([i["text"] for i in result["segments"] if i is not None]))
# 我赢了啊你说你看到没有没有这样没有减息啊我们后面是降息, 你不要去博这个东西, 我真是害怕你啊, 你不要去博不确定性, 是不是不确定性是我
三.Whisper转换结果分析
代码如下(示例):
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
Whisper的生成结果是一个字典:
{'text': '我赢了啊你说你看到没有没有这样没有减息啊我们后面是降息你不要去博这个东西我真是害怕你啊你不要去博不确定性是不是不确定性是我们的敌人听到没有朋友们好吧来朋友们你们的预约点好了啊朋友们你们的预约一定要给我点好了吧晚上八点钟是准时开播的朋友们关注点好了我们盘中视频见啊朋友们大家再见', 'segments': [{'id': 0, 'seek': 0, 'start': 0.0, 'end': 4.8, 'text': '我赢了啊你说你看到没有没有这样没有减息啊我们后面是降息', 'tokens': [50364, 1654, 5266, 95, 2289, 4905, 42405, 16529, 4511, 17944, 17944, 21209, 17944, 6336, 237, 26460, 4905, 15003, 13547, 8833, 1541, 47421, 26460, 50604], 'temperature': 0.0, 'avg_logprob': -0.2088493855794271, 'compression_ratio': 1.649402390438247, 'no_speech_prob': 0.5881261825561523}, {'id': 1, 'seek': 0, 'start': 4.8, 'end': 6.7, 'text': '你不要去博这个东西', 'tokens': [50604, 2166, 11962, 6734, 5322, 248, 15368, 38409, 16220, 50699], 'temperature': 0.0, 'avg_logprob': -0.2088493855794271, 'compression_ratio': 1.649402390438247, 'no_speech_prob': 0.5881261825561523}, {'id': 2, 'seek': 0, 'start': 6.7, 'end': 8.2, 'text': '我真是害怕你啊', 'tokens': [50699, 1654, 6303, 1541, 14694, 21164, 2166, 4905, 50774], 'temperature': 0.0, 'avg_logprob': -0.2088493855794271, 'compression_ratio': 1.649402390438247, 'no_speech_prob': 0.5881261825561523}, {'id': 3, 'seek': 0, 'start': 8.2, 'end': 10.9, 'text': '你不要去博不确定性', 'tokens': [50774, 2166, 11962, 6734, 5322, 248, 1960, 38114, 106, 12088, 21686, 50909], 'temperature': 0.0, 'avg_logprob': -0.2088493855794271, 'compression_ratio': 1.649402390438247, 'no_speech_prob': 0.5881261825561523}, {'id': 4, 'seek': 0, 'start': 10.9, 'end': 13.200000000000001, 'text': '是不是不确定性是我们的敌人', 'tokens': [50909, 23034, 1960, 38114, 106, 12088, 21686, 1541, 15003, 1546, 7017, 234, 4035, 51024], 'temperature': 0.0, 'avg_logprob': -0.2088493855794271, 'compression_ratio': 1.649402390438247, 'no_speech_prob': 0.5881261825561523}, {'id': 5, 'seek': 0, 'start': 13.200000000000001, 'end': 14.4, 'text': '听到没有朋友们', 'tokens': [51024, 31022, 4511, 17944, 19828, 9497, 51084], 'temperature': 0.0, 'avg_logprob': -0.2088493855794271, 'compression_ratio': 1.649402390438247, 'no_speech_prob': 0.5881261825561523}, {'id': 6, 'seek': 0, 'start': 14.4, 'end': 15.1, 'text': '好吧', 'tokens': [51084, 40221, 51119], 'temperature': 0.0, 'avg_logprob': -0.2088493855794271, 'compression_ratio': 1.649402390438247, 'no_speech_prob': 0.5881261825561523}, {'id': 7, 'seek': 0, 'start': 15.1, 'end': 15.6, 'text': '来朋友们', 'tokens': [51119, 6912, 19828, 9497, 51144], 'temperature': 0.0, 'avg_logprob': -0.2088493855794271, 'compression_ratio': 1.649402390438247, 'no_speech_prob': 0.5881261825561523}, {'id': 8, 'seek': 0, 'start': 15.6, 'end': 17.0, 'text': '你们的预约点好了啊', 'tokens': [51144, 29806, 1546, 12501, 226, 16853, 99, 12579, 12621, 4905, 51214], 'temperature': 0.0, 'avg_logprob': -0.2088493855794271, 'compression_ratio': 1.649402390438247, 'no_speech_prob': 0.5881261825561523}, {'id': 9, 'seek': 0, 'start': 17.0, 'end': 17.3, 'text': '朋友们', 'tokens': [51214, 19828, 9497, 51229], 'temperature': 0.0, 'avg_logprob': -0.2088493855794271, 'compression_ratio': 1.649402390438247, 'no_speech_prob': 0.5881261825561523}, {'id': 10, 'seek': 0, 'start': 17.3, 'end': 18.900000000000002, 'text': '你们的预约一定要给我点好了吧', 'tokens': [51229, 29806, 1546, 12501, 226, 16853, 99, 48161, 49076, 12579, 12621, 6062, 51309], 'temperature': 0.0, 'avg_logprob': -0.2088493855794271, 'compression_ratio': 1.649402390438247, 'no_speech_prob': 0.5881261825561523}, {'id': 11, 'seek': 0, 'start': 18.900000000000002, 'end': 21.0, 'text': '晚上八点钟是准时开播的', 'tokens': [51309, 50157, 33453, 12579, 50064, 1541, 6336, 228, 15729, 18937, 49993, 1546, 51414], 'temperature': 0.0, 'avg_logprob': -0.2088493855794271, 'compression_ratio': 1.649402390438247, 'no_speech_prob': 0.5881261825561523}, {'id': 12, 'seek': 0, 'start': 21.0, 'end': 22.6, 'text': '朋友们关注点好了', 'tokens': [51414, 19828, 9497, 28053, 26432, 12579, 12621, 51494], 'temperature': 0.0, 'avg_logprob': -0.2088493855794271, 'compression_ratio': 1.649402390438247, 'no_speech_prob': 0.5881261825561523}, {'id': 13, 'seek': 0, 'start': 22.6, 'end': 24.1, 'text': '我们盘中视频见啊', 'tokens': [51494, 15003, 5419, 246, 5975, 40656, 39752, 23813, 4905, 51569], 'temperature': 0.0, 'avg_logprob': -0.2088493855794271, 'compression_ratio': 1.649402390438247, 'no_speech_prob': 0.5881261825561523}, {'id': 14, 'seek': 0, 'start': 24.1, 'end': 25.400000000000002, 'text': '朋友们大家再见', 'tokens': [51569, 19828, 9497, 6868, 44176, 51634], 'temperature': 0.0, 'avg_logprob': -0.2088493855794271, 'compression_ratio': 1.649402390438247, 'no_speech_prob': 0.5881261825561523}], 'language': 'zh'}
text参数是没有做任何分词处理的纯语音原文本。
我们要重点关注的是segments参数。segments参数对音频内人物语言做了"分段"操作,比如这一段话:
{
'id': 1,
'seek': 0,
'start': 4.8,
'end': 6.7,
'text': '你不要去博这个东西',
'tokens': [50604, 2166, 11962, 6734, 5322, 248, 15368, 38409, 16220, 50699],
'temperature': 0.0,
'avg_logprob': -0.2088493855794271,
'compression_ratio': 1.649402390438247,
'no_speech_prob': 0.5881261825561523
}
它就相当于人一样,去一帧帧校对每个词说话的时间:start是起始时间,end是结束时间。即"你不要去博这个东西"发生在音频的4.8秒到6.7秒之间。其他参数:
temperature 是指在语音转文本模型生成结果时,控制输出随机性和多样性的参数。
avg_logprob参数是语音转文字模型预测的置信度评分的平均值。
compression_ratio参数是指音频信号压缩的比率。
no_speech_prob参数是指模型在某段时间内检测到没有语音信号的概率。
重点在于如何应用。start和end参数你可以用来直接生成视频的字幕。大大提高生产效率。
置信度参数你可以用来提高识别准确率,如果说置信度一直不高,可以单独拎出来人工优化。
总之,Whisper的Large-v2模型绝对是目前中文语音转文字的顶级存在,有兴趣的朋友赶紧试试吧。
模型镜像下载地址:https://pythondict.com/download/openai-whisper-large-v2/
如果你存在算力计算或使用上的困难,也可以私信联系我帮你处理。
总结
我们的文章到此就结束啦,如果你喜欢今天的Python 实战教程,请持续关注Python徐浪老师大讲堂!