|
本帖最后由 nanimarcus 于 2023-6-4 02:24 编辑 2 A$ w8 U( Y( _) H6 g* h# r
; @ K8 n# E: N- Y
借着 chatGPT 这股热潮研究了一下 Whisper,学名叫 automatic speech recognition (ASR) ,就是转换声音到文字的。
/ d4 O1 z2 w O# {( g3 O; `6 v/ a效果我是很满意的,唯一不满的是速度,在六年前的主流显卡上基本上是一倍速,基本上只用在自己特别喜欢的媒体文件上了。
' f' Z2 f3 A) c. Z) H0 I5 l----------------------------------------
; z* _+ D7 ?' e2 y显然不满意的不是我一个,活雷锋很快就出来了,名字很谦虚也很霸气 faster-whisper。6 I( s( z6 E4 r6 R! Z4 P9 X
在六年前主力显卡3G内存上,model small,能跑到12倍速,这个是相当满意了。8 @* s: m3 r7 U4 `1 J8 R1 f
----------------------------------------
3 g& N9 f. v0 m( n7 A5 a: shttps://github.com/guillaumekln/faster-whisper. Y% u% t/ J3 c _/ z7 P
安装如下:
- ]% ~) `* s2 I/ J% s1 P) r1, Windows 101 b0 ~3 x/ e8 W7 B" ~
2, Python 3.10.11
5 x! b5 {+ ~2 B+ [7 r, I3, CUDA 12.1
2 t8 x1 Y3 T. G6 }, g' J, j% R4, 在python 3 中安装2 r: g) W5 j- ]. v7 T5 c
pip install setuptools-rust torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu117
5 G8 K: u! U6 h1 l$ m( G这一步最后一个安装文件 cu117-cp310-cp310-win_amd64.whl 大小2343.6 MB,如果没显示,你得检查一下你的环境。
, @3 j, }8 D2 f3 i8 v8 }5,pip install -U openai-whisper
/ I% V+ }3 Y3 L2 P这是向whisper 致敬,可以不装
4 k% @) {- [ r3 l z- _7 q7 g2 w6,pip install faster-whisper
5 {. e7 R: i& A4 Y----------------------------------------+ d- }/ x# P* u# g) U1 q& @
whisper 我用的命令行,faster-whisper 我用的是python。
$ _, G% E& L+ H1 r5 d5 b6 x下面给出了部分参考代码,根据主页上的参考代码我做了修改,但这个不是能运行的代码:
! o0 v$ v* k* @. [4 P- R* F7 K( v& V, z1 S! ?+ f4 }
----------------------------------------
( ?) Q: l7 \0 x8 J h. ^; D
) {& h9 w1 @9 E. |from faster_whisper import WhisperModel% k8 H% ?! [$ s: c: ?% F
3 x% a) G- y& V% l9 V/ G. p! g! [
model_size = "small"7 ^+ }' G3 K) V% W$ T
& i7 Y5 Y) N3 r/ g6 Mmodel = WhisperModel(model_size, device="cuda", compute_type="int8")$ Z% j" e5 `$ w' m& u% M% u
/ c" x1 @% c) g% Vsegments, info = model.transcribe(. s! R) @) p( f+ l8 _
sourceFileName, ; ~ d" A; w! l) }& D
beam_size=5,
1 s% Z" f3 Z* A$ P' c8 I) f language="en", ' w; I- ^5 j& t2 [4 w9 J
task="transcribe",
/ l; @5 q0 D0 ?, Z L2 S4 I1 n' W/ V word_timestamps=True, ( M' |6 i5 c, v$ T- G. W
initial_prompt = "Hello, welcome to my lecture.")
4 \8 ]. i7 c$ o% [& \& e1 n3 E$ J0 E; G# M5 b7 q: y
for segment in segments:
4 T7 w0 ?, ]8 f+ D print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))& B/ O( }- o7 E" j* a
1 [7 Q# ?) s, d6 ?
for word in segment.words:* ~1 e3 g7 H$ c+ W; h
9 D: b& A. r; e! T/ @4 X
----------------------------------------9 f- i% {' p: w
7 O1 a+ D6 P' n$ X9 o4 ?% f& w
代码说明:
! H8 K8 A7 p1 a+ k8 t# F; t1,model.transcribe 只是建立了模型,并没有运行,运行 是从 for segment in segments: 这一句开始的。, W9 z3 V1 Q1 n( n7 \" n" B
但是这一步很重要(废话),我的程序有时候会无征兆退出就是在这一步,没有任何错误信息,倒是Windows 侦测到,但也没给出有意义的信息。
+ {* a7 q' T. q% ], b2,segment 本身是很粗糙的,做字幕勉强能用。
) q2 K# M4 G0 s, _6 n$ q* J3,word 才是真正的精确控制的,本身带时间轴,所以要做比较好的字幕,必须用到word。& p$ [' r' A- v- l' S1 z; ]
4,word 里面是包含标点符号的,也就是说标点符号不是独立的,是附着在前一个word中) ~3 I; f1 S- }5 {. Y7 c
比如 "faster." 这个句号是和前一个单词 faster 放在同一个 word 里面的。
( w, ^/ v4 q4 l5 B7 _/ F5,model.transcribe 中参数说明:
0 Y" \- M/ W: }你要是对 whisper 的参数有所了解的话,基本上这些参数就是对应whisper 的参数# u2 `% G# Z8 y9 l- w, t- v- i
其中& B7 K5 c0 i, z( q
word_timestamps=True, 9 k4 z6 F/ A" E1 a7 W* e
保证了你能拿到 word,否则是拿不到的
% o6 ~! H7 I7 z% s3 @6 g( l* H initial_prompt = "Hello, welcome to my lecture."). ` [- k3 o- R' ]
保证能尽可能准确的断句 punctuation,但是不是决定性的。# d1 e# h# v3 V$ i
其他参数可参考源文件:
. I9 H. X+ v2 f Hhttps://github.com/guillaumekln/ ... isper/transcribe.py X6 b0 I& k2 c. S; f$ H3 l
152 def transcribe(: X! a0 j" p# I( H3 x) W
从源文件你可以看到是支持中文的句号断句的。. _# d* o }4 `, D
4 P" Y9 E. F2 ]+ m# i- a# N* {3 _6,如果要尽可能准确的 punctuation,根本办法是用比较大的模型 medium,或者更大。
( X. |) W/ V: R' o! e" }. K7,我自己观察一个小时之内可以保证断句准确,再长就很可能不行,所以我的办法是切割文件到一个小时,识别后再聚合,效果不错。
& m7 `! y2 N/ H* ^( m; c8,faster-whisper 会上传一些信息,检测到不停的使用网络,曾经有一次代码出错就是访问网络,你要是有洁癖就把网络暂时给关了。% \3 Z( O% m$ C* Q2 O e ?
; i8 [. l6 c! o
9 X- d( C0 |$ A# {2 ~) T1 R& U; I5 P% r; X P# {( x
|
评分
-
查看全部评分
|