爱吱声

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

作者: nanimarcus    时间: 2023-6-4 02:10
标题: faster-whisper 更快的语音到文字的识别 ASR
本帖最后由 nanimarcus 于 2023-6-4 02:24 编辑
5 \4 l' N6 R4 [! D
" v7 ?% k% b* S" e( K% t9 U  _, i借着 chatGPT 这股热潮研究了一下 Whisper,学名叫 automatic speech recognition (ASR) ,就是转换声音到文字的。" s& m$ P  {& s- v. r
效果我是很满意的,唯一不满的是速度,在六年前的主流显卡上基本上是一倍速,基本上只用在自己特别喜欢的媒体文件上了。  a: z* ]8 j. ~9 d' B( b" l% z
----------------------------------------. b8 x+ L* R5 ?7 r2 Q1 P9 p
显然不满意的不是我一个,活雷锋很快就出来了,名字很谦虚也很霸气 faster-whisper。
: `! q) s$ U: v! J) p( q在六年前主力显卡3G内存上,model small,能跑到12倍速,这个是相当满意了。3 P9 d5 U+ K& y4 ?3 T
----------------------------------------
0 B3 M3 B6 K; Jhttps://github.com/guillaumekln/faster-whisper) d" W; P7 z  Z  ?, y. c! H
安装如下:
2 E8 Z# X* W6 k3 Z8 d2 X1, Windows 10
: @& L( r6 Y, p2, Python 3.10.11! C8 J1 G2 E3 V/ X2 b
3, CUDA 12.12 e* W5 l& ^' p. |
4, 在python 3 中安装
/ ?& @* c7 Z( z" k: jpip install setuptools-rust torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu1172 d, J5 a- C2 [  {# m
这一步最后一个安装文件 cu117-cp310-cp310-win_amd64.whl 大小2343.6 MB,如果没显示,你得检查一下你的环境。
* a1 i- W) B- R' M$ N: Y9 i3 M: {/ R: [5,pip install -U openai-whisper  |1 O: v2 h% \+ e; X
这是向whisper 致敬,可以不装" A3 a+ a2 x9 p; p$ y
6,pip install faster-whisper
* j( s4 Q( g3 X. |----------------------------------------6 f2 e# f' H0 T  g0 j: ~' l5 E
whisper 我用的命令行,faster-whisper 我用的是python。
( }* }! ?/ u8 u! n0 C! g# f下面给出了部分参考代码,根据主页上的参考代码我做了修改,但这个不是能运行的代码:3 C) L8 c$ Y2 ]
3 n. d0 ]3 y& f$ d
----------------------------------------) v- \% m* o  W- K/ o" r
9 c) N1 u9 N3 \3 p. V
from faster_whisper import WhisperModel  Y6 f/ C0 {1 z, U

$ f. v* R# h) p; ~" u) J. kmodel_size = "small"( H/ I& u, M1 r) l& G
% Z! r3 q4 v$ N" v6 t* x8 D
model = WhisperModel(model_size, device="cuda", compute_type="int8")$ F. M- ]( f5 N. k6 E

; v# p7 n# S* `0 Dsegments, info = model.transcribe(
- q5 U8 Q# C: X+ N9 b  I3 ~    sourceFileName, ! d( H/ _; `5 s) k# D' k/ q  \
    beam_size=5, ! h$ G5 E2 ]; U6 P
    language="en",
+ {# V5 j, W& _7 E    task="transcribe", ! \3 z8 z8 E) G6 `' q
    word_timestamps=True, , R. P" {# d3 g2 }
    initial_prompt = "Hello, welcome to my lecture.")) H6 d5 j( s% `* D+ w8 s% c3 m

7 `9 O; G8 Z& Ffor segment in segments:2 _3 r2 s% @5 l, q5 j
    print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))
' Q" {  x3 V  p) o( m, L- e' Q; D" K% m3 `5 Q" O7 G( r/ z
        for word in segment.words:
( G! a1 R$ A3 X8 b. c! h                # S+ O' N' W+ t+ e
----------------------------------------
" T* J' R. g6 s$ d9 u, a3 @4 W  v# N7 }  G0 `
代码说明:0 L- s1 D. B0 c5 U( U; o
1,model.transcribe 只是建立了模型,并没有运行,运行 是从 for segment in segments: 这一句开始的。9 k# ^# e) r% |3 A/ k/ U
但是这一步很重要(废话),我的程序有时候会无征兆退出就是在这一步,没有任何错误信息,倒是Windows 侦测到,但也没给出有意义的信息。) Q8 Z$ \& L- O/ {2 s/ g
2,segment 本身是很粗糙的,做字幕勉强能用。. ]7 R7 L' Z1 q6 Y3 y
3,word 才是真正的精确控制的,本身带时间轴,所以要做比较好的字幕,必须用到word。! R6 g; F9 S+ t
4,word 里面是包含标点符号的,也就是说标点符号不是独立的,是附着在前一个word中
4 O0 g  S5 k& m) n. I比如 "faster." 这个句号是和前一个单词 faster 放在同一个 word 里面的。" N+ h+ X& H# O
5,model.transcribe 中参数说明:- R! w" `! q1 n6 c
你要是对 whisper 的参数有所了解的话,基本上这些参数就是对应whisper 的参数* m) \) U0 j( S
其中, l( r1 D% {& y5 S5 D
    word_timestamps=True, 0 F5 E* V7 P! c2 T/ ~
保证了你能拿到 word,否则是拿不到的5 N) T; s* L/ d  y6 |
    initial_prompt = "Hello, welcome to my lecture.")% C& A! C, ^2 j4 z$ D/ q5 c
保证能尽可能准确的断句 punctuation,但是不是决定性的。$ k! V2 m, V2 b* J9 Q/ G
其他参数可参考源文件:
: d2 U6 B! c; Nhttps://github.com/guillaumekln/ ... isper/transcribe.py8 Q- j2 l+ D: ~$ _0 t0 l) P
152 def transcribe(
, a8 t5 z4 W5 f0 }+ l0 j; C5 V9 k从源文件你可以看到是支持中文的句号断句的。& R* t6 H+ K  J8 V! P

, h, J9 L7 v- Q0 J4 y( b. T! }6,如果要尽可能准确的 punctuation,根本办法是用比较大的模型 medium,或者更大。
3 m* n6 }( q, Q( R) i0 ~, x7,我自己观察一个小时之内可以保证断句准确,再长就很可能不行,所以我的办法是切割文件到一个小时,识别后再聚合,效果不错。
4 _. R; y! F% ]. r( F& f6 W# ~8,faster-whisper 会上传一些信息,检测到不停的使用网络,曾经有一次代码出错就是访问网络,你要是有洁癖就把网络暂时给关了。
& H" j! h+ c" u1 F; y+ K, |/ _3 \. ~8 G' E
. \9 F- A& `5 ]' f" r/ Z
* E$ g0 [- {2 k- c! i3 r

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




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