爱吱声

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

作者: nanimarcus    时间: 2023-6-4 02:10
标题: faster-whisper 更快的语音到文字的识别 ASR
本帖最后由 nanimarcus 于 2023-6-4 02:24 编辑
# ?. R" g, [# X0 Z6 M9 v4 s/ E
  z/ \+ |7 w2 P7 D' w' b. R# i借着 chatGPT 这股热潮研究了一下 Whisper,学名叫 automatic speech recognition (ASR) ,就是转换声音到文字的。
) P1 W8 O  J2 s3 C" @效果我是很满意的,唯一不满的是速度,在六年前的主流显卡上基本上是一倍速,基本上只用在自己特别喜欢的媒体文件上了。
+ j; m- h. s: q----------------------------------------
* J1 W- ~0 B1 C6 v显然不满意的不是我一个,活雷锋很快就出来了,名字很谦虚也很霸气 faster-whisper。9 [/ y! b; f6 I" L- w2 H
在六年前主力显卡3G内存上,model small,能跑到12倍速,这个是相当满意了。
5 f: z6 v" a+ Q* j5 i----------------------------------------2 W4 [/ D& P' z8 G$ V
https://github.com/guillaumekln/faster-whisper8 _6 V3 ^1 _- b1 e0 Q
安装如下:
9 ]2 D% J$ y& P3 b. z" x1, Windows 10
9 w/ u1 N& v. l' b2, Python 3.10.112 {( L2 F- }: F8 h1 V1 A; g
3, CUDA 12.1
) T2 H% _7 o7 b5 F; q6 i, T- f4, 在python 3 中安装
0 }1 A) U; z) g# dpip install setuptools-rust torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu117
/ r# ]% |: [3 W4 f9 Q& C2 A& x: z这一步最后一个安装文件 cu117-cp310-cp310-win_amd64.whl 大小2343.6 MB,如果没显示,你得检查一下你的环境。
. |  l' s! ^2 j+ D: K5,pip install -U openai-whisper
6 n  {( f! s* l; P; _这是向whisper 致敬,可以不装& r" i" Y$ {0 N1 [
6,pip install faster-whisper; _4 m6 X! ?) t3 V* q. e, i( K* n3 h
----------------------------------------
1 V; N# u: z- X  s* F  Ewhisper 我用的命令行,faster-whisper 我用的是python。" a( o  m$ _2 }2 N. Y* }" y- q
下面给出了部分参考代码,根据主页上的参考代码我做了修改,但这个不是能运行的代码:1 J, }# W& r6 n$ i+ D( s  e9 E
0 J& _# W! N1 F) W$ T* S( l" t% W
----------------------------------------2 s& N. m3 z5 i2 H

" o* C3 Q. m0 G' o& N1 Yfrom faster_whisper import WhisperModel
, c) }) \) j& ~
3 n" e; {2 d- k  rmodel_size = "small") Q1 M3 }3 l% v6 Z/ c
  M/ y5 m# c' }
model = WhisperModel(model_size, device="cuda", compute_type="int8")
+ ^. k6 q; y- \  a8 w* x9 R8 V) e% H" y  m4 S6 |3 a
segments, info = model.transcribe(
4 {$ |6 ]0 ?# D3 e    sourceFileName,
* r* b2 m4 U# l8 D! G4 s. W- m+ L    beam_size=5,
7 l& m' g9 D: ?1 D    language="en", 3 l) w; Q  v8 Q! i' k+ n
    task="transcribe", $ l8 P6 E2 w1 g8 K6 x: `; c( i* F
    word_timestamps=True,
1 @. n7 L/ j: R! _- z    initial_prompt = "Hello, welcome to my lecture."), o% i& q+ Q/ J" U8 Q

( P% Q$ d# j9 U4 i  ~for segment in segments:7 Y0 _1 F6 x* E# O( u8 B
    print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))
0 a4 B; T9 _( w8 ~3 ?  t" R- ?+ y
        for word in segment.words:
# S1 L7 p. B8 S                ' x! c3 C' r. m+ ^
----------------------------------------
# u+ B$ I5 E" t2 Z+ ~! [+ \
/ ]+ B2 m8 W+ s$ i* g, {代码说明:
" ~# o( i, [9 t% N5 W1,model.transcribe 只是建立了模型,并没有运行,运行 是从 for segment in segments: 这一句开始的。
" Y0 Z# q0 V7 U! }. Z* G6 R$ n但是这一步很重要(废话),我的程序有时候会无征兆退出就是在这一步,没有任何错误信息,倒是Windows 侦测到,但也没给出有意义的信息。
* l- z. I$ u& `' B0 |2,segment 本身是很粗糙的,做字幕勉强能用。5 V9 @+ |; v' F% ~
3,word 才是真正的精确控制的,本身带时间轴,所以要做比较好的字幕,必须用到word。3 W$ J2 N; s6 _* u* |  s
4,word 里面是包含标点符号的,也就是说标点符号不是独立的,是附着在前一个word中
, f- h! c, G6 W- w6 Y比如 "faster." 这个句号是和前一个单词 faster 放在同一个 word 里面的。
. }8 k5 T& g9 U; S5,model.transcribe 中参数说明:& Y0 e% A/ d; y% n! `) b0 D3 f" t
你要是对 whisper 的参数有所了解的话,基本上这些参数就是对应whisper 的参数
& T/ {+ c0 K0 C( H) T( q5 O; m/ G其中
6 q$ Z' O) w! i, l    word_timestamps=True, 6 z: ?9 C) a1 o! O) y' N  u  @
保证了你能拿到 word,否则是拿不到的$ x8 O* R) N2 K6 |  C
    initial_prompt = "Hello, welcome to my lecture.")( Z" a1 K( |8 ~  z
保证能尽可能准确的断句 punctuation,但是不是决定性的。
0 w  {5 e$ w" @/ {9 S其他参数可参考源文件:
/ V5 P& z. m# G& z) w+ nhttps://github.com/guillaumekln/ ... isper/transcribe.py
" }4 R8 V9 f7 `& r2 X9 d9 r7 v152 def transcribe(, D$ V& ^# h$ V8 m9 v- O
从源文件你可以看到是支持中文的句号断句的。9 ]8 u- M+ ?8 i  L/ {2 H

) [  C' P- W; L  U9 z) Q0 v0 {6,如果要尽可能准确的 punctuation,根本办法是用比较大的模型 medium,或者更大。6 ?" F: d& s; U! ]
7,我自己观察一个小时之内可以保证断句准确,再长就很可能不行,所以我的办法是切割文件到一个小时,识别后再聚合,效果不错。, Q) L  s0 n3 r1 @6 ~
8,faster-whisper 会上传一些信息,检测到不停的使用网络,曾经有一次代码出错就是访问网络,你要是有洁癖就把网络暂时给关了。  C$ c$ b- I$ p: p$ l
3 N  E( W3 P7 a$ K1 ?8 u3 p

1 Z' X8 U& Z5 w; T, U" [
: c: }# X0 I" Q5 w4 l. t% ~
作者: nanimarcus    时间: 2023-6-4 11:53
多谢各位榜爷打赏。




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