爱吱声

标题: faster-whisper 更快的语音到文字的识别 ASR [打印本页]

作者: nanimarcus    时间: 2023-6-4 02:10
标题: faster-whisper 更快的语音到文字的识别 ASR
本帖最后由 nanimarcus 于 2023-6-4 02:24 编辑 3 t" i8 f! W! y6 d5 \" @

' w0 @( P5 B, L3 z( a8 k借着 chatGPT 这股热潮研究了一下 Whisper,学名叫 automatic speech recognition (ASR) ,就是转换声音到文字的。
) T. x* y3 l+ y4 D' K: K效果我是很满意的,唯一不满的是速度,在六年前的主流显卡上基本上是一倍速,基本上只用在自己特别喜欢的媒体文件上了。3 ]2 ^' h0 R$ W
----------------------------------------
3 q3 V9 k$ R0 n3 T; u3 c. s显然不满意的不是我一个,活雷锋很快就出来了,名字很谦虚也很霸气 faster-whisper。. [9 a# [. ~  T# o
在六年前主力显卡3G内存上,model small,能跑到12倍速,这个是相当满意了。& p% [7 _8 m, U0 h/ a3 g' g) p
----------------------------------------
: K$ G" q& ]# C( {https://github.com/guillaumekln/faster-whisper
9 ?! E# Z1 L' C' X: q安装如下:& a% }  T  w7 c( [
1, Windows 103 m; k$ m) w1 j* k8 C
2, Python 3.10.114 {5 x# |" Q& F  H! P# F
3, CUDA 12.1
: [! _) B0 {$ |  F9 z4, 在python 3 中安装$ B( W  p' H1 A3 Z5 X
pip install setuptools-rust torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu117# ^8 D6 m/ R7 J( {$ a
这一步最后一个安装文件 cu117-cp310-cp310-win_amd64.whl 大小2343.6 MB,如果没显示,你得检查一下你的环境。
* K5 _5 E! j* B0 [2 P1 M) i5,pip install -U openai-whisper( f4 l2 V  W* c* b6 {
这是向whisper 致敬,可以不装- C: u: k- ~3 Z& S, H
6,pip install faster-whisper
3 m! N5 s& l3 ~& v----------------------------------------8 b6 L+ a$ n! E& S% Z; W
whisper 我用的命令行,faster-whisper 我用的是python。+ P2 d  K4 c  P% R( w3 T, a
下面给出了部分参考代码,根据主页上的参考代码我做了修改,但这个不是能运行的代码:. |7 \" L, R4 T: H  J8 \9 M; Z
+ C$ {9 T, a6 B6 ~
----------------------------------------
5 t! e# O. f8 T% }0 ~& P& J7 Z
" M8 n' n' ]' b8 n6 Gfrom faster_whisper import WhisperModel1 y$ _% Y1 S8 p, e2 ?
! i% l: e" A9 p
model_size = "small"
6 `$ r3 T( U9 U# P
' y- C6 _0 r0 tmodel = WhisperModel(model_size, device="cuda", compute_type="int8"). s. A) d5 \, |/ _) K

8 N$ [% p: I4 g2 h& bsegments, info = model.transcribe(
: A, R* ?( r1 c  X    sourceFileName,
, S8 _9 q. U, u* N2 A/ D& y    beam_size=5,
! r1 O8 @& C, `8 h+ c* l3 I8 x    language="en",
/ n  C0 A9 B: F- N, N# |    task="transcribe", & A0 @+ N8 X7 A6 s- M  }+ o0 B
    word_timestamps=True, 3 e0 L) D" g& e
    initial_prompt = "Hello, welcome to my lecture.")+ F7 ?6 [8 c3 l: V, A- I

- s' \, t: J; E. L& U; xfor segment in segments:
1 x( O- M% c! z* v: k8 V    print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))
  d' o* u  E% _) [( n: F( G) D( Q' V* G* F5 W$ @: S6 ^! \
        for word in segment.words:) R, p. m7 Z" b+ F- f
               
4 E1 O2 ?0 ~$ s! B5 |8 @' H& W----------------------------------------
( O0 t+ q% S8 }
) y4 ]) }% d( i' g" @9 |2 B代码说明:
% L1 c$ a8 _" j, m1,model.transcribe 只是建立了模型,并没有运行,运行 是从 for segment in segments: 这一句开始的。; t( y* v1 Q% D! R% S
但是这一步很重要(废话),我的程序有时候会无征兆退出就是在这一步,没有任何错误信息,倒是Windows 侦测到,但也没给出有意义的信息。
" `6 |2 s3 |" ~& d2,segment 本身是很粗糙的,做字幕勉强能用。
. ~) `4 d" J# v7 d3,word 才是真正的精确控制的,本身带时间轴,所以要做比较好的字幕,必须用到word。" Z/ E+ S7 T% J! j" C. W; L
4,word 里面是包含标点符号的,也就是说标点符号不是独立的,是附着在前一个word中
, ~% J3 s3 [. R3 T8 o# A比如 "faster." 这个句号是和前一个单词 faster 放在同一个 word 里面的。3 \6 X2 y/ ~$ E2 |7 Q# `
5,model.transcribe 中参数说明:6 s) b& w; ^2 u' _* B9 b' M
你要是对 whisper 的参数有所了解的话,基本上这些参数就是对应whisper 的参数: g% r- ]+ Z$ Z( a. U& m# n
其中
" `; B8 T% m  m7 K5 Q' a    word_timestamps=True,
# R3 x7 A2 v1 d- [* M3 n保证了你能拿到 word,否则是拿不到的2 _3 D# S% e/ s( B4 o' h; {
    initial_prompt = "Hello, welcome to my lecture."), U" Y, M6 E% I. W3 p. ~
保证能尽可能准确的断句 punctuation,但是不是决定性的。
. F; q7 X9 F6 [其他参数可参考源文件:! [( Z. b8 T5 B2 [3 J6 O
https://github.com/guillaumekln/ ... isper/transcribe.py
; _2 Q; {' a/ E% v# d152 def transcribe(
8 D( C) Z( g9 F从源文件你可以看到是支持中文的句号断句的。
+ f4 S6 G9 p& S# S( s2 f6 c. F6 v5 o' ]5 J. n( i
6,如果要尽可能准确的 punctuation,根本办法是用比较大的模型 medium,或者更大。* d1 U) q8 U, X+ n  v
7,我自己观察一个小时之内可以保证断句准确,再长就很可能不行,所以我的办法是切割文件到一个小时,识别后再聚合,效果不错。% y* ?2 e/ ]' |
8,faster-whisper 会上传一些信息,检测到不停的使用网络,曾经有一次代码出错就是访问网络,你要是有洁癖就把网络暂时给关了。
1 N0 O4 f; ^' X5 v+ y0 [9 j' [9 P9 i0 O& ]
2 h9 w* y+ v: Y% @

4 M0 B6 P  a" a2 K
作者: nanimarcus    时间: 2023-6-4 11:53
多谢各位榜爷打赏。




欢迎光临 爱吱声 (http://129.226.69.186/bbs/) Powered by Discuz! X3.2