爱吱声

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

作者: nanimarcus    时间: 2023-6-4 02:10
标题: faster-whisper 更快的语音到文字的识别 ASR
本帖最后由 nanimarcus 于 2023-6-4 02:24 编辑 $ N  T( R* F- V- j- v

: O% c# X* m& R; d6 E借着 chatGPT 这股热潮研究了一下 Whisper,学名叫 automatic speech recognition (ASR) ,就是转换声音到文字的。( T) N9 r4 t- x' a3 X* \
效果我是很满意的,唯一不满的是速度,在六年前的主流显卡上基本上是一倍速,基本上只用在自己特别喜欢的媒体文件上了。9 i$ c8 [( K9 H0 H7 @' x, f
----------------------------------------) j3 i5 Z2 T( v0 u! p
显然不满意的不是我一个,活雷锋很快就出来了,名字很谦虚也很霸气 faster-whisper。& R7 Q  A) H# e; q$ _" `. p5 T
在六年前主力显卡3G内存上,model small,能跑到12倍速,这个是相当满意了。) V  v9 }' A; Y* ^
----------------------------------------
+ S  M, w1 S( Khttps://github.com/guillaumekln/faster-whisper
$ W6 V1 |7 \  l4 h. x安装如下:
2 E2 S, s( [" \4 [7 W% Q1, Windows 104 G7 S( m( ^+ m: L4 F6 u# l
2, Python 3.10.11
3 [! z3 V0 k2 A( F/ X; t3, CUDA 12.1. D# Q4 @: g* M& ^# X# i/ r7 y
4, 在python 3 中安装5 A5 S9 [5 c- `# m7 B9 B
pip install setuptools-rust torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu117- S/ s  M4 A, O9 y
这一步最后一个安装文件 cu117-cp310-cp310-win_amd64.whl 大小2343.6 MB,如果没显示,你得检查一下你的环境。
3 a9 f/ u) Z% Z' S3 h# J9 q  w1 y5,pip install -U openai-whisper' q! g- ^; z& M; B* B6 d
这是向whisper 致敬,可以不装9 A6 l5 k2 W1 n7 c
6,pip install faster-whisper- i/ G9 E. \5 |1 S1 ?% _! Q
----------------------------------------& M/ a4 O+ @9 [# w# y  @; g. L6 z
whisper 我用的命令行,faster-whisper 我用的是python。
4 h1 R; m3 h- z# s1 E- Q* O4 s: a下面给出了部分参考代码,根据主页上的参考代码我做了修改,但这个不是能运行的代码:
( Y- i9 \7 }! D/ _
* x+ n6 X( Y8 ~! j" f----------------------------------------
; F, T) o* N* E! i4 n! T0 Q, L, C+ ]
2 d! B/ _# }, ?. q# j1 Hfrom faster_whisper import WhisperModel% U5 I" p: }! @. K: \/ r0 S
% @- W0 C  K% F. n3 ^- h& u
model_size = "small"
6 g- ^- C0 \& ]. y4 H4 H0 `5 d5 q" q1 ?9 w! C: |% \6 J$ Z
model = WhisperModel(model_size, device="cuda", compute_type="int8")
. t; z% n* {6 a9 Q' |" R: R& p1 T) M, T) r. a5 F2 ?
segments, info = model.transcribe(; K! x1 W% p, S
    sourceFileName,
; @, R: }7 I7 _$ ^" l- d& S% \$ O    beam_size=5,
( E8 \7 B; I3 z    language="en",
1 `0 S8 R2 Q9 u1 l    task="transcribe",
3 U, \0 M( g4 Y    word_timestamps=True,
; }4 D6 o& O, R. H" j2 h    initial_prompt = "Hello, welcome to my lecture.")0 Z) U2 F6 @/ E
2 ?* C8 }. H& G7 ~) V( Y
for segment in segments:& K( I; \% g6 |1 }% t; A
    print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))
, z1 `3 e: E+ ?  L3 H6 T4 f2 |0 ?* H* c% x
        for word in segment.words:
3 L  \* D6 R. @+ y) m7 e+ u                * r* H) c1 i: I: J9 Y- H5 Y
----------------------------------------6 t1 h# n4 r- n) O7 R

( ?( c; C* `5 j2 H代码说明:
" r( B6 K" l) u0 \1,model.transcribe 只是建立了模型,并没有运行,运行 是从 for segment in segments: 这一句开始的。: {; D" T- P! J- L
但是这一步很重要(废话),我的程序有时候会无征兆退出就是在这一步,没有任何错误信息,倒是Windows 侦测到,但也没给出有意义的信息。/ w, t  ^! {3 h& t, L, {
2,segment 本身是很粗糙的,做字幕勉强能用。
+ _4 g1 d& v$ C4 R0 }3,word 才是真正的精确控制的,本身带时间轴,所以要做比较好的字幕,必须用到word。5 }6 Z" ?7 y( |- u
4,word 里面是包含标点符号的,也就是说标点符号不是独立的,是附着在前一个word中6 }$ V& ~0 j! g4 m1 v6 {
比如 "faster." 这个句号是和前一个单词 faster 放在同一个 word 里面的。& ?/ `1 @0 H# k9 J8 y2 r; Y9 D
5,model.transcribe 中参数说明:2 ]2 p7 n3 R1 Z- r& L- u# _, U) E3 }
你要是对 whisper 的参数有所了解的话,基本上这些参数就是对应whisper 的参数$ q* F# U; Y! w# |
其中  a. L8 s* f8 k0 d6 N! j
    word_timestamps=True,
8 M) |) o3 {) `* U4 R3 c5 W' ]保证了你能拿到 word,否则是拿不到的0 d2 }$ _. S' A! I  M
    initial_prompt = "Hello, welcome to my lecture.")
  m6 ^. _1 u5 S6 G7 B  @0 ?保证能尽可能准确的断句 punctuation,但是不是决定性的。
- L8 U7 X0 a9 f* E8 n其他参数可参考源文件:0 \) b( O3 J5 O% U; a8 }
https://github.com/guillaumekln/ ... isper/transcribe.py' z  J" o2 @- G
152 def transcribe(; ~- |2 C6 f0 {7 F8 Y9 `
从源文件你可以看到是支持中文的句号断句的。
! O4 b1 {7 I+ e9 o2 x3 O1 l3 g' d% b- H1 S9 ]/ s
6,如果要尽可能准确的 punctuation,根本办法是用比较大的模型 medium,或者更大。
- `! U  b1 e: F! J7,我自己观察一个小时之内可以保证断句准确,再长就很可能不行,所以我的办法是切割文件到一个小时,识别后再聚合,效果不错。
  }: J2 [5 R% n: [3 N7 N8,faster-whisper 会上传一些信息,检测到不停的使用网络,曾经有一次代码出错就是访问网络,你要是有洁癖就把网络暂时给关了。
+ R; R/ S- o/ t& s3 v9 a0 t4 j! b0 l' P# n% `5 k
. ^% I, {4 P+ `- r  e) K
! G2 f" w, Q( E* U2 ~9 K

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




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