Contents

1-6:我与whisper打架到半夜

AI总结


# 起因

1. 最近我通过ChatGPT的iOS端语音输入功能,发现它的语音识别准确度非常高。

2. 我很想知道它为什么识别这么准确,经过了解,是ChatGPT使用了OpenAI的Whisper语音识别模型。

3. 于是我就在想,为什么不基于Whisper做一个语音输入法,尤其是在电脑端,一个人的时候说话识别会比打字快很多。

# 开始折腾

## 参考Wang老师的开源项目whisper_youtube

4. 我在Twitter上看到Wang老师分享了一个基于Whisper的语音转文字的开源项目whisper_youtube。

5. 看到这个项目后,我就萌生了在本地搭建Whisper的想法,虽然我的初衷是做语音输入法。

6. 我找到了Wang老师的这个项目源码,准备学习参考它来实现我的想法。

7. 在学习这个项目的过程中,我了解到它是基于Google Colab和Jupyter Notebook实现的。

8. 之前我不太熟悉Colab和Jupyter Notebook,通过学习知道Colab可以免费提供云端计算资源来运行Jupyter Notebook。

9. 刚开始我错误地选择了在本地运行Colab,导致初始化环境时C盘被占用了40GB空间。

10. 后来我意识到直接使用Colab提供的云端计算资源更简单,就放弃了本地运行的想法。

11. Wang老师的项目其实已经做得很完整,基本就是开箱即用,如果我一开始就更熟悉Colab的话,可能1分钟就可以运行这个项目。

12. 我只需要调整一些参数,就可以使用这个项目来进行语音转文字,甚至支持主流视频网站的链接。

## 语音输入法?

13. 但是Wang老师的项目还是不能直接作为我想要的语音输入法使用。

14. 于是我找了4个相关的语音输入法项目来试用。

15. 包括Emacs的语音输入法插件,whisper-typer-tool,Buzz和Const-me/Whisper等。

16. 经过试用发现,这些项目或多或少都存在一些问题,不能满足我对语音输入法的要求。

## faster whisper

17. 后来我发现了faster whisper这个对Whisper模型进行优化的项目。

18. 为了实现语音输入法,我决定尝试在本地配置faster whisper的运行环境。

19. 安装了需要的cuda, cudnn, ffmpeg等库文件。遇到一些报错也都解决了。

20. 最后成功让faster whisper可以在我的电脑上运行。

21. 编写了一小段代码对它的语音转文字功能进行了验证。

22. 之后一直试图实现实时转录的功能,但是效果不佳,存在很多问题没能很好解决。

# 有意思的发现

23. 在使用过程中,我发现当没有语音输入时,whisper也会输出一些“感谢观看”之类的文字。

24. 我猜测这可能来自whisper的训练数据集,它们使用了大量影视作品的音频和字幕进行无监督训练。

25. 这也验证了OpenAI采用无监督学习的方法训练whisper是可行的。

起因

最近这段时间,我经常通过 OpenAI iOS 端的 ChatGPT 的语音输入来识别文字,因为它的这个识别准确率超级高。我就在想,它为什么可以这么高呢?后来发现它这个是基于 OpenAI 的 Whisper 来做成的。我就想,为什么不能基于这个 Whisper 来做成一个输入法的类似的东西,来方便语音输入,尤其是电脑端。在一个人的时候,我觉得说话还是比打字要快很多的。

https://mayue-1312060474.cos.ap-chengdu.myqcloud.com/picgo/202307191516182.png

随着使用的频率增多,我越发觉得自己需要这样的程序,来便利我的生活,以前从来没有这么高精度的识别模型,现在我发现了whisper,我想要使用它。尽管这个过程并不完美。

开始折腾

https://mayue-1312060474.cos.ap-chengdu.myqcloud.com/picgo/202307191519118.png

王老师的开源项目whisper_youtube

先是看到这条tweet,自己萌生了本地搭建whisper的想法 https://github.com/lewangdev/faster-whisper-youtube

https://mayue-1312060474.cos.ap-chengdu.myqcloud.com/picgo/202307191520740.png

最终在这里开始行动,我也想要运行一个这样的项目出来,尽管我的初衷是本地语音识别,但是至少我可以通过这个先熟悉一下whisper。这里还需要我从新接触的还有colab和jupyter notebook,虽然此前知道是Python的,但是并没有使用过jupyter notebook,经过一定了解后,我意识到Collab是谷歌的Jupyter Notebook的托管平台。你可以在这里托管你的Jupyter Notebook,并且谷歌可以为你免费提供基础的硬件服务。你可以直接在云上使用并且运行Jupyter Notebook,而不需要占用你本地的硬件。而且谷歌虽然说是免费提供的硬件,但是这个免费的硬件也是很给力的。至少比我自己电脑的1660Ti显卡厉害了不少。 https://mayue-1312060474.cos.ap-chengdu.myqcloud.com/picgo/202307191525698.png

