|
|
本帖最后由 nanimarcus 于 2023-6-4 02:24 编辑
9 H- N, i" g7 E x q$ O9 M9 n/ G8 U, L' d- l+ i9 F# c4 Q
借着 chatGPT 这股热潮研究了一下 Whisper,学名叫 automatic speech recognition (ASR) ,就是转换声音到文字的。1 ?: D n, a' P' a2 w+ J
效果我是很满意的,唯一不满的是速度,在六年前的主流显卡上基本上是一倍速,基本上只用在自己特别喜欢的媒体文件上了。
7 k: A Y( {/ e, o: y5 ~5 J----------------------------------------
% ?5 f1 h! d# |& r8 e N' n4 d显然不满意的不是我一个,活雷锋很快就出来了,名字很谦虚也很霸气 faster-whisper。
2 Y- L2 r# K+ h' g3 n9 h在六年前主力显卡3G内存上,model small,能跑到12倍速,这个是相当满意了。/ i7 ]9 m. \/ q8 [ ~8 k
----------------------------------------9 V7 l! y) p* r: O* U% a8 x
https://github.com/guillaumekln/faster-whisper
6 ~& y4 R* C' }8 T6 Z, ~* W安装如下:4 T! ^: U1 R) N4 }6 \# c: h
1, Windows 10
$ T; y" R& l+ P! G/ x! J2, Python 3.10.11
. z+ F+ l2 I8 v3 Y* E# Z3 ?: i9 e3, CUDA 12.1: k5 O" o4 u2 X2 j* h6 {6 q# T
4, 在python 3 中安装, k0 T5 _+ e3 ]$ S& b
pip install setuptools-rust torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu117
% [& Q& z/ E9 C& Y, M: O [4 ~这一步最后一个安装文件 cu117-cp310-cp310-win_amd64.whl 大小2343.6 MB,如果没显示,你得检查一下你的环境。3 ^% ~! }4 P( a6 @( _; n" }& U
5,pip install -U openai-whisper
+ p" S( S+ K; c! {8 N3 _6 b这是向whisper 致敬,可以不装, p! B2 a% }& n2 @( L
6,pip install faster-whisper
. f/ N6 T L% n! S----------------------------------------
0 p1 f$ t! s4 h8 n0 b1 Iwhisper 我用的命令行,faster-whisper 我用的是python。
4 B; z: I7 e7 I( i; w& j下面给出了部分参考代码,根据主页上的参考代码我做了修改,但这个不是能运行的代码:* M& b; N8 a3 C" S" ~
0 I- W3 F/ O2 U$ I----------------------------------------
& @; r3 [! y! g# \) C# I
# ]6 C3 H2 M* d6 h) R, p: `from faster_whisper import WhisperModel+ A2 P6 E1 P2 _( U5 K
7 P4 X. [. w5 i. Amodel_size = "small"$ j) `3 \; K- U$ u! ]$ n1 N
5 K7 r* z: J+ {8 V
model = WhisperModel(model_size, device="cuda", compute_type="int8")
" i& l2 K( m/ P: Y& v; P! f, r% S1 I& c6 _9 N# B/ k
segments, info = model.transcribe(
* @% V2 O$ d7 Z sourceFileName,
& @& Q% H3 P+ h9 W beam_size=5,
$ B7 `" t1 e+ I6 a3 t' A language="en",
# P: H% F5 K5 y( _ task="transcribe",
6 Y0 g) x1 D' J& v! O5 s word_timestamps=True, $ h& J1 E, s$ D8 I" X$ v: k
initial_prompt = "Hello, welcome to my lecture.")
i$ m4 D) R. ^) z8 c, s9 b- ]) |
8 @# f" G* o5 g* O4 r' u8 ?8 i$ a* Y- lfor segment in segments:1 _( D' b0 g; ~5 u$ B
print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))
4 B$ h5 d3 z3 x: C" u& z) h% k1 l: l3 c1 t6 t
for word in segment.words:; A% d. `: V2 M q
, b/ b& W9 [0 e5 _8 l4 S----------------------------------------
& }1 s, }( F- N* h! D" v4 ]/ Z8 s M; x: w5 K: f2 U% W, G4 E- O
代码说明:. n8 ?8 }: }/ m; p
1,model.transcribe 只是建立了模型,并没有运行,运行 是从 for segment in segments: 这一句开始的。
, w( u h8 U& K- k但是这一步很重要(废话),我的程序有时候会无征兆退出就是在这一步,没有任何错误信息,倒是Windows 侦测到,但也没给出有意义的信息。: Z% \! m. m2 D+ t5 d3 r
2,segment 本身是很粗糙的,做字幕勉强能用。% P4 u! a6 u3 a5 o$ I
3,word 才是真正的精确控制的,本身带时间轴,所以要做比较好的字幕,必须用到word。
$ a7 P' J+ i8 @0 U+ s0 D2 N4,word 里面是包含标点符号的,也就是说标点符号不是独立的,是附着在前一个word中
) b, _% C1 U" T5 k9 @比如 "faster." 这个句号是和前一个单词 faster 放在同一个 word 里面的。3 T$ b0 h/ `' K: c4 [- l, Q2 S
5,model.transcribe 中参数说明:/ H, ]# |* V% t M
你要是对 whisper 的参数有所了解的话,基本上这些参数就是对应whisper 的参数
0 n" l5 s3 h) x: f+ |: u其中2 u& c% Q3 P! W/ K! M! Z
word_timestamps=True,
" f/ D# D& {2 P. K( T/ F保证了你能拿到 word,否则是拿不到的; l0 V; g/ Y5 {# T2 m+ [2 T8 P) j
initial_prompt = "Hello, welcome to my lecture.")
( D- o5 e; m* F6 ] d保证能尽可能准确的断句 punctuation,但是不是决定性的。
3 C, ?2 n v( [, s其他参数可参考源文件:
( r0 S, c/ @4 z- dhttps://github.com/guillaumekln/ ... isper/transcribe.py
2 X5 \+ c. [2 m1 M152 def transcribe($ d% v; h2 f. \
从源文件你可以看到是支持中文的句号断句的。
2 f+ I) [8 L- c0 s- Y c" W" z0 k0 F1 q5 A
6,如果要尽可能准确的 punctuation,根本办法是用比较大的模型 medium,或者更大。2 G, i. \% t% N8 N9 Q
7,我自己观察一个小时之内可以保证断句准确,再长就很可能不行,所以我的办法是切割文件到一个小时,识别后再聚合,效果不错。 P' D7 w5 f0 u5 w- Z
8,faster-whisper 会上传一些信息,检测到不停的使用网络,曾经有一次代码出错就是访问网络,你要是有洁癖就把网络暂时给关了。! I7 l! d- [: z% ?
3 r3 y4 v4 u$ H! G
h( b4 |8 T, ^! D6 |% J
4 |' K8 F9 K& a; v& [, x1 W& ? |
评分
-
查看全部评分
|