|
|
本帖最后由 nanimarcus 于 2023-6-4 02:24 编辑 7 F4 \7 U: \: u5 |4 o! G* i" M) f
# H! A& y' Y8 G* `& C0 ]" k3 O* O- O
借着 chatGPT 这股热潮研究了一下 Whisper,学名叫 automatic speech recognition (ASR) ,就是转换声音到文字的。
. I. E5 N- S+ s, a" n' r' e7 w效果我是很满意的,唯一不满的是速度,在六年前的主流显卡上基本上是一倍速,基本上只用在自己特别喜欢的媒体文件上了。
! D; m+ @0 O n+ D+ d) ^" G----------------------------------------) R0 ? L: o6 D# [3 X$ M7 r
显然不满意的不是我一个,活雷锋很快就出来了,名字很谦虚也很霸气 faster-whisper。 ?0 J6 d0 Z& k" q
在六年前主力显卡3G内存上,model small,能跑到12倍速,这个是相当满意了。
% f) n$ v- ?6 T: ^3 x6 O2 \----------------------------------------
' d9 e6 o. o p$ i- Ohttps://github.com/guillaumekln/faster-whisper
8 T3 i6 r }' L安装如下:' _! Z W) O! H- q
1, Windows 10
& D3 k' U1 [+ s5 d: f2 U; k2, Python 3.10.113 p: A1 c4 J J; t' b. ^' u& @
3, CUDA 12.1
8 V7 e8 b5 r J4 ?$ j4, 在python 3 中安装, l: @: j* _3 |1 l: G
pip install setuptools-rust torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu117
- d' f# k3 t W5 x5 i这一步最后一个安装文件 cu117-cp310-cp310-win_amd64.whl 大小2343.6 MB,如果没显示,你得检查一下你的环境。
* X" `2 i5 X9 P7 K/ j# b" }0 A5,pip install -U openai-whisper5 d: [7 x( Y. y* n
这是向whisper 致敬,可以不装
" d$ N @; {0 e0 U* M6,pip install faster-whisper( V$ J0 i( _: _8 A! \0 B" ?) ~
----------------------------------------
4 `- M" u7 [% B: Xwhisper 我用的命令行,faster-whisper 我用的是python。' X& @! N9 A( G: L/ K) T7 g
下面给出了部分参考代码,根据主页上的参考代码我做了修改,但这个不是能运行的代码:
$ {- e* l' e3 {. j/ T# z8 |5 l) S) R. ~/ ^2 [7 t5 _, t" h8 g
----------------------------------------
5 R' |+ V- h F/ q: h
( J: i. L$ I1 ~. V. i" Cfrom faster_whisper import WhisperModel
" k5 O3 R6 i# G; d2 Y- c) @- U4 D8 n6 w, Q
model_size = "small"
! G. j0 n/ K, \+ e( ]8 W- V$ T9 |7 U
model = WhisperModel(model_size, device="cuda", compute_type="int8")
" M' r2 m+ I( T+ i2 n4 d0 C" {
9 P) O5 y! [+ [% z" b0 \9 j, Jsegments, info = model.transcribe(
# B3 A2 }& h/ ?" T- p# Y2 o) M6 r sourceFileName,
+ c1 e, w/ ]. c7 ?, c, j( ? beam_size=5,
( l% l: A& o3 H2 s; l. l3 A7 ` language="en",
: C9 t. ^8 {% e! q* h task="transcribe", ( x: X- B: t$ y1 |' v
word_timestamps=True, 9 j* [5 }. u: V% j& m
initial_prompt = "Hello, welcome to my lecture."); v/ Y9 e+ @0 m0 z
& m/ |$ R# U: K. d! g% Gfor segment in segments:
( v7 R! Y/ q! x5 o3 P print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))+ l! ~& y, Y+ Y ~( r: h7 Z' p4 x
* A* p, ?7 J! O
for word in segment.words:1 U$ n& N! ^* g8 N
# U% M: k* C' h
----------------------------------------
5 | O+ Q( K) g% [0 K/ G9 e* o% |5 J/ c+ z2 g( ~6 Z
代码说明:
& `4 ?1 l* E$ s! w0 C( a2 [1,model.transcribe 只是建立了模型,并没有运行,运行 是从 for segment in segments: 这一句开始的。3 | x @7 W/ t6 }, h9 |
但是这一步很重要(废话),我的程序有时候会无征兆退出就是在这一步,没有任何错误信息,倒是Windows 侦测到,但也没给出有意义的信息。& T2 B7 p. W# o! A0 G& W
2,segment 本身是很粗糙的,做字幕勉强能用。
! K8 H" D+ b4 ?) s3,word 才是真正的精确控制的,本身带时间轴,所以要做比较好的字幕,必须用到word。
. S1 ~2 ]( D+ |. x3 S4,word 里面是包含标点符号的,也就是说标点符号不是独立的,是附着在前一个word中" R/ r( L& {' L8 R7 `/ a: F* S! [
比如 "faster." 这个句号是和前一个单词 faster 放在同一个 word 里面的。% P% o- l: N! D) y6 K5 k6 K
5,model.transcribe 中参数说明:% A0 t% z) i w6 u6 G& }: A' u" k
你要是对 whisper 的参数有所了解的话,基本上这些参数就是对应whisper 的参数# s% x, {: C+ c6 t0 c, _. S
其中
0 }# U9 D8 N' `( M0 F- n5 V! W word_timestamps=True,
, I/ G) s& t: q: I$ Q4 b保证了你能拿到 word,否则是拿不到的
9 n) W2 n# g: i. P initial_prompt = "Hello, welcome to my lecture.")" R7 S6 | {* @& }! k" e
保证能尽可能准确的断句 punctuation,但是不是决定性的。" }% @, N* i1 o0 |8 n! G6 N3 t
其他参数可参考源文件:5 i/ p* ]2 S7 v6 @
https://github.com/guillaumekln/ ... isper/transcribe.py3 r% X" t1 ^: l7 p
152 def transcribe(
+ d$ K' h6 v! V2 ]1 ]/ Z1 x从源文件你可以看到是支持中文的句号断句的。/ {% P, d( ?, V
3 s5 r2 j7 u8 Z7 ^8 S7 ~
6,如果要尽可能准确的 punctuation,根本办法是用比较大的模型 medium,或者更大。0 f# F( s1 F4 e9 v. Z
7,我自己观察一个小时之内可以保证断句准确,再长就很可能不行,所以我的办法是切割文件到一个小时,识别后再聚合,效果不错。
0 P. i& O; J6 s0 T8 e9 N8,faster-whisper 会上传一些信息,检测到不停的使用网络,曾经有一次代码出错就是访问网络,你要是有洁癖就把网络暂时给关了。$ `1 M P) v9 @4 }1 Q8 Z
4 b7 O- P& ^! e0 \
! G l# q. T! l( t" p+ u) e6 F+ c* T' s7 C% J4 r8 C! g
|
评分
-
查看全部评分
|