爱吱声
标题:
faster-whisper 更快的语音到文字的识别 ASR
[打印本页]
作者:
nanimarcus
时间:
2023-6-4 02:10
标题:
faster-whisper 更快的语音到文字的识别 ASR
本帖最后由 nanimarcus 于 2023-6-4 02:24 编辑
# s: p& r% }, m2 w6 [* R
; s& s/ f2 s( ]' `
借着 chatGPT 这股热潮研究了一下 Whisper,学名叫 automatic speech recognition (ASR) ,就是转换声音到文字的。
* f- f4 J) \$ C0 K$ i% N% Y
效果我是很满意的,唯一不满的是速度,在六年前的主流显卡上基本上是一倍速,基本上只用在自己特别喜欢的媒体文件上了。
4 j$ ]* ?: d1 ^4 D M' @/ k' ?1 P9 I
----------------------------------------
' l, q8 a; ` @0 G, N9 T7 s. B- @
显然不满意的不是我一个,活雷锋很快就出来了,名字很谦虚也很霸气 faster-whisper。
& J# H% d: z) R8 u7 y& B2 ~: d, e
在六年前主力显卡3G内存上,model small,能跑到12倍速,这个是相当满意了。
8 G6 b$ j, k, K1 {8 H+ s
----------------------------------------
. k" _8 v( ?9 C7 Z2 B
https://github.com/guillaumekln/faster-whisper
3 N7 ~& m' P+ R5 U/ m& D2 I! F
安装如下:
0 y* \6 D s: z" L! X
1, Windows 10
6 S4 h2 p# `3 b+ H$ x x
2, Python 3.10.11
0 I6 E: f# ^- U3 V9 F
3, CUDA 12.1
# B& ~3 [6 [. }8 h7 l, A
4, 在python 3 中安装
K0 a# Q5 J' ?. E; t% T
pip install setuptools-rust torch torchvision torchaudio --extra-index-url
https://download.pytorch.org/whl/cu117
! n& v2 b7 {. v- M. P0 f
这一步最后一个安装文件 cu117-cp310-cp310-win_amd64.whl 大小2343.6 MB,如果没显示,你得检查一下你的环境。
3 O% G! I2 ^3 M0 L
5,pip install -U openai-whisper
% y' y7 S/ z" b
这是向whisper 致敬,可以不装
+ C* g* R* l4 {
6,pip install faster-whisper
T" y& q. ~) A
----------------------------------------
1 @" x& v% \4 }
whisper 我用的命令行,faster-whisper 我用的是python。
W0 y7 G7 n/ B2 K/ J# u+ Q
下面给出了部分参考代码,根据主页上的参考代码我做了修改,但这个不是能运行的代码:
3 x+ y* T3 f' k5 _
- X4 l9 F7 j5 U8 t2 b+ t+ {4 q
----------------------------------------
# E; R! |% L6 i; P
8 b; |( N/ H- L
from faster_whisper import WhisperModel
( e W0 ^4 D( p; Q9 e4 k
, X( E, {! `, b7 @& R! u
model_size = "small"
& m9 h' {% I7 \# f2 F8 r. x. k& n
8 v) j2 ^/ g! f ~
model = WhisperModel(model_size, device="cuda", compute_type="int8")
; C" S7 b& c9 j0 I4 W' \
9 U: l- q, m% s$ o) S) h# }/ _# W
segments, info = model.transcribe(
! V( [2 k F1 @( i. l9 o
sourceFileName,
( f! s0 r$ d# |
beam_size=5,
2 G# A4 Q' ~7 q. o) m
language="en",
7 q3 r& A- I& c- |& b1 p' R
task="transcribe",
6 w2 }; r& p+ F: }& N- B
word_timestamps=True,
7 N' h2 ^; U, p( y* Q9 ^* f* E: t
initial_prompt = "Hello, welcome to my lecture.")
( H; l' e1 R, S! i/ e5 a* M
$ w( Q' g% {, j$ O- ~4 i( s
for segment in segments:
P0 k" W5 B3 j2 I8 W! S: b
print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))
) i# S5 |' H8 ]; R/ D# c
! q& z2 Q A- b: K% C% V n: X
for word in segment.words:
* z! e* g( m. [
' o2 n, [0 K% S' W2 e/ r. b! ?
----------------------------------------
+ n( e6 T8 _( P& I% N0 J
; Z, r- k5 m; Y' [. v7 p6 N1 s
代码说明:
$ R) n9 N+ s3 u) W( F
1,model.transcribe 只是建立了模型,并没有运行,运行 是从 for segment in segments: 这一句开始的。
: L; b3 l2 ^1 h7 Q% ]
但是这一步很重要(废话),我的程序有时候会无征兆退出就是在这一步,没有任何错误信息,倒是Windows 侦测到,但也没给出有意义的信息。
3 c/ i& X/ E, d% d5 i
2,segment 本身是很粗糙的,做字幕勉强能用。
' I( p! }% Y: t$ `7 b8 _
3,word 才是真正的精确控制的,本身带时间轴,所以要做比较好的字幕,必须用到word。
; g6 L$ `# l6 c/ u( J6 }
4,word 里面是包含标点符号的,也就是说标点符号不是独立的,是附着在前一个word中
: j. C: A+ M9 Q/ }
比如 "faster." 这个句号是和前一个单词 faster 放在同一个 word 里面的。
3 F8 [+ `' n% {
5,model.transcribe 中参数说明:
6 w! X+ m& K' H' U- `7 b
你要是对 whisper 的参数有所了解的话,基本上这些参数就是对应whisper 的参数
4 M; k& O- b& I& g+ S3 E
其中
0 }# _# w; i1 j! X" Q8 n. O
word_timestamps=True,
) g4 }' J+ l, p j; m/ F1 C
保证了你能拿到 word,否则是拿不到的
, }9 d# F; {: M& k- Q1 a: u$ h
initial_prompt = "Hello, welcome to my lecture.")
; ^9 k" W+ e/ O$ ]3 _1 h
保证能尽可能准确的断句 punctuation,但是不是决定性的。
7 {9 Z8 _% V; {3 b5 f0 J
其他参数可参考源文件:
" E5 j! B2 F% n8 d% K, E" |
https://github.com/guillaumekln/ ... isper/transcribe.py
8 Q( t; a, |* i8 a- K
152 def transcribe(
. k" q8 g) Q7 t1 u5 x) X
从源文件你可以看到是支持中文的句号断句的。
6 i1 `+ H) p+ j5 @
; @$ N/ S) E p; M
6,如果要尽可能准确的 punctuation,根本办法是用比较大的模型 medium,或者更大。
5 g5 o! N2 z& K
7,我自己观察一个小时之内可以保证断句准确,再长就很可能不行,所以我的办法是切割文件到一个小时,识别后再聚合,效果不错。
2 _1 `! j& F/ w6 ?' n7 T
8,faster-whisper 会上传一些信息,检测到不停的使用网络,曾经有一次代码出错就是访问网络,你要是有洁癖就把网络暂时给关了。
; e1 E. c: B1 P- Z
/ W, { |: W6 t
) P. r4 s* W$ R+ B B
& U6 v) }0 W7 c& }
作者:
nanimarcus
时间:
2023-6-4 11:53
多谢各位榜爷打赏。
欢迎光临 爱吱声 (http://aswetalk.net/bbs/)
Powered by Discuz! X3.2