|
|
本帖最后由 nanimarcus 于 2023-6-4 02:24 编辑
: o+ S) q& f( `) U3 I+ A I) L% Q& y- h$ t1 P4 w
借着 chatGPT 这股热潮研究了一下 Whisper,学名叫 automatic speech recognition (ASR) ,就是转换声音到文字的。0 P* @9 p+ P( D6 c/ p7 Y
效果我是很满意的,唯一不满的是速度,在六年前的主流显卡上基本上是一倍速,基本上只用在自己特别喜欢的媒体文件上了。
7 V& k$ q7 n# y----------------------------------------
% I- s. I( [" O4 o& A4 {显然不满意的不是我一个,活雷锋很快就出来了,名字很谦虚也很霸气 faster-whisper。7 ?+ J. ]+ K$ ^5 t2 Z, I
在六年前主力显卡3G内存上,model small,能跑到12倍速,这个是相当满意了。0 m/ D9 G* V2 e, i
----------------------------------------# d& I" x3 m) N8 j5 |/ T8 D9 X' A
https://github.com/guillaumekln/faster-whisper
& ~& q \5 [) Y6 p安装如下:
' t d, g& F3 D; j: {1, Windows 10
& ]! ?+ q: y! J4 D6 t* s: i! n {2, Python 3.10.116 ^% b: a1 E: v1 M4 B6 X+ g
3, CUDA 12.1& q2 _7 X/ `+ F/ f2 k( ?/ V2 A7 W/ j& j
4, 在python 3 中安装
2 m4 }' g+ G2 e& y& apip install setuptools-rust torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu1177 I( y- H: J" v0 L# ?
这一步最后一个安装文件 cu117-cp310-cp310-win_amd64.whl 大小2343.6 MB,如果没显示,你得检查一下你的环境。
- I% h4 s' e" R, D5,pip install -U openai-whisper7 i" G% m3 W' N' L0 M* ?7 G5 o1 o
这是向whisper 致敬,可以不装$ Q: R. ]* Q. y2 p5 n# \
6,pip install faster-whisper' R' n5 e1 c: u# c/ W
----------------------------------------1 B' U6 l$ C: S4 B! w ^. Y# {+ h- M
whisper 我用的命令行,faster-whisper 我用的是python。6 u1 g+ Q; l% ~4 D
下面给出了部分参考代码,根据主页上的参考代码我做了修改,但这个不是能运行的代码:' R" F/ c* Q( i$ |' n# g
; E. m2 F( a. z9 F4 l----------------------------------------+ G2 u6 G. K6 F3 d+ i
6 D) W! F0 b9 A; {# }7 g3 y7 \
from faster_whisper import WhisperModel
2 E# L, ]4 ?/ Q( p2 t+ `- y- ?
- `2 b3 e$ v( M) M' w2 jmodel_size = "small"
R% v- A. ?4 S6 r9 e& H9 |+ i
6 i" Y4 j+ ]' [7 xmodel = WhisperModel(model_size, device="cuda", compute_type="int8")' b4 F# Z$ o* Y4 B7 i
M* U4 N( ~) f$ I& Z/ O
segments, info = model.transcribe(* t& R9 Z$ P; d1 ?
sourceFileName, ) m2 a/ C* Q0 I
beam_size=5, ; B* \4 B- I0 u% F
language="en",
+ \" _+ a* V/ F( ]# G task="transcribe", # Y& H+ n0 H$ C0 D$ a; [$ a
word_timestamps=True, 9 K4 c* r4 {" j$ c. f1 r0 d
initial_prompt = "Hello, welcome to my lecture.")! Y8 E- j/ W( u% G6 Y
4 P! l' ~% {& A: ~! kfor segment in segments:& e* D4 y; [! e: W! h- i
print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text)) f u$ J$ q# a9 M5 e: `
; P6 E' o) W: }# q
for word in segment.words:
! w" e0 B; A# N6 f $ }! L' q& K0 R" }+ Z3 v2 N
----------------------------------------" Q8 }2 i$ L; c4 W. J+ n! X* f' i/ {
! Y7 I, C `" U, E6 v: {代码说明:
5 C4 e" r' q9 v. {1,model.transcribe 只是建立了模型,并没有运行,运行 是从 for segment in segments: 这一句开始的。
. x+ R$ f, m6 q* A但是这一步很重要(废话),我的程序有时候会无征兆退出就是在这一步,没有任何错误信息,倒是Windows 侦测到,但也没给出有意义的信息。3 ^( E) j) C) c4 m
2,segment 本身是很粗糙的,做字幕勉强能用。2 X" X1 ?+ ]$ W# d) P
3,word 才是真正的精确控制的,本身带时间轴,所以要做比较好的字幕,必须用到word。
- k/ Y c7 f! y5 H6 G4,word 里面是包含标点符号的,也就是说标点符号不是独立的,是附着在前一个word中, \1 ?9 j* T y: Z* m$ |
比如 "faster." 这个句号是和前一个单词 faster 放在同一个 word 里面的。
+ C) \4 h2 @3 }9 F5,model.transcribe 中参数说明:2 I5 a) _# L& d
你要是对 whisper 的参数有所了解的话,基本上这些参数就是对应whisper 的参数
( X/ b7 ?- M3 D" K' H# M6 F6 S其中/ P6 T( H; G& X+ k2 M
word_timestamps=True, 5 i- ?) x8 \- x# u
保证了你能拿到 word,否则是拿不到的
' B$ d' O0 M% z; U initial_prompt = "Hello, welcome to my lecture.")" X: P" Z' m9 a2 Y) y8 f
保证能尽可能准确的断句 punctuation,但是不是决定性的。
. N7 v4 G/ y, r* [" h) ?其他参数可参考源文件:/ ^9 }! A& z6 P" {+ o, J
https://github.com/guillaumekln/ ... isper/transcribe.py
5 Q, g9 d% o2 f7 W152 def transcribe(: y! [- n# |8 _. S5 O1 v
从源文件你可以看到是支持中文的句号断句的。0 f5 W; c3 j0 Z0 n5 w
: [9 g% h: g; c) l Z6,如果要尽可能准确的 punctuation,根本办法是用比较大的模型 medium,或者更大。, }5 J5 k, e5 F: V4 Z
7,我自己观察一个小时之内可以保证断句准确,再长就很可能不行,所以我的办法是切割文件到一个小时,识别后再聚合,效果不错。
- @& a0 s7 P* u5 ?+ u( H9 t8,faster-whisper 会上传一些信息,检测到不停的使用网络,曾经有一次代码出错就是访问网络,你要是有洁癖就把网络暂时给关了。
; M+ ~5 s, s) k3 a5 P7 X
( S7 v; N( r0 ~+ |/ _ & ~/ b; o0 G8 b4 r7 L
& a" q; ]/ S: T6 ~+ h- L |
评分
-
查看全部评分
|