|
|
本帖最后由 nanimarcus 于 2023-6-4 02:24 编辑 0 m$ d7 `8 ]9 I: g1 y8 O7 R% ^
# h/ {( F8 S" Q0 }2 b7 m* b7 u
借着 chatGPT 这股热潮研究了一下 Whisper,学名叫 automatic speech recognition (ASR) ,就是转换声音到文字的。. {+ z- D q5 D5 D* ?
效果我是很满意的,唯一不满的是速度,在六年前的主流显卡上基本上是一倍速,基本上只用在自己特别喜欢的媒体文件上了。0 D8 Q$ p4 Z4 _0 R
----------------------------------------
5 N3 i3 Q) p' E7 U, a显然不满意的不是我一个,活雷锋很快就出来了,名字很谦虚也很霸气 faster-whisper。/ i2 c B- j, w* Y6 r& D
在六年前主力显卡3G内存上,model small,能跑到12倍速,这个是相当满意了。
6 \0 z3 d* t3 M6 m( ]" a& L$ w----------------------------------------
7 B% U3 B* ~, L* whttps://github.com/guillaumekln/faster-whisper
$ y3 @5 |. M# G: P) U9 u- X安装如下:
( H: N9 j* t( {1, Windows 108 `0 K" K! C# G* ~, H& u3 U
2, Python 3.10.11
4 V) P2 I; `' H0 t( p" f+ B3, CUDA 12.10 {' U3 S( X! n3 i) S6 h2 l
4, 在python 3 中安装
7 H2 h0 ]& j% x+ `6 X3 i \5 L& lpip install setuptools-rust torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu117
) v$ z, z7 g" u# J% M3 N4 v这一步最后一个安装文件 cu117-cp310-cp310-win_amd64.whl 大小2343.6 MB,如果没显示,你得检查一下你的环境。
D# w2 E& ]$ J+ i3 w; w5,pip install -U openai-whisper
. M$ X) n! N6 C: C这是向whisper 致敬,可以不装1 V6 Z, u/ n* g- z( r) \# E4 i3 R ^
6,pip install faster-whisper
. [: f$ V- L# _----------------------------------------
0 g) O: M% e0 ]; O( \7 m% dwhisper 我用的命令行,faster-whisper 我用的是python。7 W( `# A+ ^- k# O+ D2 [ X; p1 \
下面给出了部分参考代码,根据主页上的参考代码我做了修改,但这个不是能运行的代码:
$ s! `6 w& W+ ?: V
3 D9 }# q1 r" t/ q+ [9 o5 A----------------------------------------
: N4 a' l' v! `: u) E
: ?; ^. U7 J- g0 Bfrom faster_whisper import WhisperModel
' T( K$ J& S: R* e3 u# h
5 s9 Z. w0 G" P8 smodel_size = "small"
2 t1 \2 x) Z- B6 B9 F# g2 C" x- t) V% Y6 u( s1 i* r" E
model = WhisperModel(model_size, device="cuda", compute_type="int8")
) W+ f r V( E {% n- Q/ x) G
: W2 ^+ A' S# g) [: Tsegments, info = model.transcribe(
; Q# Y* M- k2 g" w8 g/ A0 Z; e sourceFileName,
& t2 G* y4 c ?) v! a z7 s beam_size=5, & ~; @0 @2 O9 s) p% H
language="en",
+ s2 m4 D) _/ s7 n! `4 p task="transcribe",
0 {0 {$ h8 o2 h) e word_timestamps=True,
4 n: A) t, L8 w# z initial_prompt = "Hello, welcome to my lecture.")
$ G3 g7 k! t5 F: x A* O
) E R- R9 m/ cfor segment in segments:
" T5 _1 z |5 R7 @ print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))
! B, D! c0 d( T, x, M; H/ W+ Q0 X6 x1 ]7 g5 O' ~6 ~2 P
for word in segment.words:
4 |* T5 m3 S: m) G
6 {6 q" g& W8 @. H: z' x----------------------------------------
! j) \ @1 g" [8 v/ }! ~ Y+ ]+ V4 X& N2 v. `6 W- F* b4 N+ a. Q- `- o
代码说明:
$ Q, c9 p. V d6 m" k) Q) Z0 o1,model.transcribe 只是建立了模型,并没有运行,运行 是从 for segment in segments: 这一句开始的。 r' `* k( g; r' p5 H5 }$ V0 g
但是这一步很重要(废话),我的程序有时候会无征兆退出就是在这一步,没有任何错误信息,倒是Windows 侦测到,但也没给出有意义的信息。1 Q& p/ O0 q. U
2,segment 本身是很粗糙的,做字幕勉强能用。
r) J9 W& o( t1 n1 w. V, F3,word 才是真正的精确控制的,本身带时间轴,所以要做比较好的字幕,必须用到word。3 x& {1 B9 w7 L; H% f
4,word 里面是包含标点符号的,也就是说标点符号不是独立的,是附着在前一个word中( Q3 T$ D: T6 D% } a9 q
比如 "faster." 这个句号是和前一个单词 faster 放在同一个 word 里面的。. ? B2 Q+ n: y5 |& r' H$ J. L2 D
5,model.transcribe 中参数说明:
4 i& p" f2 ]' r( {, r6 o你要是对 whisper 的参数有所了解的话,基本上这些参数就是对应whisper 的参数
- @( N) Y8 \" w* b/ x9 ]其中
/ h. {% q( p" A) o2 Q. D word_timestamps=True,
) q, }; K, G! F保证了你能拿到 word,否则是拿不到的. b" h& q) J/ A4 w% o: o. y! ]( u9 n
initial_prompt = "Hello, welcome to my lecture.")& I! t4 F% ], E/ |* }, B
保证能尽可能准确的断句 punctuation,但是不是决定性的。3 m/ _& l5 {! l" F0 F+ A
其他参数可参考源文件:2 v: F m2 \0 n% ]% @8 u. l5 O
https://github.com/guillaumekln/ ... isper/transcribe.py6 E4 D: z1 e" C5 t+ [0 i8 [! l
152 def transcribe(
" v, X' _7 W" \+ b1 s从源文件你可以看到是支持中文的句号断句的。
2 @5 o1 t0 V/ m: z& F$ k% e4 m) T/ z! ?( ]0 {
6,如果要尽可能准确的 punctuation,根本办法是用比较大的模型 medium,或者更大。
& @- a# Z' ?; e7,我自己观察一个小时之内可以保证断句准确,再长就很可能不行,所以我的办法是切割文件到一个小时,识别后再聚合,效果不错。
3 `- A# S1 g; c; _! n8,faster-whisper 会上传一些信息,检测到不停的使用网络,曾经有一次代码出错就是访问网络,你要是有洁癖就把网络暂时给关了。
8 k" N: W' ]* ^3 Y0 G+ s- s' N' A# [4 E+ J, M& l, \4 r5 L7 M
6 T) \7 c, u& `# P" {( Q [5 D9 G V/ q' c; {! Y! v
|
评分
-
查看全部评分
|