爱吱声
标题:
faster-whisper 更快的语音到文字的识别 ASR
[打印本页]
作者:
nanimarcus
时间:
2023-6-4 02:10
标题:
faster-whisper 更快的语音到文字的识别 ASR
本帖最后由 nanimarcus 于 2023-6-4 02:24 编辑
; T3 R* N6 j/ R' h
1 i, I+ J/ r$ k. |' a; s. V
借着 chatGPT 这股热潮研究了一下 Whisper,学名叫 automatic speech recognition (ASR) ,就是转换声音到文字的。
' V- x1 x; E4 {- o0 E( f. K9 T- W% u
效果我是很满意的,唯一不满的是速度,在六年前的主流显卡上基本上是一倍速,基本上只用在自己特别喜欢的媒体文件上了。
) D4 a+ P+ Y l0 b
----------------------------------------
8 W( |* D+ _. Y! c1 K
显然不满意的不是我一个,活雷锋很快就出来了,名字很谦虚也很霸气 faster-whisper。
$ W5 S4 I8 O/ u6 G8 N% ]' O+ a
在六年前主力显卡3G内存上,model small,能跑到12倍速,这个是相当满意了。
+ S2 k; }0 h0 @
----------------------------------------
# T" w) U9 ]* j
https://github.com/guillaumekln/faster-whisper
9 k% D+ c' K+ \7 \# L
安装如下:
! [! S7 l6 e4 [, X8 X6 v' ?- j# Q1 t
1, Windows 10
5 e. v5 O9 c, H( g2 O4 ]" k
2, Python 3.10.11
; D% e) t ?4 @) ^% r
3, CUDA 12.1
1 F4 E6 N1 a) A3 r. {) @
4, 在python 3 中安装
, g/ Q# N' L4 }% X8 N
pip install setuptools-rust torch torchvision torchaudio --extra-index-url
https://download.pytorch.org/whl/cu117
$ M/ ]+ }& [/ \! ]) T- A- \0 k
这一步最后一个安装文件 cu117-cp310-cp310-win_amd64.whl 大小2343.6 MB,如果没显示,你得检查一下你的环境。
9 A8 |9 _" ^4 X! P) r" z, ]
5,pip install -U openai-whisper
y' D& X, _' U* x& F" y2 @/ K( Y
这是向whisper 致敬,可以不装
% F' L5 B- q3 W" N
6,pip install faster-whisper
# d' E3 T. O; i0 w5 Z) ^
----------------------------------------
! T$ N1 u- w/ j W
whisper 我用的命令行,faster-whisper 我用的是python。
# s; V; c. Q! a2 `: d8 T" u
下面给出了部分参考代码,根据主页上的参考代码我做了修改,但这个不是能运行的代码:
* K/ t$ e6 L( N0 _8 j4 d& e6 e
* }7 m; b3 A7 M( ]0 Z q8 q0 W& z
----------------------------------------
* q( K; E+ d8 [" @
& E; o8 H/ F# N- d/ u# N$ l% @: D
from faster_whisper import WhisperModel
1 X4 E6 T0 R' N! E, Y" A
" X# d2 b( d* c; g0 D
model_size = "small"
2 C7 y6 V! ]5 c3 @& I0 P
& ^' d* @9 `2 P2 x) O
model = WhisperModel(model_size, device="cuda", compute_type="int8")
$ K: p. F' m# O# l
6 a7 w7 ^. U! j
segments, info = model.transcribe(
& x6 q/ d8 z, `' k* ~% Z/ s
sourceFileName,
+ X5 A, n' `; D' \! q' {# A
beam_size=5,
2 D7 H& F" P- |
language="en",
* K* {0 U. g, \
task="transcribe",
9 [8 z5 J" Q6 D8 i! K$ n
word_timestamps=True,
' K5 u8 T' v0 u( D: f: l9 f
initial_prompt = "Hello, welcome to my lecture.")
- Q% V3 P6 A$ f6 B; Y
# ?2 Z. y. ^8 T% O9 f
for segment in segments:
. [1 R. Q8 U3 H$ h
print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))
3 X. e& \8 F! B6 F" p. @! }+ \
" o7 |! u2 Q& ?8 X3 A
for word in segment.words:
/ A6 k* ^6 v. i: w
6 t3 z/ d' H* }2 S5 o* g0 v. ]
----------------------------------------
4 R) D) m/ G% x
. w/ `0 [4 Y: m0 D/ a# ~
代码说明:
- O' g0 s, J8 B' \
1,model.transcribe 只是建立了模型,并没有运行,运行 是从 for segment in segments: 这一句开始的。
4 t3 t8 W( h# `; f% r6 F7 [
但是这一步很重要(废话),我的程序有时候会无征兆退出就是在这一步,没有任何错误信息,倒是Windows 侦测到,但也没给出有意义的信息。
1 K0 O4 @9 A: L; Q. F3 f
2,segment 本身是很粗糙的,做字幕勉强能用。
: R5 B& o& S' ?$ g7 V& |8 j
3,word 才是真正的精确控制的,本身带时间轴,所以要做比较好的字幕,必须用到word。
6 [2 v9 [, }2 `% d5 L
4,word 里面是包含标点符号的,也就是说标点符号不是独立的,是附着在前一个word中
' z# t! ?8 t; ^: b: P# C* X. h* Q
比如 "faster." 这个句号是和前一个单词 faster 放在同一个 word 里面的。
, J/ r3 o( r; c
5,model.transcribe 中参数说明:
# ~- O6 p* k q- u
你要是对 whisper 的参数有所了解的话,基本上这些参数就是对应whisper 的参数
8 ~. H K8 E- `) l
其中
) t" W* _3 U+ d& e) }8 i& |
word_timestamps=True,
' F8 Y0 q' Z- U& ^/ I3 m d# t/ I5 W$ ?
保证了你能拿到 word,否则是拿不到的
9 o) n" R3 ?7 _# z7 R8 Y- ^
initial_prompt = "Hello, welcome to my lecture.")
k* ^* |$ D h! V+ g$ r0 {
保证能尽可能准确的断句 punctuation,但是不是决定性的。
" }. {. A& g8 G! p) i% I! p- T
其他参数可参考源文件:
9 x! s$ L( _0 M- U v, W Q
https://github.com/guillaumekln/ ... isper/transcribe.py
3 B( ^) b$ X$ K+ L9 G+ q4 G
152 def transcribe(
# X4 z1 ~- e0 Q2 _
从源文件你可以看到是支持中文的句号断句的。
0 U' d; Z0 J) Q2 U* U- t
! r% f3 \# u% u
6,如果要尽可能准确的 punctuation,根本办法是用比较大的模型 medium,或者更大。
" X4 X9 K4 S/ W! l! z
7,我自己观察一个小时之内可以保证断句准确,再长就很可能不行,所以我的办法是切割文件到一个小时,识别后再聚合,效果不错。
' S3 D0 B9 l5 {% Q" \
8,faster-whisper 会上传一些信息,检测到不停的使用网络,曾经有一次代码出错就是访问网络,你要是有洁癖就把网络暂时给关了。
. L+ f( U, k8 C* ^, S5 |
' K5 i# E* H; L% {! A( }7 ?8 V- o
0 }$ J, ]2 y4 o. m1 B6 H- z
+ Q2 z- o+ A5 q2 v& m8 N4 H
作者:
nanimarcus
时间:
2023-6-4 11:53
多谢各位榜爷打赏。
欢迎光临 爱吱声 (http://aswetalk.net/bbs/)
Powered by Discuz! X3.2