|
|
本帖最后由 nanimarcus 于 2023-6-4 02:24 编辑 9 v* N2 h6 i; ^8 J1 ^
7 r5 y; _. b- q7 h8 v R% v5 b3 v+ d& n9 u
借着 chatGPT 这股热潮研究了一下 Whisper,学名叫 automatic speech recognition (ASR) ,就是转换声音到文字的。
8 C! L/ ?- t1 L! N1 r* c- `' \效果我是很满意的,唯一不满的是速度,在六年前的主流显卡上基本上是一倍速,基本上只用在自己特别喜欢的媒体文件上了。
5 N, v3 d; o- j8 K; T" A* F----------------------------------------
0 v5 @2 N' A2 D. o- Z显然不满意的不是我一个,活雷锋很快就出来了,名字很谦虚也很霸气 faster-whisper。7 E7 T2 p& f8 n( x* b
在六年前主力显卡3G内存上,model small,能跑到12倍速,这个是相当满意了。# I3 `. a# C# Z9 {" T# d
----------------------------------------
! j; M8 J1 ?% g! B3 ?- N8 @https://github.com/guillaumekln/faster-whisper
0 U8 f, X4 f' {: i2 J4 I安装如下:
: n# H9 j9 J6 Y/ j+ y9 a. l2 w& ~1, Windows 10# M( W4 x$ ]$ v: p1 ^4 y4 x& R
2, Python 3.10.113 z6 j/ Q, j0 }. s( f
3, CUDA 12.17 U$ a2 V" x/ M% R3 J
4, 在python 3 中安装. |- ?0 K" a; J* F% I
pip install setuptools-rust torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu117
$ z. C* r5 _2 [( M' o& X1 k这一步最后一个安装文件 cu117-cp310-cp310-win_amd64.whl 大小2343.6 MB,如果没显示,你得检查一下你的环境。 a# m! Z! ^9 G4 O: [ x& J* B N
5,pip install -U openai-whisper( q9 \5 M0 i2 j; T u2 t
这是向whisper 致敬,可以不装$ h# G: j$ Z* o2 u4 Q! `8 q
6,pip install faster-whisper- X; Y' |! A- s/ O, k1 H' ], I5 U
----------------------------------------( G) g1 `! \4 y
whisper 我用的命令行,faster-whisper 我用的是python。+ d0 x# b9 W! l5 p
下面给出了部分参考代码,根据主页上的参考代码我做了修改,但这个不是能运行的代码:; g- r6 R: e& @$ g: g
/ C8 e# p: A6 v6 K6 |
----------------------------------------7 ~1 m! w7 ]# v1 i$ f; b
3 d N% K0 _% ^6 {3 Z, f+ ^
from faster_whisper import WhisperModel
2 q m b) t. E% c2 ], K# q! k, W, C g$ M
model_size = "small"
8 i, m7 a: p8 a; v j' X4 X' J5 J; g: s
model = WhisperModel(model_size, device="cuda", compute_type="int8")
) F0 r/ n- a, A" X) y( z3 o: i C6 N* w$ D9 C) e! E- b2 M
segments, info = model.transcribe(4 T/ i- }3 z2 a) b; t* ?5 \: u
sourceFileName,
# e; S5 |* G0 `" M0 U beam_size=5, % v% n: H8 z7 R
language="en", 7 Z# X, o$ |6 F& F: n
task="transcribe", # N6 |8 v/ R2 h- Y; Z3 I# E
word_timestamps=True,
8 c$ C+ D/ `( p) _& k6 [* } initial_prompt = "Hello, welcome to my lecture.")
! g$ }8 ?. |; S4 R( ?9 `, |( g- b) e5 a9 c
for segment in segments:
. }* L/ A& w/ l W* I$ w print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))
) f1 ^; @. P: X/ P5 _4 t5 k+ Z+ q/ I3 ~% H; z& D, ?' g# X
for word in segment.words:7 ^, s1 {) I# _. d; P& j2 K
# B" m* w/ S T: `7 ?
----------------------------------------
+ _: e+ k) p1 G) }3 {- P" } W& p
代码说明:9 D+ p5 d X$ t o9 \; A
1,model.transcribe 只是建立了模型,并没有运行,运行 是从 for segment in segments: 这一句开始的。9 l1 T" n" C$ N: `9 w" D, q
但是这一步很重要(废话),我的程序有时候会无征兆退出就是在这一步,没有任何错误信息,倒是Windows 侦测到,但也没给出有意义的信息。
2 d! ^' Z7 f1 X3 _2,segment 本身是很粗糙的,做字幕勉强能用。
; R0 k4 ^; h. \/ E' {3 a3,word 才是真正的精确控制的,本身带时间轴,所以要做比较好的字幕,必须用到word。+ {" f* ?6 a- J2 Z: J
4,word 里面是包含标点符号的,也就是说标点符号不是独立的,是附着在前一个word中
! j0 u. Y7 Z8 Z比如 "faster." 这个句号是和前一个单词 faster 放在同一个 word 里面的。( G+ M2 |! I5 Q8 U+ x5 G* I5 d* i
5,model.transcribe 中参数说明:, R" m- |) s; m9 y t8 [7 g
你要是对 whisper 的参数有所了解的话,基本上这些参数就是对应whisper 的参数
, m* |5 t! l( a$ k其中+ O8 @* N& x6 d: _9 q* E0 {
word_timestamps=True,
, x; P1 i7 X0 S0 _8 b保证了你能拿到 word,否则是拿不到的
1 i- s8 }: B6 @ W. y; } initial_prompt = "Hello, welcome to my lecture.")- j0 s/ N1 F5 T
保证能尽可能准确的断句 punctuation,但是不是决定性的。
?; o( x5 b Y. P$ b3 z; t9 `其他参数可参考源文件:/ Y5 f) P! h: J K
https://github.com/guillaumekln/ ... isper/transcribe.py
3 ^9 u7 ^ [2 p7 e6 W152 def transcribe(+ D1 Z0 F; h' p: D; ^
从源文件你可以看到是支持中文的句号断句的。. f* b7 @7 Y9 E0 C/ ^) d" p
; i2 ?! W# A3 ?" |% `6,如果要尽可能准确的 punctuation,根本办法是用比较大的模型 medium,或者更大。
! H: `, @# \/ T9 [" t- V- N7,我自己观察一个小时之内可以保证断句准确,再长就很可能不行,所以我的办法是切割文件到一个小时,识别后再聚合,效果不错。
+ U; F: c9 [3 L4 X* O8,faster-whisper 会上传一些信息,检测到不停的使用网络,曾经有一次代码出错就是访问网络,你要是有洁癖就把网络暂时给关了。& o H) K% o: o& T& i' ~1 H% Z% q- W$ J
1 X4 Z) Q& C$ s' Y# D
0 T1 [% z, G9 q6 M6 A" b: x* j
9 R2 w& L8 e& k( U) a+ [- b: v
|
评分
-
查看全部评分
|