|
本帖最后由 nanimarcus 于 2023-6-4 02:24 编辑
- R! T( a4 |) D# D, `& H# E b. n( ^5 y: d9 b. s2 M
借着 chatGPT 这股热潮研究了一下 Whisper,学名叫 automatic speech recognition (ASR) ,就是转换声音到文字的。
2 z! H+ ~0 M4 U5 \效果我是很满意的,唯一不满的是速度,在六年前的主流显卡上基本上是一倍速,基本上只用在自己特别喜欢的媒体文件上了。/ v8 F5 o$ ~8 B* R/ I* Y$ p
----------------------------------------* z( ^7 _; x, [ w$ p2 Y* R9 b: {4 ~
显然不满意的不是我一个,活雷锋很快就出来了,名字很谦虚也很霸气 faster-whisper。
0 Q# W) a; o: U7 F* N8 ?2 [4 O* O5 C在六年前主力显卡3G内存上,model small,能跑到12倍速,这个是相当满意了。
) Y+ K1 e0 z' q$ l' S% S----------------------------------------& B$ i7 C- f7 D! g
https://github.com/guillaumekln/faster-whisper" o5 [2 R, n' W: ^; v+ E4 t
安装如下:( Q4 T0 L! o4 F$ R; l3 e7 R
1, Windows 103 c4 a4 W9 \9 T5 t+ M1 L0 X
2, Python 3.10.11, E& ^4 P( D" w4 b0 n, Q7 I. |9 U
3, CUDA 12.1
/ k/ d7 c [, ~* ?3 s4, 在python 3 中安装
1 \; m) `) a ^pip install setuptools-rust torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu117
- \$ I) }$ I& |这一步最后一个安装文件 cu117-cp310-cp310-win_amd64.whl 大小2343.6 MB,如果没显示,你得检查一下你的环境。
: Z/ @9 u% {! U- g5,pip install -U openai-whisper# L( G- ~9 j6 d Q. \6 s
这是向whisper 致敬,可以不装
~* D+ E* Z: h* Q6,pip install faster-whisper9 m( k P* ?+ H; B% e0 a
----------------------------------------/ T8 `) x- Z$ U3 w: G+ O0 ^, g2 @
whisper 我用的命令行,faster-whisper 我用的是python。+ Z8 G7 z/ B U. Q: f/ W/ m
下面给出了部分参考代码,根据主页上的参考代码我做了修改,但这个不是能运行的代码:
7 T7 N; @' J3 W4 f) p3 L/ G, b' L( O& J8 \& \) p6 k
----------------------------------------9 P2 f/ j7 @+ v4 E
7 T+ ^: z$ m+ ifrom faster_whisper import WhisperModel
9 |% W1 z: n8 D) B9 j" D
" V, f; G- {$ k! A6 Dmodel_size = "small"$ l7 x$ e* ]& e/ Q% e
2 P8 n9 C: L- ^* U0 ymodel = WhisperModel(model_size, device="cuda", compute_type="int8")7 _% H# q/ `- ^3 s6 a2 ]4 ]
" n; K! A2 r* E* U
segments, info = model.transcribe(
3 _- M+ |5 F; r* T sourceFileName,
0 m% V2 J) |' q7 k9 {6 \ beam_size=5,
, G3 t+ {" a5 w. |$ B/ y language="en", 7 a6 |+ z j. k; n" j
task="transcribe", 6 X$ d# j$ F/ z& }9 K+ C+ L
word_timestamps=True, & x) s. O" Y9 @6 s. `. y4 W: |8 g. I% X
initial_prompt = "Hello, welcome to my lecture."). n6 {% k; L' k
. N6 a1 h8 u& N2 S. z3 v2 q
for segment in segments:
/ \8 ]% ~1 k5 d) w2 e( v print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))
8 R! h: \1 s/ W u: t. y7 S' K; [1 t* @0 U
for word in segment.words:
+ |( T- c6 L, S; }' l3 m" \7 a 5 Z+ B# s0 O) Y6 L2 w0 A5 y2 }
----------------------------------------
& @; v, L; b! q* U, B! ^4 n3 ]! F. @8 m0 ]4 m! _7 I9 X
代码说明: r7 T' R+ W$ A5 y+ b% {" k
1,model.transcribe 只是建立了模型,并没有运行,运行 是从 for segment in segments: 这一句开始的。
' u$ T% H% Z" T" W; g! V但是这一步很重要(废话),我的程序有时候会无征兆退出就是在这一步,没有任何错误信息,倒是Windows 侦测到,但也没给出有意义的信息。2 U& Y; ]2 Q5 }$ s
2,segment 本身是很粗糙的,做字幕勉强能用。
# J( C3 o; W7 s' S8 V; b1 s7 j3,word 才是真正的精确控制的,本身带时间轴,所以要做比较好的字幕,必须用到word。: y0 j5 f! \9 F7 q/ h
4,word 里面是包含标点符号的,也就是说标点符号不是独立的,是附着在前一个word中( i! s6 u5 r' L! M+ R/ u7 A
比如 "faster." 这个句号是和前一个单词 faster 放在同一个 word 里面的。6 S/ c1 V( H! d( H
5,model.transcribe 中参数说明:
" a5 t( t% z M" b; N你要是对 whisper 的参数有所了解的话,基本上这些参数就是对应whisper 的参数
1 _( A& q4 J4 e* Y* h# `8 W其中( ~+ t1 O: g& f. Y5 S
word_timestamps=True,
7 K# O" g+ @4 r- Z& u6 X! ?保证了你能拿到 word,否则是拿不到的- Q! o- M- K1 ^7 @
initial_prompt = "Hello, welcome to my lecture.")9 K8 E7 w# u" S
保证能尽可能准确的断句 punctuation,但是不是决定性的。
5 Q6 {6 X* C3 `! R其他参数可参考源文件:
: V2 F$ L ]3 c4 v- o% Chttps://github.com/guillaumekln/ ... isper/transcribe.py" n( _7 G* w" l' N" n+ s2 [4 U6 V
152 def transcribe(/ {6 j+ j" p! P G2 u
从源文件你可以看到是支持中文的句号断句的。( b& [, ~8 ]/ v$ i
5 X. Y W9 n( a8 G5 A
6,如果要尽可能准确的 punctuation,根本办法是用比较大的模型 medium,或者更大。9 m2 Q' C" x( R/ E9 x/ P0 L
7,我自己观察一个小时之内可以保证断句准确,再长就很可能不行,所以我的办法是切割文件到一个小时,识别后再聚合,效果不错。
* i0 D# F$ \0 O; o; `$ p( j( J( p8,faster-whisper 会上传一些信息,检测到不停的使用网络,曾经有一次代码出错就是访问网络,你要是有洁癖就把网络暂时给关了。
9 @( _2 A4 s% y% @; k9 Q7 o' l. `: z2 N# h7 V
! {! d% b8 \5 G* ]4 U8 s h0 s" `( t( \- F( K6 a: f
|
评分
-
查看全部评分
|