|
本帖最后由 nanimarcus 于 2023-6-4 02:24 编辑
% X; s6 g9 P6 c# o) S* @) ?/ {7 o. P
借着 chatGPT 这股热潮研究了一下 Whisper,学名叫 automatic speech recognition (ASR) ,就是转换声音到文字的。( R4 E3 j; a1 o0 b, y
效果我是很满意的,唯一不满的是速度,在六年前的主流显卡上基本上是一倍速,基本上只用在自己特别喜欢的媒体文件上了。
1 T/ h# [+ I8 Y r----------------------------------------
r& K' M" m4 k }$ `显然不满意的不是我一个,活雷锋很快就出来了,名字很谦虚也很霸气 faster-whisper。6 |% Y. K9 Q- P; w
在六年前主力显卡3G内存上,model small,能跑到12倍速,这个是相当满意了。) @& }9 O/ V3 B7 Y7 b& ^
----------------------------------------
& `' Y. i- k, S; ^( C% t7 l9 uhttps://github.com/guillaumekln/faster-whisper; i6 E6 x% j. o0 p
安装如下:* C. ?3 q8 J5 T- i8 K& o% c/ v
1, Windows 10
- ~& e+ \' s2 |' U) d2, Python 3.10.11
) N* S+ ?$ I' g. e: ] L0 J5 e" c3, CUDA 12.1
2 Y f E* q, k$ X4, 在python 3 中安装* O: X/ F( b( R* g: }
pip install setuptools-rust torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu117
3 V* U. p, K2 _4 C( Q" v% G+ M这一步最后一个安装文件 cu117-cp310-cp310-win_amd64.whl 大小2343.6 MB,如果没显示,你得检查一下你的环境。5 c! W8 m9 \- R+ A2 q
5,pip install -U openai-whisper# \0 S( ?9 B4 }0 k$ f& P- b w
这是向whisper 致敬,可以不装% \- K- f# y) `* d0 q; ^7 F& k
6,pip install faster-whisper
' M& N. k. ]; `& k0 ~5 ]----------------------------------------+ q6 T0 P- \( H- C
whisper 我用的命令行,faster-whisper 我用的是python。
7 G% S# E4 ^6 @3 K4 I( C. i f+ P下面给出了部分参考代码,根据主页上的参考代码我做了修改,但这个不是能运行的代码:- v. j$ c/ `* P
# r$ m% ?+ y9 Z4 @; r
----------------------------------------
! U) A2 N7 k, A) a# q& Q8 _6 {' z) H6 J+ N. ?* a# ~/ O
from faster_whisper import WhisperModel
# W# A) `. R% p( K+ a2 X& V& b9 B9 V( u. C% l" j
model_size = "small"5 ^0 m. w8 ~) W X& V2 M, f
" ^& W8 ^$ ~* c) L9 Wmodel = WhisperModel(model_size, device="cuda", compute_type="int8")
$ X' W3 g) P" m& G1 S2 T( ]# T! y L9 I( ^0 w
segments, info = model.transcribe(# T8 U6 N% @! U1 t! Y% g
sourceFileName,
" @& }- ?% ^/ e! c3 ~8 f. |5 J/ U beam_size=5,
! z3 J7 g% M" ^3 }6 J. {- s- k language="en", ) M: l. \: m4 n2 v% f6 q" @: f
task="transcribe",
% `6 B' ~& C8 l% ^8 @, i' f word_timestamps=True,
0 U; A% F! n% _& b- j initial_prompt = "Hello, welcome to my lecture.")- M- p" n0 E: k0 b6 b! `8 ~
7 W5 f# B1 _, d( y5 W; s" Q+ {for segment in segments:
: h( S% _! x8 B4 A print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))( n$ |$ S* j/ S7 w1 F! a; M
+ U7 g, Q9 h' J1 J
for word in segment.words:) i# ~- U% y+ E) p* o
l5 v- c/ B& p" D( ^
---------------------------------------- z6 W* ~4 ?" P( G" s( `
& q4 U3 S, Z: Y% B" `代码说明:
/ E2 I1 H% @% p1,model.transcribe 只是建立了模型,并没有运行,运行 是从 for segment in segments: 这一句开始的。" \8 {, |- Z; x* w
但是这一步很重要(废话),我的程序有时候会无征兆退出就是在这一步,没有任何错误信息,倒是Windows 侦测到,但也没给出有意义的信息。
9 j5 j% o( ^8 x5 O& I: k2,segment 本身是很粗糙的,做字幕勉强能用。( B; h2 S. m* X+ P- i5 q, N
3,word 才是真正的精确控制的,本身带时间轴,所以要做比较好的字幕,必须用到word。
: E' Q( ~9 ]. a2 @+ k4,word 里面是包含标点符号的,也就是说标点符号不是独立的,是附着在前一个word中5 }- |4 w" R7 t7 |
比如 "faster." 这个句号是和前一个单词 faster 放在同一个 word 里面的。
7 k% B% e' n) |* T, v9 _5,model.transcribe 中参数说明:
- T3 P+ w- c' f' Y% H( \# Q+ Z" D你要是对 whisper 的参数有所了解的话,基本上这些参数就是对应whisper 的参数0 Z! X* r$ R; s! i: d
其中! c, {. t! y9 m, U" U0 }2 r
word_timestamps=True, ; x$ y5 n8 t. l6 T
保证了你能拿到 word,否则是拿不到的
2 C8 h: g9 B7 e- o initial_prompt = "Hello, welcome to my lecture.")
+ D6 A/ }. |6 l# Z* ]2 f3 T, D5 U' `$ i保证能尽可能准确的断句 punctuation,但是不是决定性的。& Q" N. b8 y, P5 n
其他参数可参考源文件:
$ ?+ Q( i9 p& D1 W5 A9 {/ f, j+ chttps://github.com/guillaumekln/ ... isper/transcribe.py; ]* ~% g2 d7 Z( h6 |
152 def transcribe(. G) _" ~9 t4 {/ ^2 A. G- k X
从源文件你可以看到是支持中文的句号断句的。
2 l& O& l- a0 I P* l. N$ {0 s
+ O; P3 B( c. R( E6,如果要尽可能准确的 punctuation,根本办法是用比较大的模型 medium,或者更大。
/ |5 L3 |; V# E" C1 X7,我自己观察一个小时之内可以保证断句准确,再长就很可能不行,所以我的办法是切割文件到一个小时,识别后再聚合,效果不错。9 ?0 Q8 \/ ~& O* a
8,faster-whisper 会上传一些信息,检测到不停的使用网络,曾经有一次代码出错就是访问网络,你要是有洁癖就把网络暂时给关了。
8 W/ [) x% f7 K
- N$ T7 Q7 n2 x. k # Y y$ |" ~) R4 b" S
7 N$ l2 P% [% ?+ f; G
|
评分
-
查看全部评分
|