爱吱声

标题: 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 Bhttps://github.com/guillaumekln/faster-whisper3 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  x2, Python 3.10.110 I6 E: f# ^- U3 V9 F
3, CUDA 12.1
# B& ~3 [6 [. }8 h7 l, A4, 在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! umodel_size = "small"
& m9 h' {% I7 \# f2 F8 r. x. k& n8 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.py8 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& K7,我自己观察一个小时之内可以保证断句准确,再长就很可能不行,所以我的办法是切割文件到一个小时,识别后再聚合,效果不错。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