爱吱声
标题:
faster-whisper 更快的语音到文字的识别 ASR
[打印本页]
作者:
nanimarcus
时间:
2023-6-4 02:10
标题:
faster-whisper 更快的语音到文字的识别 ASR
本帖最后由 nanimarcus 于 2023-6-4 02:24 编辑
8 h7 U1 }0 u; d, X5 i6 r
& M: ~# j8 U/ K" J7 W7 ~6 ~
借着 chatGPT 这股热潮研究了一下 Whisper,学名叫 automatic speech recognition (ASR) ,就是转换声音到文字的。
% Y7 Z% ~ B8 ?7 I, S
效果我是很满意的,唯一不满的是速度,在六年前的主流显卡上基本上是一倍速,基本上只用在自己特别喜欢的媒体文件上了。
2 e+ |. e8 d+ t& i. E5 Q) k
----------------------------------------
( C- B- ~# p. x7 [+ C
显然不满意的不是我一个,活雷锋很快就出来了,名字很谦虚也很霸气 faster-whisper。
% ?$ S1 O- {" r( Y# Q" x3 ~) G
在六年前主力显卡3G内存上,model small,能跑到12倍速,这个是相当满意了。
) F/ B4 M! b" [2 f) u$ h3 I& X
----------------------------------------
8 b8 k9 G4 v) z- b
https://github.com/guillaumekln/faster-whisper
" J2 O& M7 M4 B" L
安装如下:
2 B; F- e( E3 m/ E
1, Windows 10
0 P' {& t+ Q6 b- |5 M2 z& k7 J+ @9 H" }
2, Python 3.10.11
9 y* o* ?; c8 E5 ?! y, U
3, CUDA 12.1
4 D2 y7 G$ k0 x6 Q# T
4, 在python 3 中安装
& G' ^0 l9 t% ?& z
pip install setuptools-rust torch torchvision torchaudio --extra-index-url
https://download.pytorch.org/whl/cu117
8 f! n: _& Z4 X5 i/ p/ z* t8 Q
这一步最后一个安装文件 cu117-cp310-cp310-win_amd64.whl 大小2343.6 MB,如果没显示,你得检查一下你的环境。
+ n ]( N4 U, ?2 C9 k9 F' O
5,pip install -U openai-whisper
% |( T# c+ ]$ D5 c# X4 o
这是向whisper 致敬,可以不装
# h i# p" K, Y3 X2 h
6,pip install faster-whisper
8 T8 o' A# e1 \9 A
----------------------------------------
, g |, c0 [ X+ U6 O
whisper 我用的命令行,faster-whisper 我用的是python。
( V/ b- L; T Q0 R) W; G
下面给出了部分参考代码,根据主页上的参考代码我做了修改,但这个不是能运行的代码:
# }: ^0 g! q# O. R
2 |/ @* T" N9 a3 p% E! a
----------------------------------------
& {/ f2 J C* F' F! t
( j+ |! h2 a. G. i4 J% X8 x
from faster_whisper import WhisperModel
. [3 {7 ]- ^+ n% I4 ]- d0 j
0 |; j0 s5 E3 }( z) h
model_size = "small"
* M/ U) ]/ V1 p( ~- d$ C: T4 A
- k; w e; k% j8 P6 e
model = WhisperModel(model_size, device="cuda", compute_type="int8")
0 d$ a+ o- z. Q2 q- V
4 f: A7 ~- n+ D. O- M: s1 }
segments, info = model.transcribe(
( K) Z" T) ]" X
sourceFileName,
7 }. N8 K- g6 b2 ]
beam_size=5,
% Q/ L) Z, k. g/ N2 D
language="en",
; W; P2 x: u9 u1 d, m/ @' Y! h
task="transcribe",
. t* I& O; \# h6 l
word_timestamps=True,
* {. _2 t; t8 E5 d: d( A
initial_prompt = "Hello, welcome to my lecture.")
& u; U5 s4 B8 u3 n8 e8 Q
4 N: F0 N( O# Y% g: F4 E
for segment in segments:
9 q( P0 i7 ^0 C4 W2 L
print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))
" {3 W. t$ S4 v d8 k% P+ v0 d
y0 k: m$ i+ f! D B9 n# ^3 f. A
for word in segment.words:
: J8 @( x1 R* J% u9 B0 V
: H5 b! f# i6 n9 X5 J4 {% L
----------------------------------------
{; B$ t) _# ?! U
4 J3 Z0 z Y8 G# {% S w
代码说明:
- x1 g0 k. I& l6 K% ]9 L1 x
1,model.transcribe 只是建立了模型,并没有运行,运行 是从 for segment in segments: 这一句开始的。
) V# ?" \+ k% j) Q% K
但是这一步很重要(废话),我的程序有时候会无征兆退出就是在这一步,没有任何错误信息,倒是Windows 侦测到,但也没给出有意义的信息。
' W6 Y. f4 _6 p. U1 D9 p( p
2,segment 本身是很粗糙的,做字幕勉强能用。
# I3 x. A; v5 w. G2 h7 t+ k
3,word 才是真正的精确控制的,本身带时间轴,所以要做比较好的字幕,必须用到word。
9 P" |* ?7 R0 k. ~8 a
4,word 里面是包含标点符号的,也就是说标点符号不是独立的,是附着在前一个word中
5 F) H i" a4 z% S8 D, k3 C
比如 "faster." 这个句号是和前一个单词 faster 放在同一个 word 里面的。
% {6 _2 j( Q6 l7 y* w% K
5,model.transcribe 中参数说明:
5 q- X" ]) B- s
你要是对 whisper 的参数有所了解的话,基本上这些参数就是对应whisper 的参数
$ I4 [$ x+ P7 x, x+ O
其中
- B' |/ s9 L! s. H6 l0 Y5 h
word_timestamps=True,
& m. U8 r8 g" a/ i* N. Z
保证了你能拿到 word,否则是拿不到的
8 I7 ]: w; Y6 D1 S( y
initial_prompt = "Hello, welcome to my lecture.")
# I* r2 i- x: p' w' B
保证能尽可能准确的断句 punctuation,但是不是决定性的。
( O# R J+ A$ b) C# k f
其他参数可参考源文件:
& h, ~% N) X; a# f1 U8 ^, V
https://github.com/guillaumekln/ ... isper/transcribe.py
3 Z9 V% Z8 ~2 p: N6 ]6 H
152 def transcribe(
* t3 _% W9 B7 _5 d, L: r! Z2 [) X1 d
从源文件你可以看到是支持中文的句号断句的。
. Z# o5 S$ @7 E, I' j# H% C
2 w2 O3 \/ s; D2 X& G( q% O
6,如果要尽可能准确的 punctuation,根本办法是用比较大的模型 medium,或者更大。
. o# ?3 q4 W% }& t) A$ Q
7,我自己观察一个小时之内可以保证断句准确,再长就很可能不行,所以我的办法是切割文件到一个小时,识别后再聚合,效果不错。
6 B y) W7 [' y% a, Y% v
8,faster-whisper 会上传一些信息,检测到不停的使用网络,曾经有一次代码出错就是访问网络,你要是有洁癖就把网络暂时给关了。
1 ^) C% w' L- ~
! D8 L1 C2 q5 b
) H; e6 P2 W" t" X9 k) g8 B
: \+ _ j* p, M c$ J
作者:
nanimarcus
时间:
2023-6-4 11:53
多谢各位榜爷打赏。
欢迎光临 爱吱声 (http://129.226.69.186/bbs/)
Powered by Discuz! X3.2