|
本帖最后由 nanimarcus 于 2023-6-4 02:24 编辑
5 f# l9 t0 Y M1 O4 A, h
) h+ G+ N- p4 N5 p借着 chatGPT 这股热潮研究了一下 Whisper,学名叫 automatic speech recognition (ASR) ,就是转换声音到文字的。9 B7 \0 R6 W! m7 \3 v/ Y | N
效果我是很满意的,唯一不满的是速度,在六年前的主流显卡上基本上是一倍速,基本上只用在自己特别喜欢的媒体文件上了。
' T# q. D% P8 {% Z. k1 \3 K4 g----------------------------------------3 o9 w5 z) N: C/ d
显然不满意的不是我一个,活雷锋很快就出来了,名字很谦虚也很霸气 faster-whisper。1 X6 S2 @/ s- O1 h( k' G) e
在六年前主力显卡3G内存上,model small,能跑到12倍速,这个是相当满意了。0 y9 c5 m# q. J" [- f9 h
----------------------------------------+ i w4 z( [/ t4 Z- S
https://github.com/guillaumekln/faster-whisper( ^) i7 e/ Q) r5 w
安装如下:9 ]! W8 E6 _! h) n3 X
1, Windows 101 Q0 T9 B; f6 Q! r8 a
2, Python 3.10.11% Y0 ^: H6 d! {/ R, K$ \
3, CUDA 12.13 h6 k4 d. P) I' c
4, 在python 3 中安装
$ h) t8 y& A( [+ U2 c6 \. _pip install setuptools-rust torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu117
! O6 E# \4 u$ i2 J: U7 G) D这一步最后一个安装文件 cu117-cp310-cp310-win_amd64.whl 大小2343.6 MB,如果没显示,你得检查一下你的环境。% V+ j: }3 ~1 z3 ?. ~
5,pip install -U openai-whisper
4 K8 w4 L( g0 N1 J# Y这是向whisper 致敬,可以不装0 r4 ~0 _! ]9 r% d9 W
6,pip install faster-whisper. h2 _0 X4 w8 D
----------------------------------------
+ @+ g4 F5 M" v1 t1 P; ?& ?7 _9 bwhisper 我用的命令行,faster-whisper 我用的是python。' q4 ]+ ^! F$ X; p
下面给出了部分参考代码,根据主页上的参考代码我做了修改,但这个不是能运行的代码:+ A5 \7 r# q$ n9 H6 o2 P
6 w, z6 A! ~7 X; a, j2 H----------------------------------------0 z4 K! b& m5 f, D4 s+ k1 K
9 V0 s: X: a7 J* t9 s; p
from faster_whisper import WhisperModel% v5 s0 f7 Z; Q5 q5 Y" f0 {
* ?$ D# z% E& R1 [* m& @5 z0 Q
model_size = "small"* ?4 Q$ Z) q4 w5 o
% `1 f0 S1 }' `$ y' j/ g6 r
model = WhisperModel(model_size, device="cuda", compute_type="int8")) v4 Y% s) f x6 X/ U
% p4 U' O: M' j% z0 y& U
segments, info = model.transcribe(/ ?% s0 r6 p+ O
sourceFileName,
/ K6 Y( `; M- A+ I% I/ K5 { beam_size=5, + V# ]& g2 v: ]' {
language="en", 9 S( J5 c" A/ }+ |+ L
task="transcribe",
1 F* j0 W# V5 g P, W8 X word_timestamps=True,
, o, {4 l9 [$ q+ g. u4 V5 }1 F initial_prompt = "Hello, welcome to my lecture.")
8 i/ `% F6 Q9 F3 Q$ N5 V2 P3 O; c. }. c5 Z
for segment in segments:6 f( ]1 [% G& H+ F' b
print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))
, J$ z+ y+ ^, g3 o }2 e' c7 S6 Y p- f7 J3 H/ U, X( F
for word in segment.words:, l. f c+ ]) |0 b! {% ~8 y
0 K. w" h2 F/ D6 a( E
----------------------------------------
4 {( k q/ L9 b+ ?
$ _& a% @" I% |代码说明:2 ~8 n7 s$ P0 r) g* y r) t6 C: V9 {) [
1,model.transcribe 只是建立了模型,并没有运行,运行 是从 for segment in segments: 这一句开始的。2 @4 q3 b" T. g1 G$ c" H' V6 L& K
但是这一步很重要(废话),我的程序有时候会无征兆退出就是在这一步,没有任何错误信息,倒是Windows 侦测到,但也没给出有意义的信息。
+ r0 x9 v( ^" I' S6 {) S0 w0 [2,segment 本身是很粗糙的,做字幕勉强能用。
5 e& T& Z/ H3 J q% f; }- K5 P$ l# K3,word 才是真正的精确控制的,本身带时间轴,所以要做比较好的字幕,必须用到word。9 l H4 Q K# N& |) \- h
4,word 里面是包含标点符号的,也就是说标点符号不是独立的,是附着在前一个word中3 P, Z) N2 R7 z0 d% \6 h' a f
比如 "faster." 这个句号是和前一个单词 faster 放在同一个 word 里面的。5 ~' m( t6 Z' i
5,model.transcribe 中参数说明:1 N9 _! f$ Z( N9 s% O
你要是对 whisper 的参数有所了解的话,基本上这些参数就是对应whisper 的参数
7 R0 M. z. U6 l! T$ I. Q# Z其中- E0 a2 B N6 e8 ^
word_timestamps=True, / O) j+ @2 d! b% L6 w' F
保证了你能拿到 word,否则是拿不到的7 P2 A5 s: |3 f8 Q6 v5 V8 @
initial_prompt = "Hello, welcome to my lecture.")# g' k1 M" o5 M' d
保证能尽可能准确的断句 punctuation,但是不是决定性的。7 [& y! W: l% B, J. @, n2 M
其他参数可参考源文件:
3 g( P: G) ^1 ~https://github.com/guillaumekln/ ... isper/transcribe.py
, r, u8 G2 l9 m# w; H) _+ v2 @152 def transcribe(& S+ _* K6 a' `( Z
从源文件你可以看到是支持中文的句号断句的。8 M( h/ i) e( C' e* E3 J
# |& i! F( n+ G- C( S6,如果要尽可能准确的 punctuation,根本办法是用比较大的模型 medium,或者更大。; S; i4 j# T2 J! p% e
7,我自己观察一个小时之内可以保证断句准确,再长就很可能不行,所以我的办法是切割文件到一个小时,识别后再聚合,效果不错。% ?7 C: u' n- U3 _- a* N/ t- \3 M
8,faster-whisper 会上传一些信息,检测到不停的使用网络,曾经有一次代码出错就是访问网络,你要是有洁癖就把网络暂时给关了。
% o2 c- H5 N! o* `- |
& n8 Y; }7 S! g/ Z4 b0 D! M% z9 C& d
- _5 _# U* G6 w# L& p9 f
8 L1 ^3 {: ^, o) v8 g: A O. y3 X |
评分
-
查看全部评分
|