|
|
本帖最后由 nanimarcus 于 2023-6-4 02:24 编辑
3 ]5 a+ O. \ X W5 I
& U- {7 u( e9 l' q* P借着 chatGPT 这股热潮研究了一下 Whisper,学名叫 automatic speech recognition (ASR) ,就是转换声音到文字的。8 ?3 j9 c7 \" _; G3 g8 ]
效果我是很满意的,唯一不满的是速度,在六年前的主流显卡上基本上是一倍速,基本上只用在自己特别喜欢的媒体文件上了。* x0 B" }: q ]% z
----------------------------------------9 e# G2 ~" N: U i3 H* |
显然不满意的不是我一个,活雷锋很快就出来了,名字很谦虚也很霸气 faster-whisper。1 g6 L2 S5 m, c* z
在六年前主力显卡3G内存上,model small,能跑到12倍速,这个是相当满意了。# B! b* w* X1 V. O6 P
----------------------------------------
' j& W+ T" i/ |, n0 [4 h% \https://github.com/guillaumekln/faster-whisper
4 V, ]7 J2 r9 N/ r( _安装如下:) U# y9 s1 h& r) Q9 v9 C4 B' ?( z9 V
1, Windows 10
, R4 _' D- m+ }$ k$ a1 R2, Python 3.10.11; U* `5 \0 T& a! D: @3 f! d
3, CUDA 12.18 _* v; |: G' r3 t
4, 在python 3 中安装
/ Y5 }+ ?, }1 W( ipip install setuptools-rust torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu117
@9 v" a9 U+ ?3 S这一步最后一个安装文件 cu117-cp310-cp310-win_amd64.whl 大小2343.6 MB,如果没显示,你得检查一下你的环境。% @6 X# n* c5 G
5,pip install -U openai-whisper
! z4 p6 z# H7 Y( K这是向whisper 致敬,可以不装
9 ^6 Z) e; b S& R+ i" B6,pip install faster-whisper
/ l i2 F" k! o----------------------------------------; k7 I7 Q# i. Q7 y$ g
whisper 我用的命令行,faster-whisper 我用的是python。
1 |9 g5 t6 h" B5 I3 Z7 X下面给出了部分参考代码,根据主页上的参考代码我做了修改,但这个不是能运行的代码:( k" t: T1 `3 \
: M8 e D& k! C5 x& F----------------------------------------
7 d9 \- {5 c, ?" G" F" G- A
: a2 n3 o, Z9 B. D) Y6 Cfrom faster_whisper import WhisperModel$ `7 G m& i- i3 L9 h
; s1 K! Y+ |) F7 A7 J+ @7 U
model_size = "small"% R& K& N. O* |3 X
+ ]/ g' m1 r) B: |) u
model = WhisperModel(model_size, device="cuda", compute_type="int8")& {8 n( j5 {. E$ q4 F& V* L
, u& W( y7 e a, I
segments, info = model.transcribe(( |: J! D' L' ~3 p/ t# K8 b4 X& n
sourceFileName,
1 B0 x1 D- Y" `- m7 [ beam_size=5,
& U2 a' V. }: m5 d language="en", # ~" v8 ^& n8 }* h+ T
task="transcribe", ( G2 v6 a# G& ]; d$ }+ }4 a, T
word_timestamps=True, % _/ r2 N1 [9 ~( @1 @, s7 Q- O1 D
initial_prompt = "Hello, welcome to my lecture.")
! {- i7 }/ ]* P; Z& S) c6 n4 l4 c2 I7 j* R1 G/ [
for segment in segments: A, N- }& ]) C; P+ t
print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))
1 }. o6 _+ s1 ^, [5 {% E$ E+ Q c% S( n3 r7 v; `
for word in segment.words:
. H+ U' y/ F1 _6 _; R) A. p( ^ 4 q9 ]. s2 ~$ ^. s+ K
----------------------------------------" o# O0 I7 {; H7 m" y( {
* y1 H' ]/ W. `
代码说明:" x* Y& ]0 g* y6 Z4 s
1,model.transcribe 只是建立了模型,并没有运行,运行 是从 for segment in segments: 这一句开始的。
# Z2 ~8 }9 u9 K; E$ E0 z. \1 r. L4 T+ o但是这一步很重要(废话),我的程序有时候会无征兆退出就是在这一步,没有任何错误信息,倒是Windows 侦测到,但也没给出有意义的信息。" g( D/ Z7 d) b( L! v
2,segment 本身是很粗糙的,做字幕勉强能用。
+ `, O# c O0 S- B( ?# t. r- E3,word 才是真正的精确控制的,本身带时间轴,所以要做比较好的字幕,必须用到word。* ]& ?. J3 ~" J
4,word 里面是包含标点符号的,也就是说标点符号不是独立的,是附着在前一个word中/ \1 ^' V9 }( v! a0 S- j- e
比如 "faster." 这个句号是和前一个单词 faster 放在同一个 word 里面的。# ], a, A0 [$ r0 q6 E
5,model.transcribe 中参数说明:' }6 {" u3 `$ f5 t3 z
你要是对 whisper 的参数有所了解的话,基本上这些参数就是对应whisper 的参数' H' e; p* I$ Q D
其中! B" {0 S' t8 v. G; A
word_timestamps=True,
, [6 z' R+ J- m) n保证了你能拿到 word,否则是拿不到的+ V+ v9 } `! Z, h! |! f
initial_prompt = "Hello, welcome to my lecture.")
. I0 W B" i1 p& d* Z3 N保证能尽可能准确的断句 punctuation,但是不是决定性的。
; S) O1 A& Q8 v) F其他参数可参考源文件:
. `8 f* Y7 I# {" ^& Ghttps://github.com/guillaumekln/ ... isper/transcribe.py& K5 K+ f) R+ D4 |+ d* ~ s+ K
152 def transcribe(
8 c6 a- g. u a- l从源文件你可以看到是支持中文的句号断句的。( s$ e* k: `( L3 D
+ E. o7 b6 x5 Q3 S c8 ]7 l, V
6,如果要尽可能准确的 punctuation,根本办法是用比较大的模型 medium,或者更大。
5 l, n& q3 ^, @9 d" t- v. `+ ~, \7,我自己观察一个小时之内可以保证断句准确,再长就很可能不行,所以我的办法是切割文件到一个小时,识别后再聚合,效果不错。1 t5 [% `8 R# W2 i4 p X# a
8,faster-whisper 会上传一些信息,检测到不停的使用网络,曾经有一次代码出错就是访问网络,你要是有洁癖就把网络暂时给关了。
3 u. g, k$ \" o& q0 D2 ~; G
- A" U( K; F( W! a3 {3 i% H! H. {6 h % t- _5 o- k* d( ^; U; E& Z' l/ E
( n1 q6 ~! |0 e" h |
评分
-
查看全部评分
|