爱吱声

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

作者: nanimarcus    时间: 2023-6-4 02:10
标题: faster-whisper 更快的语音到文字的识别 ASR
本帖最后由 nanimarcus 于 2023-6-4 02:24 编辑
) j# _$ P! l; e9 C( o
* y1 ~: y5 q9 ^借着 chatGPT 这股热潮研究了一下 Whisper,学名叫 automatic speech recognition (ASR) ,就是转换声音到文字的。
2 M9 G, d9 |3 h9 B0 i3 V效果我是很满意的,唯一不满的是速度,在六年前的主流显卡上基本上是一倍速,基本上只用在自己特别喜欢的媒体文件上了。
) Y# a3 v5 R0 b* ^& o! k/ N----------------------------------------
1 v: r! e% f( f9 O* Y; s显然不满意的不是我一个,活雷锋很快就出来了,名字很谦虚也很霸气 faster-whisper。: I) p/ G! X, O4 ?0 H% E4 s
在六年前主力显卡3G内存上,model small,能跑到12倍速,这个是相当满意了。. u$ Q2 ^* `: {' l" z5 k+ v4 O( y
----------------------------------------2 X6 I9 g9 g- z
https://github.com/guillaumekln/faster-whisper1 H: t2 y/ E# {3 P) k; [
安装如下:  x) V7 _/ T$ H  }+ a/ F9 [
1, Windows 10
) |- `) x4 U4 }6 K2, Python 3.10.11
  m0 r  Q7 @' E- }3, CUDA 12.1
) K! }  W. y* U& N* [, u6 e) e4, 在python 3 中安装
, B5 f. E  D, u7 spip install setuptools-rust torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu117! ?. |# O! T. {2 |# a
这一步最后一个安装文件 cu117-cp310-cp310-win_amd64.whl 大小2343.6 MB,如果没显示,你得检查一下你的环境。
: h# J/ p: N! y% B2 E% E5,pip install -U openai-whisper2 j- f  r2 ~& h/ g
这是向whisper 致敬,可以不装
7 ]9 o9 a$ n) M. c  V) d* m' q6,pip install faster-whisper
5 N- d8 L1 c- j5 D7 w----------------------------------------
! n: W2 I$ i2 @' G" ywhisper 我用的命令行,faster-whisper 我用的是python。
5 [9 f) k+ C4 x- G2 ^下面给出了部分参考代码,根据主页上的参考代码我做了修改,但这个不是能运行的代码:5 e$ a- v) ?4 D: J) p* T8 ]

9 r% m- i7 P# J/ Z0 w----------------------------------------
4 N2 A3 P  z3 ~! t6 r5 d! q( D+ X7 i' \" u
from faster_whisper import WhisperModel
- ~' y: \& K+ U  {! \* x- k" g0 |, S0 u$ t5 Y3 @/ N* K
model_size = "small"4 ?/ K* G; L9 e+ a& C; U

9 {) W* g9 V( e  I- _model = WhisperModel(model_size, device="cuda", compute_type="int8")% E" b; p& _: K  i
/ @& }4 {  `5 K  A  L0 X
segments, info = model.transcribe(
5 d: g+ q5 J0 U  B0 t1 ^5 j1 i    sourceFileName, $ p8 |) F/ U) o& d4 t3 O
    beam_size=5,
: m" J; A# y" W8 v    language="en",
- |/ J) N) s; y2 `/ X8 K% [) s    task="transcribe", # B, u2 \' x8 Q  M  t5 W* k
    word_timestamps=True,
" M! M5 J" I* \2 o  j% a    initial_prompt = "Hello, welcome to my lecture.")
: ~2 o! I1 \! z$ D' \2 I  h' {
4 j, m( U/ Y) w7 k& q: S" gfor segment in segments:& W' o9 R# y: Z: W1 _7 Y
    print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))8 C: S- j1 T8 J. a1 J; L9 P9 l

( t2 v9 ~5 j4 A5 Z# `        for word in segment.words:$ Q/ f* |+ x7 b  h
               
% H0 ]  m4 f7 i0 e% I8 u----------------------------------------& Y4 [' M$ h! ~7 ?+ w" I3 j, Y
3 ]- J/ p& A. P4 X6 ?0 a
代码说明:: W# q$ H0 R& [. b
1,model.transcribe 只是建立了模型,并没有运行,运行 是从 for segment in segments: 这一句开始的。! D6 d) J, T) k# B' }
但是这一步很重要(废话),我的程序有时候会无征兆退出就是在这一步,没有任何错误信息,倒是Windows 侦测到,但也没给出有意义的信息。
) f& o: `% g6 \" Y+ g/ N3 o: D0 D2,segment 本身是很粗糙的,做字幕勉强能用。
$ i8 n# u* k7 h1 U* s3,word 才是真正的精确控制的,本身带时间轴,所以要做比较好的字幕,必须用到word。3 K. g% A3 i# ]
4,word 里面是包含标点符号的,也就是说标点符号不是独立的,是附着在前一个word中
5 F7 e: \3 f" d* L3 _比如 "faster." 这个句号是和前一个单词 faster 放在同一个 word 里面的。
2 G- j5 R, M# U3 G  J5,model.transcribe 中参数说明:" X* w, E3 C' I* b& s3 W5 m; P
你要是对 whisper 的参数有所了解的话,基本上这些参数就是对应whisper 的参数
0 C& z3 ^+ {9 e7 a) [0 t5 M其中
) h, b& j6 y$ _. Q1 D% i: u! @    word_timestamps=True, 5 J! i* }# g; t5 e
保证了你能拿到 word,否则是拿不到的9 d4 I. y9 N& V- _
    initial_prompt = "Hello, welcome to my lecture."); b2 j+ }, v# t! r4 b1 ], ]
保证能尽可能准确的断句 punctuation,但是不是决定性的。
, |" M' q/ i4 [' H- a其他参数可参考源文件:1 m0 i- v, g7 l' r
https://github.com/guillaumekln/ ... isper/transcribe.py  U% i: m3 B! E
152 def transcribe(
4 m1 ?; p2 r0 P1 d  r/ \从源文件你可以看到是支持中文的句号断句的。
6 K7 |" g. v- Z1 c( G! G2 _* z- v7 a$ X5 s3 x6 |
6,如果要尽可能准确的 punctuation,根本办法是用比较大的模型 medium,或者更大。0 J) f- x$ I. f
7,我自己观察一个小时之内可以保证断句准确,再长就很可能不行,所以我的办法是切割文件到一个小时,识别后再聚合,效果不错。
$ O' t* `* v3 h! q$ [8,faster-whisper 会上传一些信息,检测到不停的使用网络,曾经有一次代码出错就是访问网络,你要是有洁癖就把网络暂时给关了。
5 M5 {$ z+ w2 K% {6 ]- I2 U
! r& S; y1 _9 l, G9 r, ]5 V6 B , p0 l" }7 l6 P. P9 Z
+ z4 A4 X) j" e' K, }, L' e5 m# S

作者: nanimarcus    时间: 2023-6-4 11:53
多谢各位榜爷打赏。




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