|
|
本帖最后由 nanimarcus 于 2023-6-4 02:24 编辑
( D9 s4 V {: p6 o. `# Y) Y- V; v- ` Q' _# H
借着 chatGPT 这股热潮研究了一下 Whisper,学名叫 automatic speech recognition (ASR) ,就是转换声音到文字的。
1 n( b+ a/ d8 C0 Q w' H) r效果我是很满意的,唯一不满的是速度,在六年前的主流显卡上基本上是一倍速,基本上只用在自己特别喜欢的媒体文件上了。5 j$ w7 F7 t8 k5 j& f) \
----------------------------------------! g+ C, {% W; A1 `# l/ @6 D
显然不满意的不是我一个,活雷锋很快就出来了,名字很谦虚也很霸气 faster-whisper。
& K* f. p- `( I/ s在六年前主力显卡3G内存上,model small,能跑到12倍速,这个是相当满意了。
3 d) ?# t8 z' k- F----------------------------------------0 h0 I5 g' x. G
https://github.com/guillaumekln/faster-whisper6 A: J$ n; U% t* u" Y. P, ]
安装如下:
4 c6 l. O" v2 r/ A+ J( c1, Windows 10
) @' J) S. i" M1 w2, Python 3.10.113 R4 S# i- v0 d4 U1 p8 x
3, CUDA 12.1
! h+ T; F# \5 c% j$ l3 [% c4, 在python 3 中安装
" o3 N& d) d5 `3 spip install setuptools-rust torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu117
- p% y- h( J+ [, o% P这一步最后一个安装文件 cu117-cp310-cp310-win_amd64.whl 大小2343.6 MB,如果没显示,你得检查一下你的环境。+ L" o( s) _. ~& b5 l3 g
5,pip install -U openai-whisper8 C4 Q+ c" [' |# A, p
这是向whisper 致敬,可以不装
8 S; }, E5 o; \2 T7 u( G( E6,pip install faster-whisper
; a( a1 ~/ }& s: y% r0 ?! ]; b----------------------------------------3 l# g( ]9 S) c
whisper 我用的命令行,faster-whisper 我用的是python。
; U& N1 m& Q2 J下面给出了部分参考代码,根据主页上的参考代码我做了修改,但这个不是能运行的代码:
6 S4 m% m( ^" }% z: e; P1 Q9 P# Y! L0 I9 q
----------------------------------------0 d/ q+ ?% h* ^) S: ?0 R. ^
8 U) R; e) `1 [4 c( G" K1 `+ W B2 s' ~
from faster_whisper import WhisperModel3 `: t! D+ F+ m$ V- p9 K4 `) ^
' @+ p8 y: M l
model_size = "small"
- h l6 X9 c# l9 B/ U3 C8 [! o4 Y& S3 `* Z3 I
model = WhisperModel(model_size, device="cuda", compute_type="int8")
2 E# u! o" w; e2 {* o: S3 U- X, Q
* t& g* J6 c- x7 {! O2 b5 isegments, info = model.transcribe(( r3 W( ?& E: C& F8 {* b
sourceFileName, ' {* d6 S9 {" h* M# ]
beam_size=5,
$ {% `9 ?0 P; r E language="en",
1 e6 k' j5 j/ [" q6 j6 h ~ task="transcribe", 5 M, I- h! k5 [6 n
word_timestamps=True,
2 W3 z* e6 ]% F: E5 K/ L) d9 A' g: f* x initial_prompt = "Hello, welcome to my lecture.")
, k" x$ p5 R" L! q6 g3 @; A$ H( H: G+ E7 }( y
for segment in segments:8 \* h3 V% n. ]( L
print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))
3 V, ]& @0 f- g4 x- M( u; h1 |! R: f, Y G$ [
for word in segment.words:
; R& j5 U' c) p6 U/ Y7 Y % B _0 B0 x" `& ~! ?; S8 R+ z( Y
----------------------------------------
) W4 R. M( V' B; T& w: |; O. Z+ L% C3 k1 u; B! o$ Y+ P
代码说明:+ ^# v: d) ~) {4 m2 w
1,model.transcribe 只是建立了模型,并没有运行,运行 是从 for segment in segments: 这一句开始的。8 g0 F' H( G0 Z& @
但是这一步很重要(废话),我的程序有时候会无征兆退出就是在这一步,没有任何错误信息,倒是Windows 侦测到,但也没给出有意义的信息。
B- r W8 y/ X6 w2,segment 本身是很粗糙的,做字幕勉强能用。
8 c$ Q" u$ H: c2 c* q) G8 \3,word 才是真正的精确控制的,本身带时间轴,所以要做比较好的字幕,必须用到word。/ t7 d8 r; z% d4 c+ @4 x6 d# X! O
4,word 里面是包含标点符号的,也就是说标点符号不是独立的,是附着在前一个word中* W+ o' z. o3 W& b
比如 "faster." 这个句号是和前一个单词 faster 放在同一个 word 里面的。: O( F7 C. h; y, e! _* T! t
5,model.transcribe 中参数说明:
4 D s" J0 d/ T& x你要是对 whisper 的参数有所了解的话,基本上这些参数就是对应whisper 的参数- q. o) { X* s% }/ V8 L3 f- P
其中3 w/ Z6 m+ w: Z0 D8 ^' R
word_timestamps=True, 4 i* o2 v' N k& K# k2 Y
保证了你能拿到 word,否则是拿不到的/ ~& l/ ?5 w- r3 ^
initial_prompt = "Hello, welcome to my lecture.")0 D0 V8 O; z( ~* X
保证能尽可能准确的断句 punctuation,但是不是决定性的。0 K: B# a( D1 i/ x4 k
其他参数可参考源文件:! W- b# B, o u) f7 N" t2 s
https://github.com/guillaumekln/ ... isper/transcribe.py) y# d; [( m7 M/ n* |7 u
152 def transcribe( W# d0 B: S2 L9 p, f# ?4 P- F
从源文件你可以看到是支持中文的句号断句的。6 C, q- |+ x- ~: Q
. N" {$ ?2 v; g! c# N
6,如果要尽可能准确的 punctuation,根本办法是用比较大的模型 medium,或者更大。
/ [. b3 A. z6 p- z$ k* Y7,我自己观察一个小时之内可以保证断句准确,再长就很可能不行,所以我的办法是切割文件到一个小时,识别后再聚合,效果不错。6 j! f$ @3 M9 _& w
8,faster-whisper 会上传一些信息,检测到不停的使用网络,曾经有一次代码出错就是访问网络,你要是有洁癖就把网络暂时给关了。
, E" Q# V8 q9 H6 c: k, ^" M: G* a: @- k
0 i" O9 d; h2 ~, d; g* |- n! e
+ ]* f0 G( E6 Z* j u" D! E9 K y& ~ |
评分
-
查看全部评分
|