|
|
本帖最后由 nanimarcus 于 2023-6-4 02:24 编辑
( M3 {6 ^( `6 J: E1 [7 D+ b k; O2 D, j6 \7 P M1 ~( e
借着 chatGPT 这股热潮研究了一下 Whisper,学名叫 automatic speech recognition (ASR) ,就是转换声音到文字的。
' [/ r5 {% p; [& V1 ]1 M效果我是很满意的,唯一不满的是速度,在六年前的主流显卡上基本上是一倍速,基本上只用在自己特别喜欢的媒体文件上了。. S9 O3 q" }# |0 y& M8 _
----------------------------------------
6 t/ ~# d( t! H显然不满意的不是我一个,活雷锋很快就出来了,名字很谦虚也很霸气 faster-whisper。- N9 e: W. Y. Y2 j
在六年前主力显卡3G内存上,model small,能跑到12倍速,这个是相当满意了。
6 ^6 e) a6 G+ {" _' l0 n) A }$ R2 r----------------------------------------! ~5 z$ H& h$ I
https://github.com/guillaumekln/faster-whisper9 L, B- r( |, H- G/ I v
安装如下:
& ?3 `0 S# E; f( r. i/ u1, Windows 10* j6 N) \" Z2 C8 O; k4 L* q
2, Python 3.10.11% u& V% J+ U+ u
3, CUDA 12.1- a# E: Y: e4 V; _) V0 A) `2 X
4, 在python 3 中安装
" L0 n7 m) Z* J6 n) {1 u7 }7 kpip install setuptools-rust torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu117# ^$ u5 B, {$ h: k6 ~2 I6 g
这一步最后一个安装文件 cu117-cp310-cp310-win_amd64.whl 大小2343.6 MB,如果没显示,你得检查一下你的环境。# Y& P$ ~2 I0 ^: r/ T# Z5 K
5,pip install -U openai-whisper
8 r0 G( Z) n: ]8 L这是向whisper 致敬,可以不装
C7 V: D7 r( n2 [9 o& m5 }+ q$ y6,pip install faster-whisper" B" b6 N1 g" z( T" d5 V5 W0 Z
----------------------------------------7 N8 w9 `4 }$ {' o
whisper 我用的命令行,faster-whisper 我用的是python。6 B7 i2 ?1 F" j7 E+ E2 G5 Y
下面给出了部分参考代码,根据主页上的参考代码我做了修改,但这个不是能运行的代码:- f7 i! S% ^" h7 X( Q& a( L, D( ~; L
1 U9 W, l9 e3 ?) j1 P----------------------------------------
9 I/ F! U. ^2 k% v! C
( N+ s/ i: ?3 L d, j! yfrom faster_whisper import WhisperModel+ Q# U/ t. `; G" u0 I
0 [( R$ @2 ^' j" U7 F
model_size = "small"
2 r' v) S7 C! O6 X9 w4 ~
4 q+ y! M& _% A& x9 U( [" jmodel = WhisperModel(model_size, device="cuda", compute_type="int8"); X5 I. t' {( ~1 q- R( ] ?
6 f9 s& O- K- c8 Wsegments, info = model.transcribe(
# K4 }8 O# Y& ?4 X& Z) D+ X5 f sourceFileName, # H9 b( |9 p8 V) W7 d) }0 A( }
beam_size=5, ! [. l% W% V, k6 ?
language="en",
! L. x( Y9 k1 b' ]8 w+ K task="transcribe",
" F) ]: A$ _1 O2 V0 I9 U5 _/ O word_timestamps=True, # \% K1 N# ?9 L2 ^/ j9 B% M
initial_prompt = "Hello, welcome to my lecture."); W6 [& k. z f1 v# }# B) s
i9 T- u) f" U+ c- t* L8 B! B* R
for segment in segments:
- S+ ]8 o9 Y. Y7 \/ H' N print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))- @- z5 X5 Q6 B# Y. b
9 o$ j7 R! f j/ W! P s# ^9 h
for word in segment.words:
, x U) ?- j% r. x9 H " g% F) v) X8 q
----------------------------------------0 b3 V2 Q& Q1 ^: j0 o4 w/ [7 x6 x
% ^; L6 [ r/ V, V8 C" K# _
代码说明:
: W; E, V7 k' p2 T5 Q. N" A1,model.transcribe 只是建立了模型,并没有运行,运行 是从 for segment in segments: 这一句开始的。1 e) P# @3 G4 n/ Z2 `2 |& d. j
但是这一步很重要(废话),我的程序有时候会无征兆退出就是在这一步,没有任何错误信息,倒是Windows 侦测到,但也没给出有意义的信息。5 Y; g. Q- m. U! B. n; b1 ?+ i
2,segment 本身是很粗糙的,做字幕勉强能用。
1 B% K2 P: T' I" w: e3,word 才是真正的精确控制的,本身带时间轴,所以要做比较好的字幕,必须用到word。
; @6 g# o. ^' A- B) O# u1 K. _- r1 o4,word 里面是包含标点符号的,也就是说标点符号不是独立的,是附着在前一个word中
0 U- s' u& B# u5 E, C比如 "faster." 这个句号是和前一个单词 faster 放在同一个 word 里面的。$ J% Q. K5 c+ h8 m0 x
5,model.transcribe 中参数说明:
6 b+ I4 D( C& s' H; @( x你要是对 whisper 的参数有所了解的话,基本上这些参数就是对应whisper 的参数
4 s; c* B# ^" `* ]* d0 q% L其中7 L' N; p0 g2 Z4 ~
word_timestamps=True,
9 U" Z, I$ [3 |+ B6 c+ K( S保证了你能拿到 word,否则是拿不到的9 n3 x0 H( t( q* Z% \. c" j
initial_prompt = "Hello, welcome to my lecture.")+ w t6 k9 k. |: S1 A9 Z
保证能尽可能准确的断句 punctuation,但是不是决定性的。: N/ A0 W& R! \: J8 L8 I+ r0 [% J
其他参数可参考源文件:( C) P- M* ?+ w/ Y, p7 Q
https://github.com/guillaumekln/ ... isper/transcribe.py& U* V d$ _, q' C6 E/ }
152 def transcribe( g) x& X: i) ~) U
从源文件你可以看到是支持中文的句号断句的。3 ^0 X# P8 f8 W2 g. M4 k
5 ^2 p. C' i! X6,如果要尽可能准确的 punctuation,根本办法是用比较大的模型 medium,或者更大。
9 e& L& |2 _* k; }& j7,我自己观察一个小时之内可以保证断句准确,再长就很可能不行,所以我的办法是切割文件到一个小时,识别后再聚合,效果不错。% H9 `, d" a' z* ^0 W! u' i* Z
8,faster-whisper 会上传一些信息,检测到不停的使用网络,曾经有一次代码出错就是访问网络,你要是有洁癖就把网络暂时给关了。
0 W6 o5 {* S7 m; L8 m7 ?, P# i
7 b- S5 ~( L) Q4 M% y/ Z 8 q$ y2 z& {: q1 J2 h
5 @7 g8 d+ P7 R D0 ^4 O
|
评分
-
查看全部评分
|