爱吱声
标题:
faster-whisper 更快的语音到文字的识别 ASR
[打印本页]
作者:
nanimarcus
时间:
2023-6-4 02:10
标题:
faster-whisper 更快的语音到文字的识别 ASR
本帖最后由 nanimarcus 于 2023-6-4 02:24 编辑
6 T/ u6 g A5 o$ v
* u3 p) }$ r; z# t5 h
借着 chatGPT 这股热潮研究了一下 Whisper,学名叫 automatic speech recognition (ASR) ,就是转换声音到文字的。
( X Y# v3 m) B
效果我是很满意的,唯一不满的是速度,在六年前的主流显卡上基本上是一倍速,基本上只用在自己特别喜欢的媒体文件上了。
/ r) _# c) \9 J; A: R' U
----------------------------------------
' J1 \# X4 m2 x; `# B( H" o3 T" I0 S
显然不满意的不是我一个,活雷锋很快就出来了,名字很谦虚也很霸气 faster-whisper。
6 ^& S6 n V& C4 r t) @) N) D
在六年前主力显卡3G内存上,model small,能跑到12倍速,这个是相当满意了。
" U1 f4 m. _2 R7 Y. h- H l+ X
----------------------------------------
2 i( f* O+ ~+ e0 H3 F! R
https://github.com/guillaumekln/faster-whisper
( I& H+ i) u0 L. i" d8 x8 r# d
安装如下:
. V7 @2 @1 H- H/ x! L
1, Windows 10
3 B8 u1 x7 |) T2 O8 q' j: q. C
2, Python 3.10.11
5 g, [+ w5 c7 e4 c9 A
3, CUDA 12.1
6 ?+ m" o, \9 Z5 s. q
4, 在python 3 中安装
" e( j* |4 f$ u6 ?3 z9 ^
pip install setuptools-rust torch torchvision torchaudio --extra-index-url
https://download.pytorch.org/whl/cu117
( P+ j( t7 w& k b
这一步最后一个安装文件 cu117-cp310-cp310-win_amd64.whl 大小2343.6 MB,如果没显示,你得检查一下你的环境。
3 P9 I) H3 U$ J* s/ `" \; s5 x
5,pip install -U openai-whisper
7 |7 J0 N6 d/ a8 S; B" {
这是向whisper 致敬,可以不装
" l/ @. E2 @7 N0 H" `7 S
6,pip install faster-whisper
9 Z2 d& m7 ~' {0 i" u8 D
----------------------------------------
" P$ Q9 c9 w- {
whisper 我用的命令行,faster-whisper 我用的是python。
- R, q5 \% P9 N6 @7 H1 \ i) P0 }
下面给出了部分参考代码,根据主页上的参考代码我做了修改,但这个不是能运行的代码:
& e& z, r( m2 O+ a
% ?; j5 d6 R: u, @
----------------------------------------
; U1 B& Y+ e/ c; \
. R4 E0 i6 B! F) g: X l
from faster_whisper import WhisperModel
* T$ U' s7 [* L/ M( v& B% L
7 @/ I3 s8 W8 k1 s' Q; E8 Y% j1 K2 t
model_size = "small"
, X3 {" d7 K. p/ K G; [8 n% @
9 Q$ b' w, z" M0 b. J! _# s
model = WhisperModel(model_size, device="cuda", compute_type="int8")
% o' p% J0 `0 H& N" ]; g$ x
( {" O: P f1 ?$ h) L B N
segments, info = model.transcribe(
# S% W4 ~2 w1 M- a4 o
sourceFileName,
9 g3 G9 K+ k, t; O$ V* ]- _; X
beam_size=5,
# z* V2 x. f% g. g. N
language="en",
) ]5 y: r4 g# P6 H- F7 n
task="transcribe",
6 ~$ @" d. w; c
word_timestamps=True,
, D% B' K6 m; O8 n" j$ n& _
initial_prompt = "Hello, welcome to my lecture.")
- U& O+ W1 T* v5 G
- b+ F& N- I, O# E9 B
for segment in segments:
) D) ^* Y- w9 g4 y" i. Y
print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))
/ v2 f% A3 c A; W) M
& m/ X9 j4 ^! ]" V
for word in segment.words:
, K" O4 b3 A: {% C
6 [ U6 i1 i% r7 l1 r# R
----------------------------------------
3 D$ {# M) X8 b& G
/ ]) L: z) h3 \# G o: }
代码说明:
- [" H' B/ h7 G6 e
1,model.transcribe 只是建立了模型,并没有运行,运行 是从 for segment in segments: 这一句开始的。
0 {8 }: U5 z" r! ]6 S% S- I/ `) o
但是这一步很重要(废话),我的程序有时候会无征兆退出就是在这一步,没有任何错误信息,倒是Windows 侦测到,但也没给出有意义的信息。
1 N7 [9 ^" {& R. B# u+ v+ Z
2,segment 本身是很粗糙的,做字幕勉强能用。
/ y! [0 [' o5 x- J
3,word 才是真正的精确控制的,本身带时间轴,所以要做比较好的字幕,必须用到word。
# Z% n. _$ i: @3 Q) h7 ?4 j- l2 H5 f
4,word 里面是包含标点符号的,也就是说标点符号不是独立的,是附着在前一个word中
: a1 X/ S- l5 j/ \
比如 "faster." 这个句号是和前一个单词 faster 放在同一个 word 里面的。
5 ^% I9 H# i$ v. ^
5,model.transcribe 中参数说明:
5 i0 t9 }. u- F7 u. \
你要是对 whisper 的参数有所了解的话,基本上这些参数就是对应whisper 的参数
% m4 Y8 \( \8 q6 N+ R! d
其中
z# n; W& b! i/ e' T/ F
word_timestamps=True,
+ }4 I- Z+ E% |& T1 G% E5 c
保证了你能拿到 word,否则是拿不到的
7 q7 ^$ g' n& C9 R2 ^# ~) v
initial_prompt = "Hello, welcome to my lecture.")
# P5 s, S8 J$ s2 E @( b
保证能尽可能准确的断句 punctuation,但是不是决定性的。
( o z. q4 e& a
其他参数可参考源文件:
9 b _7 a9 `7 e; R+ x5 C
https://github.com/guillaumekln/ ... isper/transcribe.py
+ d5 I/ [$ K9 I" g: c; L+ W2 R
152 def transcribe(
/ Y$ Q1 D2 M! l1 T) m
从源文件你可以看到是支持中文的句号断句的。
% J' s2 l+ F# e3 Z! g5 D/ s4 Y1 a+ y
, ~- q# ~' s' w- n R" q4 e
6,如果要尽可能准确的 punctuation,根本办法是用比较大的模型 medium,或者更大。
6 U) L2 M2 B2 C! m6 D
7,我自己观察一个小时之内可以保证断句准确,再长就很可能不行,所以我的办法是切割文件到一个小时,识别后再聚合,效果不错。
1 z7 z$ F# U2 m
8,faster-whisper 会上传一些信息,检测到不停的使用网络,曾经有一次代码出错就是访问网络,你要是有洁癖就把网络暂时给关了。
. ~: S8 k+ w$ j0 }$ o7 }
7 e) ^4 [' `' s* `! `! O
( Y$ E1 T- [ j# \" |, D5 |+ Y; c
* n0 K# G5 R" @
作者:
nanimarcus
时间:
2023-6-4 11:53
多谢各位榜爷打赏。
欢迎光临 爱吱声 (http://129.226.69.186/bbs/)
Powered by Discuz! X3.2