|
|
本帖最后由 nanimarcus 于 2023-6-4 02:24 编辑 5 M6 Y; A; v8 j7 y2 x2 c
! K3 ]) q: F5 F7 H: p& l
借着 chatGPT 这股热潮研究了一下 Whisper,学名叫 automatic speech recognition (ASR) ,就是转换声音到文字的。6 |9 c( T$ u5 [; K
效果我是很满意的,唯一不满的是速度,在六年前的主流显卡上基本上是一倍速,基本上只用在自己特别喜欢的媒体文件上了。8 s l8 r- G H, B* K: j, V5 K; O1 t3 X
----------------------------------------
2 }3 d& x9 x( u) v/ B: B1 w显然不满意的不是我一个,活雷锋很快就出来了,名字很谦虚也很霸气 faster-whisper。/ E, r) X/ k4 ]0 ~5 d Z
在六年前主力显卡3G内存上,model small,能跑到12倍速,这个是相当满意了。
8 S0 t. C6 b% F: \----------------------------------------
z1 V8 X: x) F3 c' A# S* C* |https://github.com/guillaumekln/faster-whisper+ e5 p- c, C% P$ P/ y+ p
安装如下:
* X: g( d U' K0 D3 x6 X2 x P1, Windows 10
6 s3 N8 ^5 h6 _# V$ f' \5 g% K2, Python 3.10.11
8 @& m+ ?( I9 M1 L5 S$ y5 M d3, CUDA 12.1. Z2 ]% ^. k$ Q9 Q6 x+ |
4, 在python 3 中安装8 U, w% z, I8 X Q; l
pip install setuptools-rust torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu1175 }' d) M5 \* D9 C
这一步最后一个安装文件 cu117-cp310-cp310-win_amd64.whl 大小2343.6 MB,如果没显示,你得检查一下你的环境。6 v6 D" G5 Z% u+ I* [. ^ b8 G
5,pip install -U openai-whisper
9 J1 t9 f7 h, O3 _0 N这是向whisper 致敬,可以不装
" R; f" p1 G% ^! P4 n; T, d6,pip install faster-whisper
0 b& ]7 q7 q x! V----------------------------------------
( }8 s' p; V! Z: F& o+ L( n# e) M5 zwhisper 我用的命令行,faster-whisper 我用的是python。
" Q$ r4 i! H( X下面给出了部分参考代码,根据主页上的参考代码我做了修改,但这个不是能运行的代码:3 W1 M* |1 P; A& A; c; c+ N, r
8 ~- o, G5 L+ C! I
---------------------------------------- G% S# [6 q" h6 h9 V, k; T
* x5 R! Y$ o. H6 y" Sfrom faster_whisper import WhisperModel
* ?: ?3 b4 {7 v
1 D6 `: r/ n5 k M9 ^+ wmodel_size = "small"( S& Z$ w+ _! l! G% s; z0 }
0 w, v& p( a. M( ^ u
model = WhisperModel(model_size, device="cuda", compute_type="int8")- _0 Y- H9 i6 e- r6 N; }
. R1 @' X: {% S! F# {
segments, info = model.transcribe(
2 \0 r* ^6 W9 [1 W5 H$ m sourceFileName,
/ l: i6 _) n6 M/ m( l beam_size=5, # s' m+ E2 j" ^
language="en", 1 R9 a5 \, Q1 M) c6 W
task="transcribe", $ Z6 u3 _4 i, A3 M% |& W
word_timestamps=True, + L( G+ V; z2 h
initial_prompt = "Hello, welcome to my lecture.")
- I$ {7 z. }: Z/ _% _" }, n: `9 o4 D, t
, Y* b& B. t# z6 efor segment in segments:) M2 L' U P8 S9 `) M
print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))
/ b* ^% V- h1 t+ k
; r, c& @' Z" b J2 M% N% }1 _) k% p* \ for word in segment.words:: _3 {9 h8 X% }: @/ N, V [
6 J" r: C7 G! g; c# G/ E0 k( ^4 Y----------------------------------------$ }* b' G7 [ W1 [( {6 y1 p
2 `- d1 e1 x' g6 H3 k代码说明:
2 c P2 C# _" W1,model.transcribe 只是建立了模型,并没有运行,运行 是从 for segment in segments: 这一句开始的。% ?" N9 j+ X3 F7 Q0 M' O6 U' I/ t
但是这一步很重要(废话),我的程序有时候会无征兆退出就是在这一步,没有任何错误信息,倒是Windows 侦测到,但也没给出有意义的信息。4 m1 D9 c" y7 b& b
2,segment 本身是很粗糙的,做字幕勉强能用。$ v2 R9 H1 c7 o' D
3,word 才是真正的精确控制的,本身带时间轴,所以要做比较好的字幕,必须用到word。
: r; `( L: A ^8 U4,word 里面是包含标点符号的,也就是说标点符号不是独立的,是附着在前一个word中0 p0 V( n! t% u" u. i: t+ B% V
比如 "faster." 这个句号是和前一个单词 faster 放在同一个 word 里面的。
# t& c- R6 P5 z4 E5 J5,model.transcribe 中参数说明:
1 C4 C& \# E7 m+ D( J" M4 ?你要是对 whisper 的参数有所了解的话,基本上这些参数就是对应whisper 的参数( v, Z% ]' _9 C& i- U c
其中. I" v) a8 D, a3 U
word_timestamps=True,
# x1 Q8 Q. t: K! Z: D' m保证了你能拿到 word,否则是拿不到的
4 V3 N9 ]1 S0 ^$ J6 b initial_prompt = "Hello, welcome to my lecture.")- ]6 c0 _9 z/ r: l1 d! b$ N
保证能尽可能准确的断句 punctuation,但是不是决定性的。& n8 w" Y* k3 N( }( Q0 ^1 @+ h
其他参数可参考源文件:
0 p/ x8 O' } b2 \https://github.com/guillaumekln/ ... isper/transcribe.py
* h# x, J U" X8 p9 L, s$ A+ H, o152 def transcribe(' |7 L$ h. q$ p9 ^5 j
从源文件你可以看到是支持中文的句号断句的。
4 S" K. A$ V& K! F: g& d; ^
6 |1 [7 @/ e! x' ^( O6,如果要尽可能准确的 punctuation,根本办法是用比较大的模型 medium,或者更大。
' [# A" }' M2 e+ W7,我自己观察一个小时之内可以保证断句准确,再长就很可能不行,所以我的办法是切割文件到一个小时,识别后再聚合,效果不错。% M$ |' ^% p9 s6 ^' b
8,faster-whisper 会上传一些信息,检测到不停的使用网络,曾经有一次代码出错就是访问网络,你要是有洁癖就把网络暂时给关了。
; {" z, s( ^ ~+ b, T" w1 @! N+ F: R5 t9 j V! v3 x3 {0 \$ @
1 }( d' ^6 {% T7 b( t
! v V/ ]# R) G0 t |
评分
-
查看全部评分
|