Mac M1 Pro 安装 Whisper 并启用 MPS

news/2025/3/23 0:26:27/文章来源:https://www.cnblogs.com/seliote/p/18787377

背景

需要长语音转文字,十几个音频差不多七小时,网上基本都是付费的而且价格比较贵,看了一圈没合适的,自己 M1 Pro 上搭个 Whisper 并启用 MPS 试一下看看快不快。

安装

整体参考 OpenAI GitHub Whisper。不过需要注意 PyTorch v1.12 才开始支持 MPS,但是官方文档说是在 v1.10.1 上进行训练和测试的,所以需要高两个小版本才行,看文档说正常情况下也是支持的。

安装 ffmpeg: brew install ffmpeg
Conda 创建 Python 环境:conda 查找一下 Pyhton 版本 conda search python,创建一个 3.10 的环境 conda create -n whisper python=3.10.14,进入新创建的环境 conda activate whisper,确认是否为 arm64 环境 python -c "import platform; print(platform.uname()[4])"
安装 PyTorch v1.13.1:pip install torch1.13.1 torchvision0.14.1 torchaudio0.13.1,测试是否支持 MPS python -c "import torch;print(torch.backends.mps.is_built())"
安装 Whisper 及其依赖:pip install -U openai-whisper、pip install setuptools-rust
Numpy 版本与依赖不一致,需降级:pip install numpy
1.26.4
测试

需要较高准确性及中文支持,所以使用 large-v3 的模型:whisper ./audio/-1.m4a --language Chinese --model large
然而实际并没有用到 GPU,默认还是在用 CPU 跑,非常慢,不到两分钟的音频跑了六分多钟
加上 --device mps 参数直接报错了,后来发现了这个 震惊!Whisper 并不像宣传的支持 MPS!,M1 Pro 直接被抛弃,M2 还逆向优化
安装 v2

换这个项目吧 ggerganov GitHub Whisper.Cpp,这么多 star 也说明是够牛逼的
clone 项目:git clone https://github.com/ggerganov/whisper.cpp.git code
下载模型:cd code && bash ./models/download-ggml-model.sh large-v3
编译:make large-v3
测试 v2

Whisper.cpp 只支持 16-bit WAV 文件,所以需要预先使用 ffmpge 进行转码:ffmpeg -i ./audio/1.m4a -ar 16000 -ac 1 -c:a pcm_s16le 1.wav
跑一下,要指定语言:./main -m models/ggml-large-v3.bin -l Chinese -f 1.wav
同样一段音频,翻译下来 46 秒,可以接受
成品批量处理
import os
import shutil
import subprocess
from pathlib import Path

source_audio_dir = './source_audio'
output_txt_dir = './output_txt/'

tmp_audio_dir = './tmp/'

whisper_main = '/Users/seliote/Projects/whisper/output/main'
whisper_model = '/Users/seliote/Projects/whisper/output/models/large-v3.bin'

def clean_cache():
shutil.rmtree(tmp_audio_dir, ignore_errors=True)
shutil.rmtree(output_txt_dir, ignore_errors=True)
Path(tmp_audio_dir).mkdir(parents=True, exist_ok=True)
Path(output_txt_dir).mkdir(parents=True, exist_ok=True)

def find_source_audio_file(source_dir):
for root, _, files in os.walk(source_dir):
for filename in files:
if filename.startswith('.'):
continue
yield os.path.join(root, filename)

def cvt_2_wav(source_file, wav_file):
execute_shell('ffmpeg', '-i', source_file, '-ar', '16000', '-ac', '1', '-c:a', 'pcm_s16le', wav_file)

def wav_2_txt(wav, txt):
txt_content = execute_shell(whisper_main, '-m', whisper_model, '-l', 'Chinese', '-f', wav)
with open(txt, 'w') as f:
f.write(str(txt_content))

def execute_shell(*args):
return subprocess.check_output(list(args), encoding='utf-8')

if name == 'main':
clean_cache()
for source_audio_file in find_source_audio_file(source_audio_dir):
wav_file = Path(os.path.join(tmp_audio_dir, os.path.basename(source_audio_file)))
wav_file = wav_file.with_suffix('.wav')
cvt_2_wav(str(source_audio_file), str(wav_file))
txt_file = Path(os.path.join(output_txt_dir, os.path.basename(wav_file)))
txt_file = txt_file.with_suffix('.txt')
wav_2_txt(str(wav_file), str(txt_file))
Bug

一共七小时左右的多文件长音频,一共跑了三小时二十分钟,有个 bug,中间一段翻译不出来之后,后续就会一直卡在那句话上 ,但这个是 Whisper 的问题,和 Whisper.cpp 无关。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/903706.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

