爱吱声

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

作者: nanimarcus    时间: 2023-6-4 02:10
标题: faster-whisper 更快的语音到文字的识别 ASR
本帖最后由 nanimarcus 于 2023-6-4 02:24 编辑 . T( R% {3 m6 t. g( Y
: B, U  p( u" \$ D5 g: v
借着 chatGPT 这股热潮研究了一下 Whisper,学名叫 automatic speech recognition (ASR) ,就是转换声音到文字的。
6 h5 x1 U; I, d7 a1 @效果我是很满意的,唯一不满的是速度,在六年前的主流显卡上基本上是一倍速,基本上只用在自己特别喜欢的媒体文件上了。8 K/ g0 A5 y/ v
----------------------------------------: o% x/ O& i+ K3 A  p
显然不满意的不是我一个,活雷锋很快就出来了,名字很谦虚也很霸气 faster-whisper。
$ l' O) _9 I6 y. C0 x. V4 f7 h0 \& o' {在六年前主力显卡3G内存上,model small,能跑到12倍速,这个是相当满意了。
3 T* }6 L+ S6 ~* W3 ~4 z+ L3 z----------------------------------------
" {# S! [" j$ `" \3 jhttps://github.com/guillaumekln/faster-whisper9 W+ ?, n% t" d1 R
安装如下:* Q4 \0 C5 k0 p+ g) j
1, Windows 10  I) G  G: [) t# {
2, Python 3.10.11
+ q: }  k1 _! ?! t/ B3, CUDA 12.1
. p- h7 b' p( V( I+ a+ n4, 在python 3 中安装
% c; `5 S! I, U% U" Bpip install setuptools-rust torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu117
2 H0 D' W3 p2 T  [& s) D+ o这一步最后一个安装文件 cu117-cp310-cp310-win_amd64.whl 大小2343.6 MB,如果没显示,你得检查一下你的环境。
) N( D& C5 J  z' ?, O' i, Q5 v5,pip install -U openai-whisper) Y, N3 @0 |  ?! F( b5 r; B
这是向whisper 致敬,可以不装# e2 E! A$ m( K' h
6,pip install faster-whisper
! ?3 F) \4 j: |, ~# |----------------------------------------6 u; c" T; G% _4 ?" f% F
whisper 我用的命令行,faster-whisper 我用的是python。1 `  y% ^/ ^  X+ Q
下面给出了部分参考代码,根据主页上的参考代码我做了修改,但这个不是能运行的代码:; K( C& {1 G8 y9 S5 P

' R1 `% @9 U8 E* w  ?6 _1 A----------------------------------------( e8 E: {/ Y" j$ Z2 w& q& G% p# J

  a) @/ T! L9 j. Vfrom faster_whisper import WhisperModel
/ [& Y$ {8 g% L' z
. H4 g0 \- ^' Y7 t' y: O/ [model_size = "small"6 B+ C0 Z1 L2 X( M; o! G8 m5 h( y2 N* w
2 `. j5 K  p  ]9 e1 P" m
model = WhisperModel(model_size, device="cuda", compute_type="int8")4 o; D% R; q8 B% {2 @$ z- _
1 H. d# }, b' I: Z6 Q* h
segments, info = model.transcribe(
" O0 Y3 x9 M/ N! e/ Z1 Y4 L    sourceFileName, 2 `7 P+ p! B0 J* W
    beam_size=5, ) a" S0 r4 y' A
    language="en",
7 w4 E) g* ]% V8 p  u9 P    task="transcribe", " _1 d& V: y6 t. O8 W# }' s, s
    word_timestamps=True,
% s* r0 {6 A8 g8 j; D6 ^    initial_prompt = "Hello, welcome to my lecture.")' C/ O9 H/ D+ @* r. Y: K& X8 e
+ s. l2 ?' a, l4 ~
for segment in segments:
8 S6 {) _. V: {9 k3 P4 Q    print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))) o4 i# M2 C( l4 c3 o( E

0 }9 O# r+ y& ?# g- v6 C        for word in segment.words:6 ?: p+ j, U* Q* s. E
                $ F6 J2 h' t: Y5 x; F9 X- i$ z
----------------------------------------
# ]6 |+ W, z& j
4 l7 y( K/ x5 w( N+ e+ i9 C0 R0 w/ V! ~代码说明:; p' X& T4 j3 k, A
1,model.transcribe 只是建立了模型,并没有运行,运行 是从 for segment in segments: 这一句开始的。
9 o1 S, d7 p" z- E& f0 |但是这一步很重要(废话),我的程序有时候会无征兆退出就是在这一步,没有任何错误信息,倒是Windows 侦测到,但也没给出有意义的信息。
  O0 y( ?7 O* H. O  |* T. ~2,segment 本身是很粗糙的,做字幕勉强能用。
6 O& ?  u. }7 K; {3,word 才是真正的精确控制的,本身带时间轴,所以要做比较好的字幕,必须用到word。
5 U( y6 ?3 U4 N) G4,word 里面是包含标点符号的,也就是说标点符号不是独立的,是附着在前一个word中: N5 Q4 c9 Z$ X' E
比如 "faster." 这个句号是和前一个单词 faster 放在同一个 word 里面的。
7 {, k: D) K! j1 W0 L: L5,model.transcribe 中参数说明:) e( w. M5 M2 B
你要是对 whisper 的参数有所了解的话,基本上这些参数就是对应whisper 的参数
9 L6 R, H$ D: P9 s* ]  M  n: Q其中( z3 q& k1 H7 \- u9 z. {* K
    word_timestamps=True,
( Z" \& c8 F! h- X) H/ W保证了你能拿到 word,否则是拿不到的
4 |6 S% W' {& K6 c8 J    initial_prompt = "Hello, welcome to my lecture.")! g' x- W$ k% D( t4 h4 v# B
保证能尽可能准确的断句 punctuation,但是不是决定性的。
6 N% [4 U2 J5 R% G7 X& o其他参数可参考源文件:
5 p& S2 D3 h3 T# ihttps://github.com/guillaumekln/ ... isper/transcribe.py5 G6 h) q8 U/ Z
152 def transcribe(/ D8 y% d' W8 W
从源文件你可以看到是支持中文的句号断句的。: m0 z' B, x+ V6 s% S4 O6 F

% o2 a% J/ q) l* @3 y6,如果要尽可能准确的 punctuation,根本办法是用比较大的模型 medium,或者更大。! V( a0 ]% a: ^4 m4 T2 r! D
7,我自己观察一个小时之内可以保证断句准确,再长就很可能不行,所以我的办法是切割文件到一个小时,识别后再聚合,效果不错。) m: W9 N+ h4 j' g$ `
8,faster-whisper 会上传一些信息,检测到不停的使用网络,曾经有一次代码出错就是访问网络,你要是有洁癖就把网络暂时给关了。
% v: [% w! x- `
; Q3 G' H. b6 i* ^. p
6 F; g- d  ^4 ~  F+ E. u/ ?
* l* B, l5 G& H( ?" a2 C6 r& ?
作者: nanimarcus    时间: 2023-6-4 11:53
多谢各位榜爷打赏。




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