|
|
本帖最后由 nanimarcus 于 2023-6-4 02:24 编辑 3 g$ \+ c3 L' d8 h8 }! z* ~$ G& `, h: _5 o& U
" r& O! e6 b( c2 e
借着 chatGPT 这股热潮研究了一下 Whisper,学名叫 automatic speech recognition (ASR) ,就是转换声音到文字的。
2 \$ O( ?* b. u$ {% `$ a. R效果我是很满意的,唯一不满的是速度,在六年前的主流显卡上基本上是一倍速,基本上只用在自己特别喜欢的媒体文件上了。
( z* k) X4 \. A A: S( T& s0 L3 v% h----------------------------------------
$ m( G9 J4 F- c+ p- V9 B显然不满意的不是我一个,活雷锋很快就出来了,名字很谦虚也很霸气 faster-whisper。4 m" Q9 ~. {; K
在六年前主力显卡3G内存上,model small,能跑到12倍速,这个是相当满意了。
6 |8 H" e1 W; q% A ?----------------------------------------* |+ {! }& {$ ?" k, }
https://github.com/guillaumekln/faster-whisper3 J+ u% g+ \! P8 M: L
安装如下:0 \5 V" o5 s. d& B
1, Windows 10
" w" x% _+ y$ v) k3 N" E- L" @2, Python 3.10.11, `9 A4 ]- J! [ m9 N5 C
3, CUDA 12.1
; W0 l3 r- s" j' G4, 在python 3 中安装. ^7 r9 y* ?+ D7 F4 T6 F5 U* `
pip install setuptools-rust torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu117/ w5 U) k/ Y6 |! y/ k+ [/ W
这一步最后一个安装文件 cu117-cp310-cp310-win_amd64.whl 大小2343.6 MB,如果没显示,你得检查一下你的环境。: t: f0 M# r" J
5,pip install -U openai-whisper C) D! K7 p3 H8 [1 o
这是向whisper 致敬,可以不装! @9 D4 p' r+ B: q% \* B1 b1 g
6,pip install faster-whisper& I% L, |; q5 \0 h, ?: W
---------------------------------------- M/ L! e; ~3 ]+ ^0 G3 `8 g
whisper 我用的命令行,faster-whisper 我用的是python。. p, ?8 ~7 C( D' p
下面给出了部分参考代码,根据主页上的参考代码我做了修改,但这个不是能运行的代码:, a. ]) j( J4 I8 O! D
' g0 T( S2 r" c3 D- j+ i----------------------------------------$ E$ G9 p7 z2 L
+ k4 y# s7 C5 z( M( B) G
from faster_whisper import WhisperModel* A R6 s5 M/ ?4 s U: J9 R
6 r. L$ d2 i" p* T1 z
model_size = "small"2 K7 v3 h4 X* K3 g; ~' h
1 X4 g& I8 B- Y* H. Amodel = WhisperModel(model_size, device="cuda", compute_type="int8")- P& |" v6 C* H0 _2 c& C- d
6 W7 {7 i, `" A
segments, info = model.transcribe(' [7 O* I& ~! ]# ?# G1 k9 J6 [
sourceFileName, # L: T) y# h/ H& n. q/ y% s
beam_size=5, / ], C+ ~+ `( U" Q$ S( a) z0 J
language="en",
, }# m- ]7 t u' z( A3 p+ J task="transcribe",
1 `: W1 J# i( |- V word_timestamps=True, ; o# ^6 K! f# H( V4 m5 o
initial_prompt = "Hello, welcome to my lecture.")* Q; p& O% b4 l5 r8 B3 \
0 w* ?$ z6 ?, C2 ~+ `; v1 J+ dfor segment in segments:
9 p3 k( l9 d4 P4 ~ print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))4 o) m( q* t2 y: P% L# E7 `: P
+ F5 U ?6 D- ]% P7 M$ r7 e: M
for word in segment.words:
5 k% C: z+ X) \1 x% V M
4 Y( r7 D! Z8 P----------------------------------------
6 T3 W5 J' C& q: y* t1 q9 a
- u* i% G2 ]3 s I代码说明:7 x6 }& ]+ \* w% |) C
1,model.transcribe 只是建立了模型,并没有运行,运行 是从 for segment in segments: 这一句开始的。
- B2 {: F& g# ?但是这一步很重要(废话),我的程序有时候会无征兆退出就是在这一步,没有任何错误信息,倒是Windows 侦测到,但也没给出有意义的信息。
2 t* b" V' {. V" g2,segment 本身是很粗糙的,做字幕勉强能用。" a/ x: W/ a" }
3,word 才是真正的精确控制的,本身带时间轴,所以要做比较好的字幕,必须用到word。5 x0 q6 ^: q, W
4,word 里面是包含标点符号的,也就是说标点符号不是独立的,是附着在前一个word中
1 \, Y& J: V2 B5 t比如 "faster." 这个句号是和前一个单词 faster 放在同一个 word 里面的。7 {; {) y1 s' W, v2 C1 z
5,model.transcribe 中参数说明:( H& j7 Y6 P+ K$ g5 T* t; t I
你要是对 whisper 的参数有所了解的话,基本上这些参数就是对应whisper 的参数
+ m& ?3 _5 `8 d+ L2 Q$ V其中- ]. E3 U c& V# h
word_timestamps=True, 4 r7 k5 e2 n1 }) q5 P
保证了你能拿到 word,否则是拿不到的$ J$ t( ?7 N+ P, E
initial_prompt = "Hello, welcome to my lecture.")
# N$ F o+ Z) O2 E0 y: V7 C保证能尽可能准确的断句 punctuation,但是不是决定性的。
1 d3 {, F* }0 s* [, b, q" z其他参数可参考源文件:
5 T+ ]: \0 p6 i# b1 v. ?9 fhttps://github.com/guillaumekln/ ... isper/transcribe.py1 F' r9 I5 b2 ~ n7 F
152 def transcribe(0 U- [0 w3 d6 ^
从源文件你可以看到是支持中文的句号断句的。
! w+ G. r$ u5 l* r; R% P
4 e% ?7 U) N7 I4 @6,如果要尽可能准确的 punctuation,根本办法是用比较大的模型 medium,或者更大。 A3 |3 k8 r4 S9 J ?
7,我自己观察一个小时之内可以保证断句准确,再长就很可能不行,所以我的办法是切割文件到一个小时,识别后再聚合,效果不错。0 u. U" e, N; d9 a" P3 c
8,faster-whisper 会上传一些信息,检测到不停的使用网络,曾经有一次代码出错就是访问网络,你要是有洁癖就把网络暂时给关了。
$ ?5 t6 @* a9 i/ a R& d( ~
; ^7 b8 T# |9 P# F 4 i4 A# o8 h$ X
7 Y. e3 C0 [: ]4 j h7 |4 E
|
评分
-
查看全部评分
|