标题: faster-whisper 更快的语音到文字的识别 ASR [打印本页] 作者: nanimarcus 时间: 2023-6-4 02:10 标题: faster-whisper 更快的语音到文字的识别 ASR 本帖最后由 nanimarcus 于 2023-6-4 02:24 编辑 3 m) d! P" @# \+ `2 V ; P( q& n U8 E/ K借着 chatGPT 这股热潮研究了一下 Whisper,学名叫 automatic speech recognition (ASR) ,就是转换声音到文字的。 . h7 i- r8 w7 p6 H效果我是很满意的,唯一不满的是速度,在六年前的主流显卡上基本上是一倍速,基本上只用在自己特别喜欢的媒体文件上了。 : T: u% x- M, p; a5 o: E P5 N! r----------------------------------------9 y. I* }1 ^( g, j. _( X% W
显然不满意的不是我一个,活雷锋很快就出来了,名字很谦虚也很霸气 faster-whisper。! y4 \& K2 C: V
在六年前主力显卡3G内存上,model small,能跑到12倍速,这个是相当满意了。! j5 D. h$ L- @; r7 g
----------------------------------------% \( S# @! q9 [& \' V5 D- r8 g( u/ T https://github.com/guillaumekln/faster-whisper' R" f4 }+ T x9 p
安装如下:. E# j! b+ X% Z: F; e
1, Windows 10 a; ?3 Q7 ^' W) t3 T. q4 o% Z4 ?
2, Python 3.10.11$ v. p% @5 Q# \$ m% G Y4 m3 J8 l) j
3, CUDA 12.1 d2 m% q7 V$ p% O Z( q0 F
4, 在python 3 中安装( A' g, h W8 I% q
pip install setuptools-rust torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu117) f% _5 Z. N( w$ z$ J
这一步最后一个安装文件 cu117-cp310-cp310-win_amd64.whl 大小2343.6 MB,如果没显示,你得检查一下你的环境。7 c9 K2 Y% N0 A) z& C; g# y
5,pip install -U openai-whisper ! i% u* x: R3 u+ Q* Y$ O这是向whisper 致敬,可以不装* k2 m5 [2 S4 ^% l# ] L! ^0 }. [
6,pip install faster-whisper 2 e& z/ m, a) g# ]5 h----------------------------------------7 n; L) Q9 C1 v; Y# m9 R. E
whisper 我用的命令行,faster-whisper 我用的是python。 & n' _, {# v0 o$ \下面给出了部分参考代码,根据主页上的参考代码我做了修改,但这个不是能运行的代码:; q+ L z* p; E* c* W
. U* X% y- ~; ]; N# \$ ]
----------------------------------------) w: e+ D: s2 h5 O2 f8 ?& C
& D) N* w& y4 Afrom faster_whisper import WhisperModel" V8 J! _: L6 p8 Y0 t
8 E3 Q, i6 g. T
model_size = "small"/ I4 V4 @# K, l( N2 J
( V( R5 R6 ^$ A6 U: J+ p' J
model = WhisperModel(model_size, device="cuda", compute_type="int8") 7 \+ h- `5 K% W5 c9 S6 @6 V9 L( M: v% s7 [/ L
segments, info = model.transcribe( ; V/ D( B, C3 A0 M4 y& h sourceFileName, - M. E0 N! P6 F; Y$ N
beam_size=5, , ^' y* j* R2 G# p language="en", 6 e* T: |1 D/ m- d1 W task="transcribe", 1 Z1 Y; ^) t5 S O word_timestamps=True, 8 @' [- N% D1 g! C2 J, F' a- M initial_prompt = "Hello, welcome to my lecture.")8 ~) u( T4 x3 p8 w" {- C! A; x/ G
9 }6 g7 n) H- c. j! m" afor segment in segments:1 Z" g- ^, R/ I6 C
print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))3 d! \ _- G& V- G
; l# G5 d/ M9 v! Y8 Y for word in segment.words: 4 x4 L! I! H% J' R, }/ N' v, ? 0 F* w+ R+ P$ W _; R
----------------------------------------" w9 j7 c) \. B" A5 l
) g6 b$ o5 Y# Y9 I; r! v代码说明:0 `/ @; M% n4 _* v2 L
1,model.transcribe 只是建立了模型,并没有运行,运行 是从 for segment in segments: 这一句开始的。1 [0 l& A. B# |# C( z0 g0 _
但是这一步很重要(废话),我的程序有时候会无征兆退出就是在这一步,没有任何错误信息,倒是Windows 侦测到,但也没给出有意义的信息。. j0 I3 d# n* k' S w" ?
2,segment 本身是很粗糙的,做字幕勉强能用。8 }3 D1 U9 n- h" Y+ i
3,word 才是真正的精确控制的,本身带时间轴,所以要做比较好的字幕,必须用到word。8 c: ^' G' C" p
4,word 里面是包含标点符号的,也就是说标点符号不是独立的,是附着在前一个word中$ N0 @% K; g T T
比如 "faster." 这个句号是和前一个单词 faster 放在同一个 word 里面的。 : W+ H# A6 t9 r4 O5,model.transcribe 中参数说明: 1 q+ ?( i% F6 E! I! i2 _; n; ~, ]你要是对 whisper 的参数有所了解的话,基本上这些参数就是对应whisper 的参数 . n/ x. p3 |- Q9 b. d其中 8 g* G1 p- k) L0 _$ R: u5 G5 [ word_timestamps=True, 7 \) ]# V( C; k A' C
保证了你能拿到 word,否则是拿不到的! `8 P; K6 y) Q5 |0 A
initial_prompt = "Hello, welcome to my lecture.") & P& @* h+ |! F% ^) W保证能尽可能准确的断句 punctuation,但是不是决定性的。 + ^( e o8 h3 x$ z其他参数可参考源文件: 8 r+ v4 x6 a; `9 H% q0 I( d% B) Nhttps://github.com/guillaumekln/ ... isper/transcribe.py. ^( P7 J* Y5 H, f" ]# y) | Q
152 def transcribe( 3 d. x- y2 x. Z% k3 Y1 ~; N从源文件你可以看到是支持中文的句号断句的。 9 u q7 y Y" i+ p$ \. M + \" a' j; U2 N8 ]: y# R5 r6,如果要尽可能准确的 punctuation,根本办法是用比较大的模型 medium,或者更大。! H6 A) B+ \; e2 Z g: R A5 ~
7,我自己观察一个小时之内可以保证断句准确,再长就很可能不行,所以我的办法是切割文件到一个小时,识别后再聚合,效果不错。 4 \6 U; \" B1 o# S4 S8,faster-whisper 会上传一些信息,检测到不停的使用网络,曾经有一次代码出错就是访问网络,你要是有洁癖就把网络暂时给关了。 ; k5 e5 a# ~$ z0 j- {7 s& ^: L' w+ O3 c' ~4 W @
5 N& S+ m. w) Q
+ P' Q' ^ @1 ^2 @* Y7 ?* ~- P& d1 Y 作者: nanimarcus 时间: 2023-6-4 11:53
多谢各位榜爷打赏。