|
|
本帖最后由 nanimarcus 于 2023-6-4 02:24 编辑 2 y0 B# N# u; u9 y h% h
/ J% w5 V: Z" @3 Y' t; B1 \3 S借着 chatGPT 这股热潮研究了一下 Whisper,学名叫 automatic speech recognition (ASR) ,就是转换声音到文字的。
3 c4 h2 S: w6 `2 n6 ?, F; R效果我是很满意的,唯一不满的是速度,在六年前的主流显卡上基本上是一倍速,基本上只用在自己特别喜欢的媒体文件上了。
/ M2 t0 z/ R0 [! Z, g----------------------------------------: O z8 H& k5 m. W; s- O+ C. g. Z9 s
显然不满意的不是我一个,活雷锋很快就出来了,名字很谦虚也很霸气 faster-whisper。; u' c) @/ C- Y* ~4 Q, S- v" }
在六年前主力显卡3G内存上,model small,能跑到12倍速,这个是相当满意了。
3 M* G) o2 e q b+ t- B----------------------------------------
, t& \. ~% `. d5 Q8 |3 {6 h& `https://github.com/guillaumekln/faster-whisper; u) o. e, E, n9 b
安装如下:3 p7 t# k7 J* `2 [. P
1, Windows 10' z' W: E' s: c* K
2, Python 3.10.11
6 ?; f' X" A+ j% w: ?6 z$ D. a3, CUDA 12.1
& @- X0 l7 I0 n5 F {% b# B4, 在python 3 中安装
. i6 e' `# B% C; _( k$ U' _pip install setuptools-rust torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu1177 g+ p5 j5 J/ `5 C/ F, }
这一步最后一个安装文件 cu117-cp310-cp310-win_amd64.whl 大小2343.6 MB,如果没显示,你得检查一下你的环境。
; n7 N% t. M* X5,pip install -U openai-whisper' Z A, P" w7 X) J% g$ k8 @ F6 M
这是向whisper 致敬,可以不装, o) s3 d9 c {% h* S% e( P
6,pip install faster-whisper0 }6 o, i" N. `1 g* K2 z
----------------------------------------2 W! N: _+ V8 a) |0 `/ n
whisper 我用的命令行,faster-whisper 我用的是python。4 N% E, a" W/ b
下面给出了部分参考代码,根据主页上的参考代码我做了修改,但这个不是能运行的代码:
# ^ e; |- d" H, D% L, [# d# I$ j- K& ` O; ?0 r3 t! d
----------------------------------------
% b$ q6 G* C- ^9 K1 m. T
3 `8 Q/ T% \1 e7 ofrom faster_whisper import WhisperModel8 ^$ ^) A5 b+ x
! Z! N& ~' R) s6 k+ x2 ^model_size = "small"+ T8 ~. y9 T$ M! K! C
+ }$ K# x; z8 d2 M$ Mmodel = WhisperModel(model_size, device="cuda", compute_type="int8")) }: ^4 j+ ?/ @- w
. K% w7 q9 y+ nsegments, info = model.transcribe(
$ f$ {7 T* F9 s" l7 r& d; s [3 e sourceFileName,
( b2 F/ t' w! I8 ]- J9 _) B% P+ s beam_size=5,
2 \' U e; w9 M) R, `5 @+ T language="en", 5 I8 M* _* M& t& w# K
task="transcribe",
* F. G/ r/ A6 U5 W; K9 F word_timestamps=True,
# c4 ~' x2 z6 U initial_prompt = "Hello, welcome to my lecture.")9 Y7 s& H8 F9 A* p" j
9 Y! l9 B6 p- j( E, t, J
for segment in segments:
- P; [% Q% s7 `. e/ \ print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))
5 \; {8 }# }0 F0 B; h' f5 ~9 @* m% `% M
for word in segment.words:
5 k; n$ ~9 x( L" Z % _/ a2 w* l2 b; {6 _3 X3 y) s% W
----------------------------------------
' V8 S9 F8 m; y) K
" r1 o/ n. k$ u代码说明:% [" M7 W; b$ M! h
1,model.transcribe 只是建立了模型,并没有运行,运行 是从 for segment in segments: 这一句开始的。
6 L9 I3 U: j3 W2 c" m) |8 h但是这一步很重要(废话),我的程序有时候会无征兆退出就是在这一步,没有任何错误信息,倒是Windows 侦测到,但也没给出有意义的信息。! a: ]% h) m+ w; h
2,segment 本身是很粗糙的,做字幕勉强能用。
( G7 j* l( u! S# Y; Q$ r3,word 才是真正的精确控制的,本身带时间轴,所以要做比较好的字幕,必须用到word。, ^6 Y5 t# S+ T5 s+ B
4,word 里面是包含标点符号的,也就是说标点符号不是独立的,是附着在前一个word中) E# G% N) D$ M! W% {- _5 v. Z
比如 "faster." 这个句号是和前一个单词 faster 放在同一个 word 里面的。
9 h) u$ H+ U& W1 W( ^& \4 J5,model.transcribe 中参数说明:
& R- B2 x( D% B1 D2 A4 ]你要是对 whisper 的参数有所了解的话,基本上这些参数就是对应whisper 的参数
. u3 y4 G/ c, L$ I/ o2 D6 n其中2 p+ K% f9 p" J+ x/ m+ o
word_timestamps=True,
/ O i1 ?! N# P N/ \2 C保证了你能拿到 word,否则是拿不到的
! G2 j% e0 [2 e7 o3 | initial_prompt = "Hello, welcome to my lecture.")
0 t9 m' P. m. O! U" J保证能尽可能准确的断句 punctuation,但是不是决定性的。2 d) S6 |7 D* a
其他参数可参考源文件:; r. R9 e' d) e
https://github.com/guillaumekln/ ... isper/transcribe.py
' U5 a* s& z7 y) p4 J; J4 D152 def transcribe(
- \; h: q) |1 f' L1 E- a, ^从源文件你可以看到是支持中文的句号断句的。
7 U6 u; x1 e" [8 C! Q2 B( t! G2 D( h. g% n
6,如果要尽可能准确的 punctuation,根本办法是用比较大的模型 medium,或者更大。
; ^$ q, u9 E8 \) u0 N3 X7,我自己观察一个小时之内可以保证断句准确,再长就很可能不行,所以我的办法是切割文件到一个小时,识别后再聚合,效果不错。7 T& Z, i2 [! i
8,faster-whisper 会上传一些信息,检测到不停的使用网络,曾经有一次代码出错就是访问网络,你要是有洁癖就把网络暂时给关了。, ~+ v" L1 P2 a. n
% T" @0 O3 G M0 Y0 H8 Y. w% g* V6 E
) l% [3 Y5 O1 w* A! T+ J+ T8 h
" K- ^7 q! z5 j. _( s- p# C |
评分
-
查看全部评分
|