爱吱声

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

作者: nanimarcus    时间: 2023-6-4 02:10
标题: faster-whisper 更快的语音到文字的识别 ASR
本帖最后由 nanimarcus 于 2023-6-4 02:24 编辑 " \1 ~  K4 t0 c6 T2 p

: l! U. z! c4 u" s8 y( j" |0 o4 E) b& E借着 chatGPT 这股热潮研究了一下 Whisper,学名叫 automatic speech recognition (ASR) ,就是转换声音到文字的。
- G" Z- C8 W. x! A& V! d效果我是很满意的,唯一不满的是速度,在六年前的主流显卡上基本上是一倍速,基本上只用在自己特别喜欢的媒体文件上了。0 `9 D4 O: p, o4 J; P7 Y
----------------------------------------
, j, Y4 l1 `" N. }显然不满意的不是我一个,活雷锋很快就出来了,名字很谦虚也很霸气 faster-whisper。- t! R. i+ G/ B# C: P
在六年前主力显卡3G内存上,model small,能跑到12倍速,这个是相当满意了。; e7 b% t1 i; ~. y
----------------------------------------
9 i- E7 y; d1 |+ F" ^* [: Thttps://github.com/guillaumekln/faster-whisper
) D, q2 A( M$ s0 Y安装如下:
# [7 `1 K2 T6 n/ z1, Windows 10  @# h* m0 V5 o/ \+ d
2, Python 3.10.11
" i+ L1 J" `, {$ X8 L% O3, CUDA 12.1( ]: O+ U' ~7 m9 @
4, 在python 3 中安装
7 c  @) O! M! q  y6 Q4 ?8 A, r. Ypip install setuptools-rust torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu117
1 T4 H+ q5 j' C) `4 M这一步最后一个安装文件 cu117-cp310-cp310-win_amd64.whl 大小2343.6 MB,如果没显示,你得检查一下你的环境。5 |+ @1 Z/ u& D
5,pip install -U openai-whisper
' z0 G, ^! |6 K这是向whisper 致敬,可以不装
+ u  a" f  j$ N$ V1 V  W' y3 g6,pip install faster-whisper% @/ l- Y  b- `) m
----------------------------------------
" K$ ]/ |0 F) g! e0 Mwhisper 我用的命令行,faster-whisper 我用的是python。  X; r% o* o+ c$ I. n7 x8 f
下面给出了部分参考代码,根据主页上的参考代码我做了修改,但这个不是能运行的代码:, v' R5 _1 S- A- o3 ?
0 J! Z6 ?8 F3 M
----------------------------------------' _0 \- {7 f# W+ S

& r: c9 p+ J+ ~! d2 T2 ?4 nfrom faster_whisper import WhisperModel. F& N( j7 ~6 S+ `" ~

# m0 t, a& s# r; ?% z; Bmodel_size = "small"/ ?* q; ~) I; U% K

7 m$ H, r  \2 k1 o: j8 W$ f2 hmodel = WhisperModel(model_size, device="cuda", compute_type="int8")' A. n7 h5 z, \  w1 B! |0 ~7 R( N

0 `% B- K; x" s. j  tsegments, info = model.transcribe(
6 g  k; `6 E. L( `. G4 Z/ k    sourceFileName,
( e) q- E* a6 M. @3 w7 i  i4 J    beam_size=5,
0 {: ~& c8 v$ z4 O" `    language="en",   T0 |7 @& e$ o# x8 M) P
    task="transcribe", $ L. a: S) R4 ]1 N
    word_timestamps=True,
1 u3 F- O* r+ f) `# W$ B    initial_prompt = "Hello, welcome to my lecture.")
$ N9 s) }4 z) s% ]& }, e9 m8 k; @' g8 I; ~
for segment in segments:- S, Y) f7 V  x! C4 K
    print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))
: A6 G, w; ?% B) U! U
" T. ^( Q* @: m& a6 g        for word in segment.words:
! b' _0 d) s% |* m; O                  D, g7 E. m- L1 A
----------------------------------------3 M0 D6 ~4 ~0 \$ r/ \$ l

/ Y) H  ?5 @6 u代码说明:
* a! L8 o9 \, E1,model.transcribe 只是建立了模型,并没有运行,运行 是从 for segment in segments: 这一句开始的。8 y( D4 P9 H5 u4 T
但是这一步很重要(废话),我的程序有时候会无征兆退出就是在这一步,没有任何错误信息,倒是Windows 侦测到,但也没给出有意义的信息。
  v6 v( B9 Z( e2 E$ V2,segment 本身是很粗糙的,做字幕勉强能用。/ J1 [  G  ?7 {0 A3 x3 M4 `% ~/ v
3,word 才是真正的精确控制的,本身带时间轴,所以要做比较好的字幕,必须用到word。$ b& D4 C8 W! F* M
4,word 里面是包含标点符号的,也就是说标点符号不是独立的,是附着在前一个word中4 C4 @/ y+ b. d+ R
比如 "faster." 这个句号是和前一个单词 faster 放在同一个 word 里面的。
) v% T$ U) L! L! v6 h5,model.transcribe 中参数说明:
; d: B5 F( T2 V" `; R% l, [6 l你要是对 whisper 的参数有所了解的话,基本上这些参数就是对应whisper 的参数1 N' B, x- q. o! {( f3 `
其中+ I6 {6 L$ F# S/ K" g: s
    word_timestamps=True,
! p3 B& C. R: d9 l4 j. `3 T5 b) ?7 y- Z保证了你能拿到 word,否则是拿不到的
) c9 A& C7 }! x4 e& ^    initial_prompt = "Hello, welcome to my lecture.")
" {" r* X9 s4 J5 r$ `" m; J保证能尽可能准确的断句 punctuation,但是不是决定性的。
: H  u$ R$ j4 |4 P9 B+ U5 E其他参数可参考源文件:7 U" h7 W+ U- |' v
https://github.com/guillaumekln/ ... isper/transcribe.py& I5 G. g& _2 ~1 z8 {
152 def transcribe(
* T0 L! o) W3 |4 h. f从源文件你可以看到是支持中文的句号断句的。
4 w7 r! Q2 A2 t4 F$ l) M) _  L4 U
0 `% T6 a6 C' n; j9 y/ B, c6,如果要尽可能准确的 punctuation,根本办法是用比较大的模型 medium,或者更大。8 c) y2 t- O3 m) R, G
7,我自己观察一个小时之内可以保证断句准确,再长就很可能不行,所以我的办法是切割文件到一个小时,识别后再聚合,效果不错。2 ^6 O7 \6 R8 X: K
8,faster-whisper 会上传一些信息,检测到不停的使用网络,曾经有一次代码出错就是访问网络,你要是有洁癖就把网络暂时给关了。0 @0 g  T, _) N  i

. b# n( k- y' G+ D
' ]9 l- R% D3 h( D1 c% C+ T* X2 K  v( _$ J; V$ _

作者: nanimarcus    时间: 2023-6-4 11:53
多谢各位榜爷打赏。




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