|
本帖最后由 nanimarcus 于 2023-6-4 02:24 编辑 9 V( f y e' |6 w c# }7 W
. }, e8 W0 v" y, U4 m4 z借着 chatGPT 这股热潮研究了一下 Whisper,学名叫 automatic speech recognition (ASR) ,就是转换声音到文字的。
4 a& [1 J: v3 S0 N效果我是很满意的,唯一不满的是速度,在六年前的主流显卡上基本上是一倍速,基本上只用在自己特别喜欢的媒体文件上了。
" `4 O; \: x' |: V----------------------------------------9 t+ A/ I6 m& `! t, @
显然不满意的不是我一个,活雷锋很快就出来了,名字很谦虚也很霸气 faster-whisper。
8 H2 D2 e' v. H+ k* F在六年前主力显卡3G内存上,model small,能跑到12倍速,这个是相当满意了。
# l) A* z. Q; r! a----------------------------------------+ n1 g j4 Q# q6 n9 [
https://github.com/guillaumekln/faster-whisper$ [0 o# `/ ~7 ~6 ~4 Q+ b2 }" t
安装如下:
1 W1 b/ `; A: J8 z6 e$ e# O1, Windows 10& X& i4 R% B3 u" ?7 ^8 V0 p! m- L
2, Python 3.10.11( E' K% t8 @ q, S6 q
3, CUDA 12.14 x" V; \' C8 ~$ Z
4, 在python 3 中安装
* ?& ~8 s t/ T+ y, |pip install setuptools-rust torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu117
% @$ Z& E; g0 R) G# @% c' U这一步最后一个安装文件 cu117-cp310-cp310-win_amd64.whl 大小2343.6 MB,如果没显示,你得检查一下你的环境。3 U1 K6 J/ }2 b5 ~) R
5,pip install -U openai-whisper- ?* H0 a g0 F) @
这是向whisper 致敬,可以不装
. p4 G6 ?. y0 y8 G! r, D, L. Y6,pip install faster-whisper
" x' z$ Y; n. V9 R% R9 M3 @----------------------------------------' {7 F& ]$ Q V& G& N8 o% H4 j
whisper 我用的命令行,faster-whisper 我用的是python。
1 j5 N6 Q6 v7 @下面给出了部分参考代码,根据主页上的参考代码我做了修改,但这个不是能运行的代码:5 b' }5 x; T8 Y/ H- b1 |3 h
: ^/ w2 _1 s* D9 N3 r/ B0 H5 J) {
----------------------------------------$ }6 |* ~1 t4 A" Q* F
$ H& x% k/ D) W# S# xfrom faster_whisper import WhisperModel
0 x& V- Q! P7 L( c- L, I1 a6 s0 c2 i+ M- {3 g, R
model_size = "small"
& |: `1 y3 W8 g+ N* _- l# o( l. u6 w/ K
model = WhisperModel(model_size, device="cuda", compute_type="int8")/ C1 B/ m, ^& s R0 B5 m) T' {
/ F6 N' I, k8 y, m7 `
segments, info = model.transcribe(
M) b& r" Z* S @! u; q& E! f sourceFileName, & ~$ S5 H4 q. B7 f2 P: z* n' i# U
beam_size=5,
: P: [8 [2 P7 g% Z language="en", % r( V5 ?( n4 K2 X: e G: K# r: J
task="transcribe", # p6 D- B+ f% y* K3 Y
word_timestamps=True, / n! P1 i/ Z& E2 i* S4 y5 c
initial_prompt = "Hello, welcome to my lecture.")) ~& K" G# o: v; o; K. r i$ Y
6 k3 ~ N7 `6 {9 ^3 D0 W1 L8 Dfor segment in segments:% D: V' U- b; i$ O1 ~5 P6 _ U [
print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))' T# A. |1 ~# E) ]+ q; n6 l$ u
, j" q0 b) T1 t& V: B( D$ `
for word in segment.words:
' R$ l, @$ ?9 G* N1 p2 v $ q8 i( o* ?$ o1 ? Q) w7 d
----------------------------------------0 q& @3 y+ ]/ y Y
5 t8 J( k. V N; K' m- X1 N* i
代码说明:( g( z, S9 _: B& U/ b" F8 W* O2 b3 }" y
1,model.transcribe 只是建立了模型,并没有运行,运行 是从 for segment in segments: 这一句开始的。
% Y" t* t) B6 v5 L/ \+ Y但是这一步很重要(废话),我的程序有时候会无征兆退出就是在这一步,没有任何错误信息,倒是Windows 侦测到,但也没给出有意义的信息。& M, `# ` k/ R4 ~5 s2 b' |
2,segment 本身是很粗糙的,做字幕勉强能用。 W% Z0 s5 ~" F
3,word 才是真正的精确控制的,本身带时间轴,所以要做比较好的字幕,必须用到word。' t8 F% D' q; ]1 t3 k- T8 N1 c
4,word 里面是包含标点符号的,也就是说标点符号不是独立的,是附着在前一个word中, y2 X5 Y( ?( R* ?
比如 "faster." 这个句号是和前一个单词 faster 放在同一个 word 里面的。' m4 I! M, Q$ k _' N5 _2 ~
5,model.transcribe 中参数说明:
- Q$ {; w/ T5 s7 q& w1 N你要是对 whisper 的参数有所了解的话,基本上这些参数就是对应whisper 的参数' i$ O( U+ s, F; \$ [
其中
# ? H6 y; v* X# m$ C) `) h word_timestamps=True, * R3 M4 A8 A+ \7 }. i. A
保证了你能拿到 word,否则是拿不到的( S9 c* K) F4 z# ^3 p" ?
initial_prompt = "Hello, welcome to my lecture.")+ ?: ?& `6 u' i# z. G& u
保证能尽可能准确的断句 punctuation,但是不是决定性的。
6 T! B- ^# ~& c, m, Y其他参数可参考源文件:8 B) [ x; B* u7 x
https://github.com/guillaumekln/ ... isper/transcribe.py
) I7 f A; K3 j( D152 def transcribe(
* a$ z$ G; b& x* n3 o$ C3 _' Y从源文件你可以看到是支持中文的句号断句的。
' `& w/ G8 X* K# O8 E; B$ C4 A6 {. o! c% M
6,如果要尽可能准确的 punctuation,根本办法是用比较大的模型 medium,或者更大。 Y, `3 I1 {3 V; O
7,我自己观察一个小时之内可以保证断句准确,再长就很可能不行,所以我的办法是切割文件到一个小时,识别后再聚合,效果不错。
) V! m3 M& g8 Y5 A( D8,faster-whisper 会上传一些信息,检测到不停的使用网络,曾经有一次代码出错就是访问网络,你要是有洁癖就把网络暂时给关了。9 Z$ U4 E% h+ A: j: o% X' U7 ]8 W
, O; @" b7 r# E
* ~) [0 v6 J6 Z+ q4 \, P6 J( B
# u0 y H: P3 z( q9 G8 E |
评分
-
查看全部评分
|