|
|
本帖最后由 nanimarcus 于 2023-6-4 02:24 编辑
* D! w' h% s3 h |. \2 M# ]% a9 h2 @6 L
借着 chatGPT 这股热潮研究了一下 Whisper,学名叫 automatic speech recognition (ASR) ,就是转换声音到文字的。
. x. p4 h! e# L K5 j8 b. r效果我是很满意的,唯一不满的是速度,在六年前的主流显卡上基本上是一倍速,基本上只用在自己特别喜欢的媒体文件上了。
- @' m+ d. d i: {. j5 D----------------------------------------
! T0 \- M7 F7 A) ^8 t. j" h显然不满意的不是我一个,活雷锋很快就出来了,名字很谦虚也很霸气 faster-whisper。* |, W ~' ~- t$ V/ t4 V; w
在六年前主力显卡3G内存上,model small,能跑到12倍速,这个是相当满意了。$ j" k$ e0 j; h1 ?( p8 ?( F
----------------------------------------
% P: a2 x! [8 F8 fhttps://github.com/guillaumekln/faster-whisper
/ s9 }' o0 {( k4 P1 W7 L安装如下:) Z4 {! G3 m$ Z' o
1, Windows 10
0 x+ ^! Q) C6 w) u/ F+ _) q r2, Python 3.10.11' ^* t0 J- C, W4 h7 E5 |/ p
3, CUDA 12.1
/ W! J0 q# d; g3 y8 p; p8 v- n+ n4, 在python 3 中安装/ V% J- J+ [: [# t0 x
pip install setuptools-rust torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu117
& i6 I# `4 ?+ r/ s' R这一步最后一个安装文件 cu117-cp310-cp310-win_amd64.whl 大小2343.6 MB,如果没显示,你得检查一下你的环境。
4 h$ O- w# e$ D- Y9 ~ `. q# r5,pip install -U openai-whisper- W. ]5 F' V( L+ T% Y
这是向whisper 致敬,可以不装
" _9 v8 H* O9 b6,pip install faster-whisper
; N- c* z+ v- x----------------------------------------
( M7 n* x5 j* G: a% Qwhisper 我用的命令行,faster-whisper 我用的是python。7 p! {, K6 l. z. Y" P, m
下面给出了部分参考代码,根据主页上的参考代码我做了修改,但这个不是能运行的代码:8 t! C6 g( o* K; a/ j+ |4 k
: F- X+ }) L* `$ N" a4 X1 O* G, J
----------------------------------------! H) f ?/ y0 D+ F" l
! R' W( D* @! E4 O2 _4 x- ]& K! pfrom faster_whisper import WhisperModel1 n1 ^5 f( y" L" y( C
' U5 F2 P( X" H: b# I. G6 Wmodel_size = "small"
# d* r- b3 c" D# {5 ^# {; Q7 w" B8 _) E$ h7 Y9 s6 `# G
model = WhisperModel(model_size, device="cuda", compute_type="int8")' I7 j9 Y" E- U& ^7 G; x
- K# G5 U F0 R; u& B0 H
segments, info = model.transcribe(
9 P% j- m/ ~( Z7 }# ~( _+ Y! `* E sourceFileName,
8 e# R/ Z6 o) `+ P( P: I beam_size=5, 7 r- \: n# J3 p3 Q. \& X
language="en",
* q \9 A6 A: q0 ~6 a/ [. x task="transcribe",
: j0 H8 y% v% l# D- ^7 \. m word_timestamps=True, : B, Y( n7 ~" b6 x) g) ^
initial_prompt = "Hello, welcome to my lecture.")
; w: q4 q+ c% b$ \( D; m# N+ G. V: W4 Q( u: z1 x4 x
for segment in segments:
) ~; D$ _% Q- ~) Q print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))
: G& U/ k; d" s. @8 m7 X3 y& K* A+ p3 e2 n7 q- w5 p8 N, x9 q
for word in segment.words:
( i$ y) b9 N' K5 \) N 7 A7 m1 {! U9 g1 m5 i1 i e
----------------------------------------
5 E7 V& {. Q) A6 Z) y6 I2 Q
- x2 L1 X& b5 B, Z7 m4 t+ N代码说明:. g/ X5 C) z8 C5 ]4 ^
1,model.transcribe 只是建立了模型,并没有运行,运行 是从 for segment in segments: 这一句开始的。0 M8 w6 F5 m. k) X% j6 _9 m+ T
但是这一步很重要(废话),我的程序有时候会无征兆退出就是在这一步,没有任何错误信息,倒是Windows 侦测到,但也没给出有意义的信息。" r" k& W0 U, O3 Y( f5 s1 p
2,segment 本身是很粗糙的,做字幕勉强能用。
9 J6 y' ?5 v1 E& c- Z5 t# }3,word 才是真正的精确控制的,本身带时间轴,所以要做比较好的字幕,必须用到word。
3 ^/ r7 _/ P/ h# y1 s# B6 Q) o7 r3 n4,word 里面是包含标点符号的,也就是说标点符号不是独立的,是附着在前一个word中
% J2 F$ n9 M! \6 }9 T& o2 s+ k比如 "faster." 这个句号是和前一个单词 faster 放在同一个 word 里面的。( D$ Y- Q# V; U! Q1 f2 \' e
5,model.transcribe 中参数说明:- Y8 N6 S8 _! w! W- C/ x: f
你要是对 whisper 的参数有所了解的话,基本上这些参数就是对应whisper 的参数0 y% [+ H/ k- Q# S. k
其中
3 R2 ]7 z4 C& U2 H word_timestamps=True, 9 g1 f+ Q" M" e9 Q# x+ o0 T
保证了你能拿到 word,否则是拿不到的) m; x; t* O! H- _
initial_prompt = "Hello, welcome to my lecture.")8 W4 e1 b9 T+ u
保证能尽可能准确的断句 punctuation,但是不是决定性的。5 F$ C' _8 C6 W7 t- t! I% x( H' D
其他参数可参考源文件:
+ _/ T! _- B5 a; v v3 _https://github.com/guillaumekln/ ... isper/transcribe.py
- U0 U6 [+ D9 l0 ~# X5 V' }- d152 def transcribe() s4 b3 e7 o! z; y$ n) d; P+ r
从源文件你可以看到是支持中文的句号断句的。0 e& z4 t; D9 j. O3 \ H
" j/ X$ a/ _& g, u
6,如果要尽可能准确的 punctuation,根本办法是用比较大的模型 medium,或者更大。) _+ D o5 A* C8 a
7,我自己观察一个小时之内可以保证断句准确,再长就很可能不行,所以我的办法是切割文件到一个小时,识别后再聚合,效果不错。
8 z/ i, I/ s+ E- |# O8,faster-whisper 会上传一些信息,检测到不停的使用网络,曾经有一次代码出错就是访问网络,你要是有洁癖就把网络暂时给关了。+ y* u$ L1 |2 I1 Z4 m8 V/ M
! \+ B" D% C6 t* O6 X6 H) C
) ^$ c/ D& g( G( V: p X
+ t8 W$ {% c( L |
评分
-
查看全部评分
|