|
|
本帖最后由 nanimarcus 于 2023-6-4 02:24 编辑 9 F+ S+ @2 N" ^1 C
; m4 B3 i0 V$ o# ]
借着 chatGPT 这股热潮研究了一下 Whisper,学名叫 automatic speech recognition (ASR) ,就是转换声音到文字的。
7 _) c, b5 A4 i9 l' j5 H效果我是很满意的,唯一不满的是速度,在六年前的主流显卡上基本上是一倍速,基本上只用在自己特别喜欢的媒体文件上了。
0 x3 t% y* j# v* C; @----------------------------------------; h/ ^0 A3 ^5 b- {" g+ Z
显然不满意的不是我一个,活雷锋很快就出来了,名字很谦虚也很霸气 faster-whisper。
# D) w6 N; ~+ _1 O5 S: @4 J在六年前主力显卡3G内存上,model small,能跑到12倍速,这个是相当满意了。
, O1 a/ F1 N- N4 |! y+ \---------------------------------------- j7 D. p' X1 y& ` ~$ w
https://github.com/guillaumekln/faster-whisper, n: E- f) W* }/ z: [. P$ P
安装如下:9 U: X' |' h5 v6 w, K- s, x+ H& ^: s
1, Windows 10% R' |% V3 e8 G7 ^6 O+ M
2, Python 3.10.11- `$ b' i1 S b8 ~, _4 K6 n
3, CUDA 12.1
0 m% d0 D6 n z$ q; N" S/ r! f, R3 Q6 N4, 在python 3 中安装) w8 ~0 b: n% N g8 L" E+ L
pip install setuptools-rust torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu117
* Q6 M% H& f4 y' q1 J; b* r, ^这一步最后一个安装文件 cu117-cp310-cp310-win_amd64.whl 大小2343.6 MB,如果没显示,你得检查一下你的环境。2 A& z& K) v- K: |' H+ s
5,pip install -U openai-whisper
2 T6 _& V1 N! s2 \; f1 b) c这是向whisper 致敬,可以不装- y- q4 ]: b" R4 }- r% u! I6 i
6,pip install faster-whisper6 `$ b: i( P6 `" j" i3 j
----------------------------------------- Q6 s$ e+ U# B9 x* E6 `0 ^3 {) T
whisper 我用的命令行,faster-whisper 我用的是python。
7 b& w/ J# ]+ k( _4 m) r$ y" G: ^下面给出了部分参考代码,根据主页上的参考代码我做了修改,但这个不是能运行的代码:' E, @ ]5 F, F' w* I& u3 u
# A, s2 B' n( E% _. @1 v4 H8 @+ g
----------------------------------------
* {+ ?$ f( R0 |' {% c( v/ q9 j& C% r0 ]# z# Q. O- j9 T/ S
from faster_whisper import WhisperModel% {- H' M7 V C- {
7 _- i( j" m3 s% J$ S1 `# smodel_size = "small"
' b C" L9 `2 B4 W( V) m3 r; E# E
model = WhisperModel(model_size, device="cuda", compute_type="int8")9 B8 Z( K; Z5 v+ J5 O6 ]
- X. L! a8 t, G. P: g; S' U+ usegments, info = model.transcribe(
0 Z: u! ?5 `. b% z- Z sourceFileName, 7 ]' W; {, Z4 Z/ X' C9 F
beam_size=5, 6 j3 P; i+ ?% I0 J9 J2 T$ `
language="en", 0 R: H/ d* Y* _1 `$ ]/ s5 O: p
task="transcribe", ' g M# f$ |/ e2 L! j
word_timestamps=True, 5 @2 v7 X! Q& z+ o: M, ?8 {! `% s1 |, E
initial_prompt = "Hello, welcome to my lecture.")
1 H$ {5 v: r! d! C
5 P5 X/ w& q6 Z1 Qfor segment in segments:
2 Q" c1 J9 R0 ^( S/ L/ k print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))
* f1 |2 r! J# G& d+ N5 f# X. j. c/ V3 E& r- b2 x
for word in segment.words:
+ g7 n5 z; t0 u; P/ P4 G) D! e& c
! f" x0 X3 q$ C; x' [9 ?5 k----------------------------------------
: S$ S6 U* x( b0 R9 a9 z
1 r c; V) J1 y- q+ N9 D代码说明:
7 J9 Y* t1 g+ q1,model.transcribe 只是建立了模型,并没有运行,运行 是从 for segment in segments: 这一句开始的。7 f$ {& w, v) w. P# ~$ S
但是这一步很重要(废话),我的程序有时候会无征兆退出就是在这一步,没有任何错误信息,倒是Windows 侦测到,但也没给出有意义的信息。/ H0 X. {$ g/ d' b
2,segment 本身是很粗糙的,做字幕勉强能用。 e- s% J t, K0 V+ G9 V" z
3,word 才是真正的精确控制的,本身带时间轴,所以要做比较好的字幕,必须用到word。
3 v0 S" m3 q; V: F& e$ G) E9 g+ D9 c4,word 里面是包含标点符号的,也就是说标点符号不是独立的,是附着在前一个word中
7 ~2 w5 t" I3 K' v1 C ?4 c6 Y比如 "faster." 这个句号是和前一个单词 faster 放在同一个 word 里面的。
3 N9 R5 Q: P+ o! C$ z; R# U+ z5,model.transcribe 中参数说明:" V* R+ L6 i: z) j8 o$ x
你要是对 whisper 的参数有所了解的话,基本上这些参数就是对应whisper 的参数0 U: H7 |9 H0 N+ P2 Q
其中% f8 B2 B$ x1 n! W1 |
word_timestamps=True, % @* z: \0 B* C; M8 u* A9 P) ]
保证了你能拿到 word,否则是拿不到的& ?- X8 H% @! g$ q% w( G
initial_prompt = "Hello, welcome to my lecture.")
& I% b0 {$ O4 K1 \: y& v保证能尽可能准确的断句 punctuation,但是不是决定性的。" n+ P3 s. t$ }: _) m+ K# U
其他参数可参考源文件:
& ]( T2 e4 s5 C: d, ghttps://github.com/guillaumekln/ ... isper/transcribe.py
* n% |7 o3 @ O% d' n: k0 S152 def transcribe(0 b( K, ~7 K1 X- u* b; c2 l; f4 x& t8 q
从源文件你可以看到是支持中文的句号断句的。- V8 T9 w3 [! Y9 g3 a
6 O: i5 v$ X1 j, |/ ^
6,如果要尽可能准确的 punctuation,根本办法是用比较大的模型 medium,或者更大。
8 y4 l p8 \) ?$ U7,我自己观察一个小时之内可以保证断句准确,再长就很可能不行,所以我的办法是切割文件到一个小时,识别后再聚合,效果不错。( l: ?- g9 `0 ]" j2 O& K/ D
8,faster-whisper 会上传一些信息,检测到不停的使用网络,曾经有一次代码出错就是访问网络,你要是有洁癖就把网络暂时给关了。
, U* W' X( }) Z) N) Q) @ f/ `
7 w* J6 K B& E6 e) z 9 K9 O ?. L3 ^, J6 d$ W
1 V6 N" a% G6 e) i |
评分
-
查看全部评分
|