|
|
本帖最后由 nanimarcus 于 2023-6-4 02:24 编辑 7 u2 M, c$ w! t( p( N
* n% n: {7 | ]4 I借着 chatGPT 这股热潮研究了一下 Whisper,学名叫 automatic speech recognition (ASR) ,就是转换声音到文字的。
) \7 y# y9 \6 [# @6 D$ G4 e5 K& M; E效果我是很满意的,唯一不满的是速度,在六年前的主流显卡上基本上是一倍速,基本上只用在自己特别喜欢的媒体文件上了。+ Z; V& c& s! E: b
----------------------------------------; O0 _: w* c4 Z; Q8 @# B
显然不满意的不是我一个,活雷锋很快就出来了,名字很谦虚也很霸气 faster-whisper。, @6 G8 [8 V" r1 J6 r% t
在六年前主力显卡3G内存上,model small,能跑到12倍速,这个是相当满意了。
/ A9 x& ]4 C* W! u, }& G----------------------------------------
- f) C9 v: W7 J' R2 ?. dhttps://github.com/guillaumekln/faster-whisper5 ]5 ^/ g4 y! f/ l2 y2 _
安装如下:
1 _8 W8 H6 E9 U/ S9 k% F5 D- j f1, Windows 10
. g& p9 N/ D: r5 K) W2, Python 3.10.11
" I. A) ~, y! E9 D- K3, CUDA 12.1
7 r7 J6 Y4 V% w) x4, 在python 3 中安装
( ^, R1 D2 E( U& Cpip install setuptools-rust torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu117
/ X' h ]- ]" D+ X+ }* g) h这一步最后一个安装文件 cu117-cp310-cp310-win_amd64.whl 大小2343.6 MB,如果没显示,你得检查一下你的环境。6 X3 u; w! u$ M
5,pip install -U openai-whisper! B0 t/ B! ]4 o
这是向whisper 致敬,可以不装
" `; b+ n+ s2 i$ d6,pip install faster-whisper; S/ |2 z8 }5 z S0 w M: W
----------------------------------------
: h6 k3 v3 W( Qwhisper 我用的命令行,faster-whisper 我用的是python。/ A7 \6 P2 l4 C2 m4 Q7 [ T6 S+ H
下面给出了部分参考代码,根据主页上的参考代码我做了修改,但这个不是能运行的代码:
+ _, G" r3 h" [% y. q' i
+ Q) P- n, F" \----------------------------------------
( ]5 `, E; M1 b. K0 {8 T0 }
' A0 d1 }+ c3 }* P6 vfrom faster_whisper import WhisperModel! S1 u9 ?3 \& _7 B
* G5 d2 w9 y* }0 s( D0 x) wmodel_size = "small"
1 l, D% I$ O1 ]0 {4 c3 l0 j
3 w9 W+ }4 u3 R) T$ Ymodel = WhisperModel(model_size, device="cuda", compute_type="int8")
; j# K: l, ~4 W1 V
) K' c3 |* A, m0 e% Lsegments, info = model.transcribe(
% J1 c- H- [1 d$ C: y0 C* A/ l sourceFileName, + g" r) L% N# N. F& n% h! `: l& \, w
beam_size=5, / Z- t+ T% D |- D v
language="en", 9 K* ^* f) _" j) d G1 N
task="transcribe",
" B1 J7 n3 Q4 p; O% V word_timestamps=True,
2 k6 g. R" ~: k% ?7 G) ^3 M. ] initial_prompt = "Hello, welcome to my lecture.")# ]7 b1 V5 m* b. i! C
7 v' F$ K; l! C8 Xfor segment in segments:* h; R5 y+ t' h F
print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text)); c: K! V/ H- W* L) ^& Y9 E' l
/ ^* T1 r5 T/ f1 |5 g
for word in segment.words:
4 ~, |9 M6 k5 ~. ? % r/ Y( |1 v( y1 Y/ N7 d* y( B& l
----------------------------------------. l0 m2 h+ E5 p& k7 R k
/ J" B; {" p! O# ]( \9 V* x
代码说明:
! h4 g5 |: s% ~" `1,model.transcribe 只是建立了模型,并没有运行,运行 是从 for segment in segments: 这一句开始的。
+ x4 _5 m6 p& d) R但是这一步很重要(废话),我的程序有时候会无征兆退出就是在这一步,没有任何错误信息,倒是Windows 侦测到,但也没给出有意义的信息。
8 X% S8 ]6 D7 [3 g! Y' J+ Z+ C( I2,segment 本身是很粗糙的,做字幕勉强能用。; ^5 r# H+ z; x3 B) D4 J8 ?, f% ^
3,word 才是真正的精确控制的,本身带时间轴,所以要做比较好的字幕,必须用到word。
% V U; b# R; i; m4,word 里面是包含标点符号的,也就是说标点符号不是独立的,是附着在前一个word中
' ~' H3 ~9 T+ q1 K7 M比如 "faster." 这个句号是和前一个单词 faster 放在同一个 word 里面的。
. L4 Q% \8 R! f7 U0 \/ C5,model.transcribe 中参数说明:' p: O: @0 ]) G
你要是对 whisper 的参数有所了解的话,基本上这些参数就是对应whisper 的参数; o5 D( I& F- Q' m
其中8 E1 X, G; U; q% y8 l1 A, J9 Q; Y
word_timestamps=True, % v$ _% \4 `, _5 j$ y$ B2 O
保证了你能拿到 word,否则是拿不到的
$ K( C' T. _/ |) \! x: h! o5 z4 | initial_prompt = "Hello, welcome to my lecture.")% m7 g5 _; Y0 U! M4 m
保证能尽可能准确的断句 punctuation,但是不是决定性的。* C( D' k" j6 w" [( y
其他参数可参考源文件:
( [8 i# T3 `1 t% _. Uhttps://github.com/guillaumekln/ ... isper/transcribe.py7 t; R) S4 }1 ~& U6 m+ m
152 def transcribe(
) h) u: C# S& t从源文件你可以看到是支持中文的句号断句的。* x/ S C+ y) P' N
$ E# b) H+ ~* G$ R, r5 V6,如果要尽可能准确的 punctuation,根本办法是用比较大的模型 medium,或者更大。5 o0 r/ j7 o" ]( _% T
7,我自己观察一个小时之内可以保证断句准确,再长就很可能不行,所以我的办法是切割文件到一个小时,识别后再聚合,效果不错。
; N) j/ t2 _) L( `: ?! ]0 d8,faster-whisper 会上传一些信息,检测到不停的使用网络,曾经有一次代码出错就是访问网络,你要是有洁癖就把网络暂时给关了。
& G2 l. U. ]- |, i5 a8 B) K8 F0 r5 k' X1 ?: z- b
( i7 @2 h! Z0 B' v
7 H4 {2 i V- f$ s" ~; r |
评分
-
查看全部评分
|