|
本帖最后由 nanimarcus 于 2023-6-4 02:24 编辑 3 K& m1 z! Y& y3 G5 o# J8 _
' m5 ?- [* ~# N; E* U0 ]8 X
借着 chatGPT 这股热潮研究了一下 Whisper,学名叫 automatic speech recognition (ASR) ,就是转换声音到文字的。
+ G7 V8 \" x1 B- e/ [! s& b效果我是很满意的,唯一不满的是速度,在六年前的主流显卡上基本上是一倍速,基本上只用在自己特别喜欢的媒体文件上了。
; I9 A V9 z5 }' D T4 {1 {( w----------------------------------------: t8 N- b. P3 i# u* e: P5 k5 D3 h$ s
显然不满意的不是我一个,活雷锋很快就出来了,名字很谦虚也很霸气 faster-whisper。; I5 r/ S+ q& m
在六年前主力显卡3G内存上,model small,能跑到12倍速,这个是相当满意了。4 y+ v' d" v8 L/ g. R
----------------------------------------
1 A5 t' s2 Y0 V0 `6 S% o0 Zhttps://github.com/guillaumekln/faster-whisper
. s2 m4 g8 |0 o& H# X) u1 J# }( I安装如下:
( W, \6 H4 a* i1 v: n1, Windows 10* U) O* F$ K+ m/ W: n7 y0 X
2, Python 3.10.11
9 F. q0 {7 ]5 u3, CUDA 12.1
. }0 E! Y) i4 F- ^# ]9 O6 Z( O/ p# E4, 在python 3 中安装' F$ y4 _- U. ` H+ v/ z
pip install setuptools-rust torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu117! U: g9 M8 u$ j' r
这一步最后一个安装文件 cu117-cp310-cp310-win_amd64.whl 大小2343.6 MB,如果没显示,你得检查一下你的环境。
% Y0 y: U: X. P2 y8 e5,pip install -U openai-whisper9 g( I u7 m3 s4 x7 J
这是向whisper 致敬,可以不装1 k' H) C7 _% Q- g
6,pip install faster-whisper1 E' ]9 Z! `% H: |8 h0 B
----------------------------------------) t/ z+ F7 t2 L! N' E6 O7 J$ a; g
whisper 我用的命令行,faster-whisper 我用的是python。% A' ?/ d0 l, o! A* v/ G
下面给出了部分参考代码,根据主页上的参考代码我做了修改,但这个不是能运行的代码:. t2 X- C# m! p" A
' _7 _, M0 j9 e7 o----------------------------------------( i0 c+ t9 m( [- ~4 Q; Z! j
' R" I$ Y4 x% U3 Tfrom faster_whisper import WhisperModel
' ^5 z6 @, L' S3 j7 u# Q% h
; [2 R! R- D/ T3 }$ nmodel_size = "small"
8 g+ y0 T2 K* e! y r" N1 ?2 F! n5 }1 j2 ]/ O5 [/ D9 w8 R+ t
model = WhisperModel(model_size, device="cuda", compute_type="int8")
; {3 r( g, D8 N- c2 \9 w* O
! S( r* ^: y& t# L; \segments, info = model.transcribe(4 u5 X0 f3 _7 Q) I6 j7 H: V" R
sourceFileName,
3 K0 i$ _2 Q& i5 x8 L& D beam_size=5,
5 z4 d8 {( W5 V/ D2 k6 e1 F language="en",
) Q6 q: s3 R9 z5 w8 j task="transcribe",
! A) P- x2 N' `0 s- w5 p/ d/ }# U word_timestamps=True, 0 q* D& M$ d. [; E. i4 I
initial_prompt = "Hello, welcome to my lecture.")4 {( b2 z# t& ]" }9 m% [
5 Q" `* X- m5 x2 f* k: hfor segment in segments:* D. a3 {, `' D6 R" v" r
print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))4 s' }( F0 R) F J t0 k" q
: j) { @" y& x* N7 w
for word in segment.words:
7 X6 Z* q: |) U
" ~$ Q1 q4 H: Y/ c! S- _; {% S----------------------------------------/ v3 e/ A- o* w3 A F
# W7 a8 z& m/ r1 K
代码说明:
+ P9 U* ]: b$ h4 a# X& W5 [2 E1,model.transcribe 只是建立了模型,并没有运行,运行 是从 for segment in segments: 这一句开始的。, S0 a( {, Q1 a4 n4 x
但是这一步很重要(废话),我的程序有时候会无征兆退出就是在这一步,没有任何错误信息,倒是Windows 侦测到,但也没给出有意义的信息。9 X; i, M# |9 s0 t
2,segment 本身是很粗糙的,做字幕勉强能用。. M1 P G2 h. G1 m$ G7 V' |
3,word 才是真正的精确控制的,本身带时间轴,所以要做比较好的字幕,必须用到word。( t% I& i! j" \ _- v
4,word 里面是包含标点符号的,也就是说标点符号不是独立的,是附着在前一个word中
4 m. I; e( N1 P* \比如 "faster." 这个句号是和前一个单词 faster 放在同一个 word 里面的。
; W2 E% u% l* k5,model.transcribe 中参数说明:
3 @8 {( w7 h, e2 h- j你要是对 whisper 的参数有所了解的话,基本上这些参数就是对应whisper 的参数
% s. Y( \* q, x C8 I: L8 b0 }# z其中
2 P a I. Y8 X/ ?' } word_timestamps=True,
& p2 {+ D0 T A" N保证了你能拿到 word,否则是拿不到的3 F1 Q" {$ M' w3 f* ]0 w
initial_prompt = "Hello, welcome to my lecture.")
/ P3 w7 x) } J$ ~! B$ l保证能尽可能准确的断句 punctuation,但是不是决定性的。$ F9 ^0 R3 B+ K/ {
其他参数可参考源文件:
6 x5 z8 h3 S; D7 s+ |$ m8 e2 Ghttps://github.com/guillaumekln/ ... isper/transcribe.py7 s0 @) h1 f+ H- [# f# M& F; J
152 def transcribe(7 G, L, m6 @8 W- N. |3 d+ S4 R# @
从源文件你可以看到是支持中文的句号断句的。
% V4 Q; k6 O: `8 ]. H! {: ^7 o3 O$ F) Z# h. D9 E
6,如果要尽可能准确的 punctuation,根本办法是用比较大的模型 medium,或者更大。
" u3 M6 f/ }, F& N( z7 A7,我自己观察一个小时之内可以保证断句准确,再长就很可能不行,所以我的办法是切割文件到一个小时,识别后再聚合,效果不错。
1 Q, W! p9 O4 I" E/ s2 T; G6 A8,faster-whisper 会上传一些信息,检测到不停的使用网络,曾经有一次代码出错就是访问网络,你要是有洁癖就把网络暂时给关了。, I! Q3 B1 C7 e4 f6 \' l( S1 b4 Z# i
0 e+ a( n6 J. V, L9 z+ ], }
+ I0 }3 h y* Q, |/ S: \
% G; a z, A7 g; N; U) g+ h5 M |
评分
-
查看全部评分
|