|
|
本帖最后由 nanimarcus 于 2023-6-4 02:24 编辑 ! L# a; K6 Z/ L; ~4 B; m6 M \
5 S3 ]. ]9 g7 ?2 `2 v6 G# z) Z) P借着 chatGPT 这股热潮研究了一下 Whisper,学名叫 automatic speech recognition (ASR) ,就是转换声音到文字的。8 y" U7 P- }/ D, m1 T; t1 W0 F
效果我是很满意的,唯一不满的是速度,在六年前的主流显卡上基本上是一倍速,基本上只用在自己特别喜欢的媒体文件上了。7 [4 r: w" o% l! K- D
----------------------------------------- d4 B% o( T$ T5 i2 n
显然不满意的不是我一个,活雷锋很快就出来了,名字很谦虚也很霸气 faster-whisper。/ ? `0 g8 L7 a/ H5 ]
在六年前主力显卡3G内存上,model small,能跑到12倍速,这个是相当满意了。3 Z; p2 j8 E6 W1 t/ Y5 c6 S
----------------------------------------
3 t! o* ]& b- s# a4 p$ u3 B. z( Mhttps://github.com/guillaumekln/faster-whisper
* P$ i2 K. ]1 z: w, @安装如下:
9 ?2 A4 o% M* l, D2 }2 m6 J' u1, Windows 105 b& m5 D/ B7 L7 _
2, Python 3.10.111 L3 [$ K) G9 c+ A2 S6 g- K; w
3, CUDA 12.1
) n5 u x' b9 q% R$ U+ K7 p4, 在python 3 中安装
7 N# W; e* r& apip install setuptools-rust torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu117
) F( t+ s: B( y J% {% @这一步最后一个安装文件 cu117-cp310-cp310-win_amd64.whl 大小2343.6 MB,如果没显示,你得检查一下你的环境。
( h# @+ Y( v( c5,pip install -U openai-whisper
1 \3 H) i% {; o5 S这是向whisper 致敬,可以不装
* j `5 i0 O( k7 H# A6,pip install faster-whisper
9 j) ^* w2 Q- a----------------------------------------/ a( h: \; F1 D; {% G" C$ k/ F
whisper 我用的命令行,faster-whisper 我用的是python。; K) O6 I* V; l" p, Q c1 S
下面给出了部分参考代码,根据主页上的参考代码我做了修改,但这个不是能运行的代码:
7 s# @9 e/ H. c" y- A2 z6 N g" m
) q7 I% B0 ]. j Q1 s8 G; d----------------------------------------0 a2 g/ h z4 V- _ M
; X/ l+ Z9 e4 k0 f" [from faster_whisper import WhisperModel
6 X2 ^! }, i$ L) O0 U8 Y% w+ ~! F
2 m" ]+ c X5 u4 umodel_size = "small"9 V' c. i7 W4 c, G) p' H
2 V* T% h' X1 v! w+ Pmodel = WhisperModel(model_size, device="cuda", compute_type="int8")
" k1 n* ~/ x# q2 I8 G! k9 v3 s8 M8 ~/ Y! V
segments, info = model.transcribe(6 B6 W; R- K" \# t7 ]
sourceFileName,
9 z/ R: b' n% l( Q5 N+ D* H beam_size=5,
" m: X' h: s5 O! U language="en",
% ?% S+ r8 G3 |) d# q- h7 y task="transcribe",
' M: \0 z3 o( m" U word_timestamps=True,
$ ], D- Y ]& Y; @* d; B3 M$ K k initial_prompt = "Hello, welcome to my lecture.")( k; M) D2 d I- Z" b2 L$ `
* ?% ]- C& ^$ J7 U% E, a/ [for segment in segments:: m; ~% Z: h; V0 d% Z4 Y4 }, Z
print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))6 w9 C0 s& \1 q
9 A( C/ P& Z2 f! s; n
for word in segment.words:& @! |8 |; O$ A6 u
7 G4 `7 Q9 a% Y# }; a4 j
----------------------------------------" s1 `$ f- V* K; [
! R+ x+ ?' J$ ?# u& E% w代码说明:$ \$ ^. G3 |4 k- e& Q
1,model.transcribe 只是建立了模型,并没有运行,运行 是从 for segment in segments: 这一句开始的。- ?, d. b$ I- n
但是这一步很重要(废话),我的程序有时候会无征兆退出就是在这一步,没有任何错误信息,倒是Windows 侦测到,但也没给出有意义的信息。
' z U8 L; r; |% T% l2,segment 本身是很粗糙的,做字幕勉强能用。# l; A! [$ a5 @7 f
3,word 才是真正的精确控制的,本身带时间轴,所以要做比较好的字幕,必须用到word。0 ?+ _/ ]4 {8 a. }1 a- @6 ? }
4,word 里面是包含标点符号的,也就是说标点符号不是独立的,是附着在前一个word中
% @- B3 T, w7 ^. I& k比如 "faster." 这个句号是和前一个单词 faster 放在同一个 word 里面的。, D: B0 L& A# n R* p& E! L: n
5,model.transcribe 中参数说明:
" Y0 F2 {- e$ C4 s# m% o5 D你要是对 whisper 的参数有所了解的话,基本上这些参数就是对应whisper 的参数
3 b5 J, c7 {1 w5 b其中
5 F5 m6 l2 E7 w4 Y q4 \ word_timestamps=True, 7 _ ?" r8 l2 s6 {
保证了你能拿到 word,否则是拿不到的
# g! |! S! X6 U& B. k initial_prompt = "Hello, welcome to my lecture.")5 J& `5 q- Y" y) S3 ~. @ z
保证能尽可能准确的断句 punctuation,但是不是决定性的。
8 K( h$ K8 x4 u6 F& p其他参数可参考源文件:5 Z7 K1 W' K. k l# [
https://github.com/guillaumekln/ ... isper/transcribe.py
4 S- n; o5 n5 B# O1 y5 t152 def transcribe(+ J$ A! m1 x, s `, W f8 l
从源文件你可以看到是支持中文的句号断句的。
7 E8 ]6 C2 t6 n) {$ h4 W/ ?; d
1 j: Q7 ~8 l* k0 O2 a1 i* z6,如果要尽可能准确的 punctuation,根本办法是用比较大的模型 medium,或者更大。9 j" F9 L* I+ o+ h6 d7 s
7,我自己观察一个小时之内可以保证断句准确,再长就很可能不行,所以我的办法是切割文件到一个小时,识别后再聚合,效果不错。 F3 K. C3 ? _- K" J3 ] k$ _
8,faster-whisper 会上传一些信息,检测到不停的使用网络,曾经有一次代码出错就是访问网络,你要是有洁癖就把网络暂时给关了。: W2 a, o# \+ f8 t" R5 q" N
" P1 q3 V6 w. R$ C; {: K; _: @& X " [6 C* W# \" E6 s3 M
' _) y2 ]/ t0 S6 t5 q+ l
|
评分
-
查看全部评分
|