中途了解的时候,以为有很多问题需要解决,而且当时还不知道google会让你白嫖这么牛逼的硬件,所以我的第一反应是本地运行我的colab,当时在连接处点击了本地,而不是选择免费的云端硬件,说实话很不建议!我当时跟着教程,在本地安装docker,并且初始化docker命令的时候,为了创建colab的本地运行环境,就直接吃掉了我的40G的C盘,而且这还并没有进行后续的操作,本来电脑就配置一般般,就还是不要折腾这个了,老老实实用云端吧。 https://mayue-1312060474.cos.ap-chengdu.myqcloud.com/picgo/202307191528134.png

https://mayue-1312060474.cos.ap-chengdu.myqcloud.com/picgo/202307191526434.png

而王老师的这个项目本身已经足够完善,事实上,由于使用colab的服务,所以几乎是开箱即用,如果我一开始对colab熟悉的话,我应该能在1min内就跑出这个项目。

我们只需要调整一下自己需要的参数,即可识别我们的音频或者视频,包括一些主流媒体的视频链接。而这便是我观看一个AI制作PPT时实时生成字幕,让我快速观看的一个截图

https://mayue-1312060474.cos.ap-chengdu.myqcloud.com/picgo/202307191532488.png

语音输入法?

项目本身的确是跑得通了,但是并没有达到我的要求呀。我想要的是一个能够在电脑端作为语音输入的输入法,而且是基于Whisper运行出来的,这样才能达到我想要的精度。

所以我开始找语音输入法,在网上找到了四个项目,

  • 还有一个是emacs的语音输入法
  • 一个是https://github.com/dynamiccreator/whisper-typer-tool,
  • 一个是Buzz,
  • 一个是GitHub - Const-me/Whisper: High-performance GPGPU inference of OpenAI’s Whisper automatic speech recognition (ASR) model 我最初是先找到第一个,但是Emacs对于我来说是一个太过陌生的工具,很多地方我都不会使用。折腾了一会儿之后发现难度梯度太大,就直接放弃了。第二个是在桌面端直接运行的,用C编译的Whisper模型,可以直接在CPU上运行。识别的效果还不错,优点是可以GPU加速,但是它识别的时候不能把一些中文的字符给显示出来,所以我选择了一个可能速度更慢,但是字符相对全面的第三个Buzz。但是Buzz的缺点就是速度太慢了,实在是太慢了。 后面尝试第四个,受到GFW的影响,pip安装很受挫,最后我学会了在clash里为pip添加代理的方式,在设置里将指定协议打开即可不需要修改镜像源。 但是git+安装whisper官方库的时候一直报错,后面纠结了很久也实在没能力解决。

https://mayue-1312060474.cos.ap-chengdu.myqcloud.com/picgo/202307191542985.png

到这里本来就该结束了,我看到这样的一句话

https://mayue-1312060474.cos.ap-chengdu.myqcloud.com/picgo/202307191543739.png

faster whisper

对啊,还有一个faster whisper的项目,针对whisper做了很多加速处理,并且损失并不高,

https://github.com/guillaumekln/faster-whisper

这里我决定开始本地运行出这个项目,不管能否跑通,先满足运行环境 首先是需要安装cuda, cudnn, ffmpeg,

cuda我是本来就已经安装过了,11.2的版本,发现cudnn需要安装8.x的版本即可满足,于是我去下载安装了cudnn,cudnn的安装方式其实就是解压,然后把相应的包放进cuda文件夹下方。

在添加了cuda和ffmpeg的环境变量之后,一切似乎都准备就绪,但是实际上这里还出现了意外的报错

Could not load library cudnn_cnn_infer64_8.dll. Error code 126
Please make sure cudnn_cnn_infer64_8.dll is in your library path!

原来cudnn依赖于一个久远的库,我们需要添加库文件

Hi,

Sorry for the late reply,
这么晚才回复很抱歉,
Have you installed successfully zlib package ?
zlib包安装成功了吗?

3.1.3. Installing Zlib 68 3.1.3.安装 Zlib68
Zlib is a data compression software library that is needed by cuDNN.
Zlib是cuDNN所需的数据压缩软件库。

Procedure 程序
Download and extract the zlib package from ZLIB DLL 148. Users with a 32-bit machine should download the 32-bit ZLIB DLL 13.
从 ZLIB DLL148 下载并解压 zlib 包。拥有 32 位计算机的用户应下载 32 位 ZLIB DLL13。
Note: If using Chrome, the file may not automatically download. If this happens, right-click the link and choose Save link as…. Then, paste the URL into a browser window. If the above link doesn’t work please refer zlibwapi.dll free download | DLL‑files.com 45 or Download Zlibwapi.dll for Windows 10, 8.1, 8, 7, Vista and XP 49
注意:如果使用 Chrome,该文件可能不会自动下载。如果发生这种情况,请右键单击该链接并选择将链接另存为...。然后,将 URL 粘贴到浏览器窗口中。如果上面的链接不起作用,请参考zlibwapi.dll免费下载 | DLL‑files.com45 或下载 Zlibwapi.dll 适用于 Windows 10、8.1、8、7、Vista 和 XP49
Please download 64-bit or 32 bit based on your system.
请根据您的系统下载64位或32位。

