爱吱声

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

作者: nanimarcus    时间: 2023-6-4 02:10
标题: faster-whisper 更快的语音到文字的识别 ASR
本帖最后由 nanimarcus 于 2023-6-4 02:24 编辑 , U$ \# O7 Y% ]4 M+ O- e; E$ s* {4 k$ `
8 R* t' c1 c$ e- l" P1 @! G
借着 chatGPT 这股热潮研究了一下 Whisper,学名叫 automatic speech recognition (ASR) ,就是转换声音到文字的。* w6 ?; r1 Y: c! c/ g& `( H
效果我是很满意的,唯一不满的是速度,在六年前的主流显卡上基本上是一倍速,基本上只用在自己特别喜欢的媒体文件上了。
8 w; V4 ~1 h5 Q9 ^" p----------------------------------------
$ W# w1 N: [( G: }: j, A显然不满意的不是我一个,活雷锋很快就出来了,名字很谦虚也很霸气 faster-whisper。
: \" B3 J, ]5 p# L; `& Q在六年前主力显卡3G内存上,model small,能跑到12倍速,这个是相当满意了。
5 r% o% E* A) e----------------------------------------  X  a) E4 N+ P, l
https://github.com/guillaumekln/faster-whisper5 Q- {3 [( u' p0 T1 ]6 Y
安装如下:4 R' [+ k5 S( {: w8 H9 D6 W
1, Windows 107 p! ~. y/ ]0 O; M
2, Python 3.10.113 d# t* i1 ]6 e- Q
3, CUDA 12.1" |/ k7 Z3 t+ u6 K- P
4, 在python 3 中安装
' Y/ h1 ^$ B0 l. Gpip install setuptools-rust torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu1170 g9 e* `* r7 ^
这一步最后一个安装文件 cu117-cp310-cp310-win_amd64.whl 大小2343.6 MB,如果没显示,你得检查一下你的环境。
2 X' W# @5 B: c; g4 |8 N5,pip install -U openai-whisper
2 }# H) H3 P1 {  p8 N. _6 n+ q这是向whisper 致敬,可以不装# D% s2 p5 i3 B* t$ ?9 ^% T/ q6 G
6,pip install faster-whisper. _! |  D) o( e5 f
----------------------------------------
3 J: V( `" P: B, ]4 [5 Dwhisper 我用的命令行,faster-whisper 我用的是python。* E' V1 K! \. b) W9 N, q
下面给出了部分参考代码,根据主页上的参考代码我做了修改,但这个不是能运行的代码:
3 ]! i6 H$ a; d& r+ I9 {3 b" t+ Q- k' m" w8 w
----------------------------------------
8 m( }( l: d3 }, n/ |) V: b3 y& @
from faster_whisper import WhisperModel
2 V! z- _  D1 A3 V8 F7 w& [/ b
  X; Q- Q1 O  R  H5 G. pmodel_size = "small", _" W* j7 W" L1 }- C( n' w/ S2 k
+ k$ E" |& Y" |% N
model = WhisperModel(model_size, device="cuda", compute_type="int8")
- v$ c# `0 V! J; \6 x  Z0 J3 C* Q( w9 U  t* P
segments, info = model.transcribe(( G( n2 ?) l& C! x- S: |& R" u7 a
    sourceFileName,
5 n4 M+ j2 O. Q# \* X" \* `    beam_size=5,
6 N, Y0 M2 n' c) @. H    language="en",
: L) l* j/ ]3 z8 o3 U    task="transcribe", 5 W+ w0 b" N+ _' E/ b
    word_timestamps=True, ; T- ]- }% \5 r' L% J! T
    initial_prompt = "Hello, welcome to my lecture.")
' w: L3 J- g  |+ w( J* U, n  i# f4 b8 h
for segment in segments:
/ y5 o* d7 {7 i    print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))
& v2 q  h+ d- U4 d
4 q, ]- t0 g* x: C        for word in segment.words:
0 W1 ?% Q) ?9 S) W                ' O. \/ L- L. ^
----------------------------------------
& m9 j4 h( F% V) X1 i" ?
* O6 j; l3 m, t7 `8 `代码说明:
% Q5 z( c  u& \( |: z1,model.transcribe 只是建立了模型,并没有运行,运行 是从 for segment in segments: 这一句开始的。. |+ y6 o) f- L/ Z$ a. P7 v: A1 }
但是这一步很重要(废话),我的程序有时候会无征兆退出就是在这一步,没有任何错误信息,倒是Windows 侦测到,但也没给出有意义的信息。. A. ^1 A' w3 R( T6 ~
2,segment 本身是很粗糙的,做字幕勉强能用。
9 f& l( a2 g6 {& a( V, p& C3,word 才是真正的精确控制的,本身带时间轴,所以要做比较好的字幕,必须用到word。2 d- ?  j) \6 O8 p5 b5 L1 H) y
4,word 里面是包含标点符号的,也就是说标点符号不是独立的,是附着在前一个word中7 U$ o% I7 z# m7 o
比如 "faster." 这个句号是和前一个单词 faster 放在同一个 word 里面的。
8 ]3 F& \5 }$ j) C5,model.transcribe 中参数说明:2 X- }) ?. ]; X* Y8 h8 Z9 C$ H7 ]9 j
你要是对 whisper 的参数有所了解的话,基本上这些参数就是对应whisper 的参数
  U$ P' C+ p) }+ @+ _* o其中
0 v9 g# [7 w8 d9 j" I/ U    word_timestamps=True, $ u) ]# Q: g* r& [
保证了你能拿到 word,否则是拿不到的
3 M3 C1 Q+ M$ P- ^, c# ~, H7 ^    initial_prompt = "Hello, welcome to my lecture.")# s  L7 M4 n; l( Y- [
保证能尽可能准确的断句 punctuation,但是不是决定性的。/ S* `5 L' b; X6 g! V/ F: x
其他参数可参考源文件:
1 l% V7 S" y& C8 I  H: Lhttps://github.com/guillaumekln/ ... isper/transcribe.py
  P- F9 |- S1 v: @152 def transcribe(
4 v7 {" F3 l- @& @从源文件你可以看到是支持中文的句号断句的。6 X& X6 K- Q( o: I( i& y, Z1 u
0 J# W3 G, k6 V9 h. G% x& k9 i
6,如果要尽可能准确的 punctuation,根本办法是用比较大的模型 medium,或者更大。
7 p7 t( @- X: R, Z8 V5 A7,我自己观察一个小时之内可以保证断句准确,再长就很可能不行,所以我的办法是切割文件到一个小时,识别后再聚合,效果不错。  a& \* T& a, k9 {" `
8,faster-whisper 会上传一些信息,检测到不停的使用网络,曾经有一次代码出错就是访问网络,你要是有洁癖就把网络暂时给关了。
9 Q8 W3 x! o6 ~  F" E
$ C+ @# ~, c. u
0 n4 O0 w1 a1 ~" @& I
! N$ \8 Z  ^3 E( o- c. s4 K
作者: nanimarcus    时间: 2023-6-4 11:53
多谢各位榜爷打赏。




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