爱吱声

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

作者: nanimarcus    时间: 2023-6-4 02:10
标题: faster-whisper 更快的语音到文字的识别 ASR
本帖最后由 nanimarcus 于 2023-6-4 02:24 编辑 * F( s0 n" \2 K6 {
6 g+ H0 h, A* N2 C4 I2 x7 ^) f
借着 chatGPT 这股热潮研究了一下 Whisper,学名叫 automatic speech recognition (ASR) ,就是转换声音到文字的。
* h8 z" Q4 V4 D4 b: Z效果我是很满意的,唯一不满的是速度,在六年前的主流显卡上基本上是一倍速,基本上只用在自己特别喜欢的媒体文件上了。
1 ?/ Q" I$ {6 ?2 @6 W: k* {! G0 ~' h----------------------------------------
# L; v/ O" W* @. \& J显然不满意的不是我一个,活雷锋很快就出来了,名字很谦虚也很霸气 faster-whisper。
% L: G5 o+ l5 N# I/ D- h在六年前主力显卡3G内存上,model small,能跑到12倍速,这个是相当满意了。
! q. p+ r# F, c# ~----------------------------------------: |; N( `; {/ X7 O" v# g" T0 W3 Q
https://github.com/guillaumekln/faster-whisper: J( X; `  H' V9 u: Y5 T, H/ n8 S
安装如下:( Y7 r- E" i7 l; v
1, Windows 10
  i, v7 {2 _9 @: T/ t3 ^2, Python 3.10.11
+ E' @0 M2 L' Z) x  @" m/ F- {- ~- r% D3, CUDA 12.1
! {" @4 f0 v6 J3 k- ~2 j4, 在python 3 中安装0 r! q; I- a4 `" _2 I' K* F
pip install setuptools-rust torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu1172 j) N3 o1 e( l) F
这一步最后一个安装文件 cu117-cp310-cp310-win_amd64.whl 大小2343.6 MB,如果没显示,你得检查一下你的环境。
* n6 \& B! P8 }( N& @6 I5,pip install -U openai-whisper
- G. w: R7 S6 @* \6 F/ N这是向whisper 致敬,可以不装
' Z; O! J' e5 V8 A9 p* a6,pip install faster-whisper
* L( z0 O+ l/ H( M----------------------------------------3 ]( P+ f& V- m
whisper 我用的命令行,faster-whisper 我用的是python。/ O+ {+ f; Q9 r( z' Y
下面给出了部分参考代码,根据主页上的参考代码我做了修改,但这个不是能运行的代码:% A$ I  s* N* K( T& g+ u

3 {) ^+ W5 n" @( \5 I% I9 l----------------------------------------4 X: q2 C. D' x" g9 _/ Q

% z, ?$ s; x# q' X/ mfrom faster_whisper import WhisperModel
: ~, k1 y/ I: h. [; L, `* ]9 b( Z6 |! |
model_size = "small"8 V0 ^6 Q- F, C# V
" k  D3 f) Q1 u( i7 t3 Z
model = WhisperModel(model_size, device="cuda", compute_type="int8")
( d6 t! E" h+ L$ i0 J3 P! c9 q8 j* L' s0 y
segments, info = model.transcribe(
" Y' e- y( }% Z; j    sourceFileName,
$ Y# I8 r! Z  \3 }# Q: s    beam_size=5, + |+ T+ O! p% O% D& Q+ r$ t7 F
    language="en", ' e) A) ~  c' B( T, S& ~
    task="transcribe", 3 K6 h0 m' n5 f, M8 C' H2 Q* K
    word_timestamps=True,
7 f+ Y5 ^' K1 x: Q' x    initial_prompt = "Hello, welcome to my lecture.")" j; r: m! s7 R/ c* _) b& \
# y, X6 _# R8 t7 F8 F
for segment in segments:
6 u. {2 E; y: K; V/ h& J    print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))
% `9 G6 U4 E7 h' U4 \/ u- t$ `0 C* o8 P
        for word in segment.words:
& q1 D% w( l" L. w2 H               
& B+ h( a  g0 H5 [----------------------------------------$ ^8 ?6 _# e9 y2 {# [. {

0 I6 Y: v1 W7 |# ]! h代码说明:& V/ F' d4 j0 L3 t# i
1,model.transcribe 只是建立了模型,并没有运行,运行 是从 for segment in segments: 这一句开始的。
5 Q: R5 P% m5 g7 P! }2 w  I但是这一步很重要(废话),我的程序有时候会无征兆退出就是在这一步,没有任何错误信息,倒是Windows 侦测到,但也没给出有意义的信息。" Q. ~# n/ \/ ]- S- V( }
2,segment 本身是很粗糙的,做字幕勉强能用。5 l" N) B8 d: R! o0 v
3,word 才是真正的精确控制的,本身带时间轴,所以要做比较好的字幕,必须用到word。
. v) e2 J& k! \3 ?, |& z% D4,word 里面是包含标点符号的,也就是说标点符号不是独立的,是附着在前一个word中  v. F8 X. v$ F
比如 "faster." 这个句号是和前一个单词 faster 放在同一个 word 里面的。
6 y% T9 h0 i) B1 V) S: Z7 n5 \0 c$ M5,model.transcribe 中参数说明:1 @. @3 V& e9 C' E/ _) C
你要是对 whisper 的参数有所了解的话,基本上这些参数就是对应whisper 的参数# {1 V/ L% i0 m; k$ ?8 S
其中
3 p" W# p/ N) c4 b& V+ a* U- f% Q    word_timestamps=True,
' Z7 h. @# z* f; ?保证了你能拿到 word,否则是拿不到的; Z0 t8 `$ }3 ^$ n1 ^) C, T
    initial_prompt = "Hello, welcome to my lecture.")
1 B$ C: H, J8 V9 R保证能尽可能准确的断句 punctuation,但是不是决定性的。
3 o6 g3 `% O" V+ W# G1 K5 z其他参数可参考源文件:
2 o$ }: v0 Q: r9 Phttps://github.com/guillaumekln/ ... isper/transcribe.py- k: B0 Q; ]2 C) @
152 def transcribe(( K, M3 ^* d; g" @
从源文件你可以看到是支持中文的句号断句的。/ w3 I' l! k) c) c

2 k6 K' A/ b0 q# |6,如果要尽可能准确的 punctuation,根本办法是用比较大的模型 medium,或者更大。
9 [8 O8 h" |9 y2 f. w# C7,我自己观察一个小时之内可以保证断句准确,再长就很可能不行,所以我的办法是切割文件到一个小时,识别后再聚合,效果不错。" V8 X: Z4 B) n" Z" C# e
8,faster-whisper 会上传一些信息,检测到不停的使用网络,曾经有一次代码出错就是访问网络,你要是有洁癖就把网络暂时给关了。
( ]; p) v4 g; P+ }. L( |
6 u$ B3 z' \8 q9 b& b# t0 E
+ R' W0 z  x$ I" K; ]2 J6 ]; b! m" s
4 K7 V- U+ \$ J' l0 y& s& S$ |
作者: nanimarcus    时间: 2023-6-4 11:53
多谢各位榜爷打赏。




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