Add the directory path of zlibwapi.dll to the environment variable PATH.
将zlibwapi.dll的目录路径添加到环境变量PATH中。
Please make sure zlib is added to the path.
请确保 zlib 已添加到路径中。
If you still face this error, please share with us nvidia-smi output and error logs .
如果您仍然遇到此错误,请与我们分享 nvidia-smi 输出和错误日志。

Thank you. 谢谢。

本来应该添加到库文件里,但是我下载的是64位,不确定该不该放到system32里,我就直接放在了上面所说的cuda里,然后就运行起来了, https://github.com/guillaumekln/faster-whisper 我是直接pip install了这个项目,然后直接新建了一个py文件作为测试,只是按照规则简单调用了这个项目,必须文件被我标记了

https://mayue-1312060474.cos.ap-chengdu.myqcloud.com/picgo/202307191553641.png

from faster_whisper import WhisperModel

from pydub import AudioSegment

  

audio = AudioSegment.from_file(".\\audio.m4a")

audio.export(".\\audio.wav", format="wav")

  
  

model_size = "large-v2"

  

# Run on GPU with FP16

model = WhisperModel(model_size, device="cuda", compute_type="float16")

  

# or run on GPU with INT8

# model = WhisperModel(model_size, device="cuda", compute_type="int8_float16")

# or run on CPU with INT8

# model = WhisperModel(model_size, device="cpu", compute_type="int8")

  

segments, info = model.transcribe(".\\audio.wav", beam_size=5)

  

print("Detected language '%s' with probability %f" % (info.language, info.language_probability))

  

for segment in segments:

    print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))

  

with open("output.txt", "w") as f:

    f.write("Detected language '%s' with probability %f\n" % (info.language, info.language_probability))

  

    for segment in segments:

        f.write("[%.2fs -> %.2fs] %s\n" % (segment.start, segment.end, segment.text))

这是我的test.py文件,它把当前目录下的M4A文件先转换成WAV文件,然后让Faster Whisper来转录为文字,并且输出到终端。(因为苹果录音我的默认格式是m4a)

跑通之后就该定制了

  • 运行脚本并按下F2键开始录制音频。
  • 说话较长时间以测试录音是否有时间限制。
  • 释放F2键以停止录制并将音频转换为MP3。
  • 验证转录内容是否已保存到文本文件并复制到剪贴板。
  • 按下F3键以测试实时转录,并验证转录内容是否在终端显示。 后面我一直和gpt4干架,因为跑通之后,我想要用来作为我的语音输入法,但是实际效果不如人意,要么到处都是bug,要么就是终于能运行的时候却不按照想要的方向来运行。实际上,把整个流程已经描述得很清楚了,也算是结结实实地体验了一把产品经理的痛苦。光是描述问题本身没什么重要的事,不知道对方是如何理解你的内容或者说他是如何理解的,他会用他的方法去完成他所理解的任务需求。

昨晚和GPT打架打到半夜,最后也只是简单地实现了,在按下F2的时候可以录音,在松手的时候停止录音,然后把这段录音拿去转换为文字,并且将转换的文字复制到剪贴板,并且把这个文字也一并输出到output.txt文件里面。然而,我想要的实时进步功能则是完全做不出来,做不出来。F2的功能它也有一个缺点,就是只能听前五秒的录音,在超过五秒之后它就不能识别了,好像是录音的长度被限制在了五秒。我目前不知道是什么原因导致的。我觉得我有必要在后面和GPT讨教一下,整个代码是如何写出来,然后自己学一下这方面的内容。希望能够把这个功能给做出来吧。如果做出来了,我会开源的,那将是我的第一个开源项目。

https://mayue-1312060474.cos.ap-chengdu.myqcloud.com/picgo/202307191603851.png

有意思的发现,算小彩蛋吗?

有时候在录音的时候我并没有输入任何的话,所以它的录音实际上相当于是没有声音的。没有声音的时候,Whisper也会输出信息。它输出的信息大多类似于某某字幕组感谢观看,致谢如何如何之类的话,然后还有“Thanks for watching"之类的话。我觉得这应该就是Whisper的训练数据集的来源。它可能使用了很多电影或电视剧的声音和字幕进行提取,然后分别进行训练学习。这样就是一个无监督学习的过程。这正好就是OpenAI他们所选择的无监督学习的道路,并且最终取得了很好的效果。感谢观看。


有意思的是上面那段话是我用whisper生成的,我并没有说“感谢观看”,我只是沉默了一会儿,这让我想到为什么很多用whisper的项目会裁切空白语音,一方面节省了运行时间,一方面避免了输出这样的无关内容。

网站logo更新:有点像月牙组成的小窝,上面的就是一夔

https://mayue-1312060474.cos.ap-chengdu.myqcloud.com/picgo/202307191619851.png

Flag Counter