集美大学课程实验报告-实验3:栈、队列与递归

集美大学课程实验报告-实验3:栈、队列与递归项目名称 内容课程名称 数据结构班级 网安2413指导教师 郑如滨学生姓名 林沁茹学号 202421336067实验项目名称 实验3:栈、队列与递归上机实践日期上机实践时间 2学时一、目的(本次实验所涉及并要求掌握的知识点) 以下内容请根据实…

2025-03-22 闲话

2025-03-22 闲话有些闲话是纪实的,它们可能只是平淡的文字。它们可能没有感受,不带思考。你看不到装饰,只有琐碎、补也补不到自圆其说的细节。柴米油盐大抵是这样的。 来北京独居后的生活着实安逸。每天执行一个蛮正常的作息,保证三顿饮食、偶尔晚上和网友去搓搓夜宵。睡觉…

3.22 三重积分计算方法

三重积分的实际意义:计算一个立体的质量(可以) 1 投影法(先一后二)(一个土豆切成土豆丝,最后再累加Dxy平面) 一个立体图形可以看成是两个曲面拼接而成,z=(x,y)可表示一个曲面假设x和y都是确定的,然后就累加z,最后再算面积分 先假设有一条竖线,注意竖线是从哪里进入…

15.数组

数组C 语言支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合。 数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量。数组中的特定元素可以通过索引访问,第一个索引值为 0。声明数组在 C 中要声明一个数组,需要指定元素的类型和元素的数量 下…

逆向中简单的shellcode

做题时遇到了,简单记录一下 一,介绍: shellcode分为广义和狭义,狭义指的仅仅是通过命令行shell攻击靶机,并取得控制权的代码,广义的指能完成类似任务的代码,通常是汇编/机器码。 不过这里是RE,不是PWN,所以不会有靶机,那么在下文指的是广义的shellcode,注入程序,控…

linux一些好用命令:w,fuer,getfacl,usermod,chmod

一.命令 w w 是显示用户登录时间、空闲时间、当前执行的命令等。 2.示例 pst/* : 这是ssh登录 tty: 这是直接本地登录(ctrl+alt +F* 都可以) 这个是没本地登录显示的进程 二. 命令 fuser fuser 是一个可以查看使用此文件的进程号。 1.一般使用 fuser -a /path/to/filename…

Aligning the Objective of LLM-based Program Repair 论文笔记

介绍 (1) 发表 2025-02 ICSE24 (2) 挑战当前方法的推理目标与 LLM 的训练目标没有对齐。现有 LLM-based 方法通常采用 MLM 的方式预测修复代码(然而尽管模型参数被增大百倍但修复结果甚至没有翻一番,这与其他任务的明确可伸缩性形成对比)。因此本文假设在训练中 <masked,…

监狱智能视频分析告警系统解决方案

监狱智能视频分析告警系统解决方案能够精准监测到静坐不动、离床、攀高、独处等行为。例如,当一名囚犯长时间静坐不动时,监狱智能视频分析告警系统解决方案会自动识别并发出预警,以便管理人员及时了解情况,防止囚犯出现自伤、自残等危险行为。在洗手间场景中,系统对入厕超…

昆明理工大学最新《现代材料测试技术》复试真题及答案

-材料测试 昆工材料物理与化学、材料学、材料表征与分析、材料工程、F001现代材料测试技术、864材料科学基础、昆明理工大学材料调剂

RTT 全志D1s跑tina linux

刚毕业那会抽奖抽了一块RTT的D1S开发板,看了一下打印log就放下吃灰了。跑RT-thread的感觉折腾起来太麻烦了就让他吃灰了。最近手头有一块屏幕和一个2欧的小喇叭打算驱动一下。 正好这块板子也出来好多年了。玩一玩。首先我找到了百问网的哪吒开发板他也是D1S的,直接把他的SDK…

COMSOL 基础学习笔记

设置网格 软件通过计算网格顶点的数值,推算其他位置的数值。 行函数:移动的波。 二次行函数(除网格顶点外还计算两定点连线中心的值):网格最大长度 \(≤\frac{λ}{6}\) 一次行函数:网格最大长度 \(≤\frac{λ}{12}\) 修改方式:

NSSCTF ROUND#28 Ciallo~(∠・ω )⌒☆ WriteUp

WriteUp 题目信息 来源:NSSCTF 名称:ROUND#28 Ciallo~(∠・ω )⌒☆ 分类:Reverse 描述:无题目链接: https://www.nssctf.cn/contest/732/解题思路 首先使用DIE对文件进行查壳,发现这是一个无壳的64位exe文件。于是使用64位IDA对文件进行反汇编,得到伪代码如下:先一步步…