标题: 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