爱吱声

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

作者: nanimarcus    时间: 2023-6-4 02:10
标题: faster-whisper 更快的语音到文字的识别 ASR
本帖最后由 nanimarcus 于 2023-6-4 02:24 编辑 1 j: G$ A6 m3 f; H; B$ Z  s
, s! l" T3 g% S: }' V% \+ d
借着 chatGPT 这股热潮研究了一下 Whisper,学名叫 automatic speech recognition (ASR) ,就是转换声音到文字的。
1 X. q* ^  I( E. A效果我是很满意的,唯一不满的是速度,在六年前的主流显卡上基本上是一倍速,基本上只用在自己特别喜欢的媒体文件上了。
. ~2 L  r/ F- U; e----------------------------------------
2 Q9 z1 N' T: }  D9 Y. X' e显然不满意的不是我一个,活雷锋很快就出来了,名字很谦虚也很霸气 faster-whisper。( F$ ^* {# h2 o
在六年前主力显卡3G内存上,model small,能跑到12倍速,这个是相当满意了。% `, `6 Y* m, T
----------------------------------------! P4 Z+ i0 c/ i* C' L
https://github.com/guillaumekln/faster-whisper
- X, S) g9 W  b: u* ~; J4 A$ L安装如下:6 @" Q+ |& @1 P" q0 P5 V
1, Windows 10$ h4 I- U) h/ S) C8 Q1 D8 V! H4 `1 {
2, Python 3.10.11# G, |% G" i: w  t0 Q; U# z# o
3, CUDA 12.1: m: w8 a7 j$ k* B& Q2 [
4, 在python 3 中安装
5 i5 Y: R0 w3 y! Z; e# zpip install setuptools-rust torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu117# A( w. ^/ S' V+ \
这一步最后一个安装文件 cu117-cp310-cp310-win_amd64.whl 大小2343.6 MB,如果没显示,你得检查一下你的环境。  w  j5 o- L! s1 p: {2 i& @
5,pip install -U openai-whisper+ b( f  c4 `. C# W. z
这是向whisper 致敬,可以不装
% r( Z0 g% z: h8 p6 V8 _6,pip install faster-whisper
( b, p5 t4 D( l4 `# E4 x2 b) K% O----------------------------------------7 v( I/ ?+ Q! m8 g0 v8 ?- X
whisper 我用的命令行,faster-whisper 我用的是python。
( {' R$ X) f' v$ S+ u5 ?. G6 e" [. F下面给出了部分参考代码,根据主页上的参考代码我做了修改,但这个不是能运行的代码:. `0 C; ?. y! r! W
9 t3 U' u8 M8 a5 P4 X4 D4 E
----------------------------------------
5 ~! e7 ^7 Z' e. F1 C% `, H( k( u; k0 p5 P& }- {, M
from faster_whisper import WhisperModel( j3 i# e/ v/ C7 D

4 B5 w' `0 b0 M7 Pmodel_size = "small"
, p( k$ H& ~! K& L( ^) M# T: ~: Z/ R
model = WhisperModel(model_size, device="cuda", compute_type="int8")' F3 y# S& w" Z+ ?' H" H

9 W$ ~+ ?& j# i: U$ O- R$ u% }segments, info = model.transcribe(6 W+ ]/ I; R, w' s) ^
    sourceFileName,
, I' Q. v# b7 P' u. ]: n    beam_size=5,
& e+ |3 {, x& I6 K/ p    language="en", 5 l' N( n( Y7 S; H
    task="transcribe",
3 L, @4 U; |1 _$ q1 z7 a    word_timestamps=True, 4 q1 Z9 J  C" X" E7 X
    initial_prompt = "Hello, welcome to my lecture.")) g8 \  g4 ]. g9 @

9 r2 r  u9 }" {for segment in segments:$ M3 ]: }' i8 {/ _: D, C
    print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))
5 @3 }! b; |  g( e7 d9 k9 F
; q; V6 q1 s( L2 u        for word in segment.words:$ v! V5 X% l3 s3 W: \
                2 g* L5 w/ L; o2 c  S8 G
----------------------------------------
9 I3 C- \9 i- W
8 B6 L1 m* d* @7 {/ S; q. j9 }  w代码说明:
' s, |! R  U8 Z; s% P1,model.transcribe 只是建立了模型,并没有运行,运行 是从 for segment in segments: 这一句开始的。; |& }7 K$ M: P
但是这一步很重要(废话),我的程序有时候会无征兆退出就是在这一步,没有任何错误信息,倒是Windows 侦测到,但也没给出有意义的信息。
: x0 v' {- y! p7 g4 l' b, w2,segment 本身是很粗糙的,做字幕勉强能用。
* R- F4 S" z: G3,word 才是真正的精确控制的,本身带时间轴,所以要做比较好的字幕,必须用到word。+ A! s% Q1 T' x5 Z
4,word 里面是包含标点符号的,也就是说标点符号不是独立的,是附着在前一个word中
  \! A5 ^6 F: ~& l8 \比如 "faster." 这个句号是和前一个单词 faster 放在同一个 word 里面的。( q5 e; N* M+ G( q5 L" \4 N& u
5,model.transcribe 中参数说明:3 z% u* S# ]  W+ [" h! S
你要是对 whisper 的参数有所了解的话,基本上这些参数就是对应whisper 的参数8 ^  ^$ h9 F- a, U5 @0 }
其中# Q2 ?; {" r% ]3 C
    word_timestamps=True, ( |+ c$ @, [' l
保证了你能拿到 word,否则是拿不到的
9 v( H' m# z, x( m" S    initial_prompt = "Hello, welcome to my lecture.")
: A9 }2 R+ A: }, O- N保证能尽可能准确的断句 punctuation,但是不是决定性的。& K8 H/ V) ]9 b# M/ j
其他参数可参考源文件:
4 {" \( Q) `3 O7 G) Fhttps://github.com/guillaumekln/ ... isper/transcribe.py
5 q( @" {4 d4 _  D# B+ A152 def transcribe(( F- |8 X! N7 F9 k
从源文件你可以看到是支持中文的句号断句的。! d) H5 L4 t2 h

6 w: w9 j( b# s: j0 s* ~1 s6,如果要尽可能准确的 punctuation,根本办法是用比较大的模型 medium,或者更大。
5 y9 s! b, d8 Q; x, K1 e6 C) E7,我自己观察一个小时之内可以保证断句准确,再长就很可能不行,所以我的办法是切割文件到一个小时,识别后再聚合,效果不错。
  }& U1 K5 M, \  L; \/ E8,faster-whisper 会上传一些信息,检测到不停的使用网络,曾经有一次代码出错就是访问网络,你要是有洁癖就把网络暂时给关了。( L/ k+ o, \) D" Z+ T
8 ]# o0 G( X+ ]* ]% s6 i
, V, E. n9 ?2 ]8 V& \! J

# j# p! X( `1 d
作者: nanimarcus    时间: 2023-6-4 11:53
多谢各位榜爷打赏。




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