爱吱声
标题:
faster-whisper 更快的语音到文字的识别 ASR
[打印本页]
作者:
nanimarcus
时间:
2023-6-4 02:10
标题:
faster-whisper 更快的语音到文字的识别 ASR
本帖最后由 nanimarcus 于 2023-6-4 02:24 编辑
* q: E5 v7 e- A" A
9 X$ s* U- b. s
借着 chatGPT 这股热潮研究了一下 Whisper,学名叫 automatic speech recognition (ASR) ,就是转换声音到文字的。
1 w3 b/ U; \7 Y1 P, }2 E
效果我是很满意的,唯一不满的是速度,在六年前的主流显卡上基本上是一倍速,基本上只用在自己特别喜欢的媒体文件上了。
% I" p. D& ~0 E0 h' n
----------------------------------------
% z1 P- O' h8 X ^7 R8 d) b6 U
显然不满意的不是我一个,活雷锋很快就出来了,名字很谦虚也很霸气 faster-whisper。
1 a O L( v, Q( D) M. t% k- b
在六年前主力显卡3G内存上,model small,能跑到12倍速,这个是相当满意了。
- k1 j5 s" ~8 _3 V+ [# `( ]
----------------------------------------
4 i r4 Q& U: X* Z
https://github.com/guillaumekln/faster-whisper
9 m \0 v8 {" }7 K R+ Z
安装如下:
% P) k& p Z- H( u0 i' w
1, Windows 10
) K$ G+ N$ R8 z
2, Python 3.10.11
- N6 d- Z9 m5 P. Y( m$ g& A& G, g
3, CUDA 12.1
% g* Y' a* v3 C/ x& o$ L" C: G
4, 在python 3 中安装
9 { I9 S/ b, u5 @
pip install setuptools-rust torch torchvision torchaudio --extra-index-url
https://download.pytorch.org/whl/cu117
0 P* {/ [; s/ a2 R+ U3 F8 F
这一步最后一个安装文件 cu117-cp310-cp310-win_amd64.whl 大小2343.6 MB,如果没显示,你得检查一下你的环境。
& j l& G) S0 m1 _
5,pip install -U openai-whisper
7 C& [* P3 x/ S# N* g8 f/ \
这是向whisper 致敬,可以不装
( \7 k1 l9 h7 t6 T* H- i+ a
6,pip install faster-whisper
" a! `- B0 [' {6 Z @7 {1 ^
----------------------------------------
3 F7 y: j- `$ u& z9 N
whisper 我用的命令行,faster-whisper 我用的是python。
. ?9 }1 _5 t; M% @4 g
下面给出了部分参考代码,根据主页上的参考代码我做了修改,但这个不是能运行的代码:
; z0 P' R2 _6 |" O3 H+ V* L
: ~% B& @; r- i1 m
----------------------------------------
, K4 q& |/ h. d5 q1 u
- s. A; m& ^0 x: v* ]% E3 _
from faster_whisper import WhisperModel
- o- {( V* F# u! K4 e
6 i# M( \' H# m: m
model_size = "small"
* c: H" f% s9 Q- j7 m \+ g
m* V- E8 g' n$ M
model = WhisperModel(model_size, device="cuda", compute_type="int8")
$ c2 } \0 S; F9 X
3 A0 I6 M& i+ X6 c2 k, A
segments, info = model.transcribe(
* ^7 B" j( E L' P* U) j
sourceFileName,
( ~# t0 y; G" v) h% Z
beam_size=5,
5 n, w/ G: A8 G, ^) L
language="en",
( A$ ^3 P8 o- O0 c. {
task="transcribe",
# W+ H" X; T m5 d' o
word_timestamps=True,
$ I' z5 |9 X, s# a
initial_prompt = "Hello, welcome to my lecture.")
$ H2 b: c; R* L$ X1 S* r+ I
% `2 T. M0 g4 }# U# y) e' k
for segment in segments:
B% Y+ D. }) t9 `: ?
print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))
% s3 c% o; p1 Q0 M
6 S4 `6 T; a: Y! r9 r. @
for word in segment.words:
. h* f/ W) i, x E
" |$ [1 G2 V+ i, T* \
----------------------------------------
2 ?1 s8 c9 T. U, O) K0 W% a
4 p6 Y4 P. J; E6 `
代码说明:
/ I* V$ Z5 t0 z) v7 j/ b
1,model.transcribe 只是建立了模型,并没有运行,运行 是从 for segment in segments: 这一句开始的。
) b( @3 K( R L% `/ [, h5 E
但是这一步很重要(废话),我的程序有时候会无征兆退出就是在这一步,没有任何错误信息,倒是Windows 侦测到,但也没给出有意义的信息。
7 w8 F* T! A/ C, ]/ Q, [
2,segment 本身是很粗糙的,做字幕勉强能用。
; o | H8 [ N4 L+ E
3,word 才是真正的精确控制的,本身带时间轴,所以要做比较好的字幕,必须用到word。
) R. C- T7 Z/ b) D6 n, F" M- r, [2 o
4,word 里面是包含标点符号的,也就是说标点符号不是独立的,是附着在前一个word中
* L+ M# ^' a/ s0 g3 {
比如 "faster." 这个句号是和前一个单词 faster 放在同一个 word 里面的。
p+ I1 R7 O0 q5 R5 L; `3 x! Q: P* o5 w
5,model.transcribe 中参数说明:
4 D, o j6 s( n
你要是对 whisper 的参数有所了解的话,基本上这些参数就是对应whisper 的参数
& u; [2 [; O% X% u3 H
其中
' N" ?, S5 H2 l
word_timestamps=True,
3 g/ k- Y1 ]. G1 H4 t! t9 Z6 V2 B
保证了你能拿到 word,否则是拿不到的
. Q" B! n: `3 f- {# j
initial_prompt = "Hello, welcome to my lecture.")
5 d S5 e! Z: R) k/ m- c' [5 b. h
保证能尽可能准确的断句 punctuation,但是不是决定性的。
8 @8 X% z7 Z2 ]- J {. F
其他参数可参考源文件:
6 }* g2 j$ e& ^$ K
https://github.com/guillaumekln/ ... isper/transcribe.py
$ x3 }1 T* ^% l% H/ t
152 def transcribe(
2 [# ?- ^7 \8 F' }: G, }5 i! e; `2 o
从源文件你可以看到是支持中文的句号断句的。
. V4 u) X4 D/ R- N# Q0 H* G
5 b3 S% M4 p7 w+ I% e9 h6 Q
6,如果要尽可能准确的 punctuation,根本办法是用比较大的模型 medium,或者更大。
6 z+ I c6 S4 ^ u; ~
7,我自己观察一个小时之内可以保证断句准确,再长就很可能不行,所以我的办法是切割文件到一个小时,识别后再聚合,效果不错。
/ X: j6 ?9 G4 E
8,faster-whisper 会上传一些信息,检测到不停的使用网络,曾经有一次代码出错就是访问网络,你要是有洁癖就把网络暂时给关了。
' ] o2 o/ U$ C0 t3 [% W2 p4 @
$ W" }' w$ H7 Z: X, `
/ C" y. x \. u: L \9 d
4 M0 T6 u; J! G6 J& ^1 h, P1 D: Z1 y
作者:
nanimarcus
时间:
2023-6-4 11:53
多谢各位榜爷打赏。
欢迎光临 爱吱声 (http://129.226.69.186/bbs/)
Powered by Discuz! X3.2