|
|
本帖最后由 nanimarcus 于 2023-6-4 02:24 编辑
- |! H5 }) I& l; l+ m. G% G# v6 A; l( Z
借着 chatGPT 这股热潮研究了一下 Whisper,学名叫 automatic speech recognition (ASR) ,就是转换声音到文字的。
2 Z3 w( g. U- J1 x; T效果我是很满意的,唯一不满的是速度,在六年前的主流显卡上基本上是一倍速,基本上只用在自己特别喜欢的媒体文件上了。9 i; Q& _ W' L5 k2 W
----------------------------------------
8 m- q. {% Q; S- }: ]( c% `( t显然不满意的不是我一个,活雷锋很快就出来了,名字很谦虚也很霸气 faster-whisper。
Q6 V. i2 ?! R, I0 y0 G0 [在六年前主力显卡3G内存上,model small,能跑到12倍速,这个是相当满意了。8 a, V7 D8 v9 _" U. m. S4 h8 G9 `4 C
----------------------------------------9 J+ o# g" Z, F9 r' N" d; R
https://github.com/guillaumekln/faster-whisper' |. L# k& Y J% O# p; I9 ]
安装如下:
, f a# J( e9 f5 _1, Windows 10
2 k; l% a: X# [( @2, Python 3.10.11* ]; K, V( S: A" M3 E$ ]
3, CUDA 12.18 L3 d7 _3 ? X' s
4, 在python 3 中安装
8 s9 e. U0 r& i$ d# Epip install setuptools-rust torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu117$ t) ^) L z' ?- t# Y" M. v+ A& @
这一步最后一个安装文件 cu117-cp310-cp310-win_amd64.whl 大小2343.6 MB,如果没显示,你得检查一下你的环境。1 b% M! S- y. [' Y0 u* v5 v: C8 l* W
5,pip install -U openai-whisper
4 A$ P6 ^7 c( j- y8 O+ e( J这是向whisper 致敬,可以不装
! S$ y$ h# t+ \# O e6,pip install faster-whisper
1 v( P. _. B0 X7 {2 h----------------------------------------' {6 P9 w( _/ K3 s; J
whisper 我用的命令行,faster-whisper 我用的是python。
' Q6 Z. ]+ f6 A$ \5 c, L- M下面给出了部分参考代码,根据主页上的参考代码我做了修改,但这个不是能运行的代码:
* J$ A- S, n) O
0 {2 u5 F3 V0 p1 u% f! E/ M. D----------------------------------------! I! z7 e. H# C
. N( I4 u4 y7 m( v3 O7 M4 S, C
from faster_whisper import WhisperModel0 b" \) f. s8 m( a' u$ J
: d, Y, h8 G0 i; M& j. tmodel_size = "small": A6 I* H4 j4 e) e# L( R7 S+ s/ q1 P
0 `- C/ C: z) T' v2 k
model = WhisperModel(model_size, device="cuda", compute_type="int8")
9 H; u& ?5 S1 L7 `2 g7 F9 e9 m2 u9 ]6 a( \, O
segments, info = model.transcribe(
( x) x1 y( i! B# V7 J sourceFileName,
. r# E' N% a8 r0 x* Y, N9 e beam_size=5, ! l: ~+ T% v. v0 L$ C
language="en",
3 F9 z$ U% r# d) Q# t task="transcribe", 3 W3 ?4 r1 l; B2 {0 n
word_timestamps=True, $ w) P! ~8 v! I& n/ ]
initial_prompt = "Hello, welcome to my lecture.")
8 c, T2 T: v% l& d
/ \ H, B) x# | E+ Afor segment in segments:2 H- v- [) b! E% M: J+ \1 ~5 v
print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))2 P$ ]" b# s# @/ i4 v
% y# ?: C7 `) |% }3 d9 k; @1 J
for word in segment.words:$ `, {+ c/ O4 C2 O9 M/ I0 d
7 r9 \. B P2 y% l; a----------------------------------------* v9 R. b$ J4 Z
, v, [4 u0 e/ E+ ?5 L6 _! v0 b
代码说明:5 c0 N2 Q% [9 I7 X& _% W h# U
1,model.transcribe 只是建立了模型,并没有运行,运行 是从 for segment in segments: 这一句开始的。$ Z" ]2 K8 g0 M# F
但是这一步很重要(废话),我的程序有时候会无征兆退出就是在这一步,没有任何错误信息,倒是Windows 侦测到,但也没给出有意义的信息。
: Q' ?. w- l! @, H7 m& {" \2,segment 本身是很粗糙的,做字幕勉强能用。( A, j" G2 k5 C7 B; e+ s
3,word 才是真正的精确控制的,本身带时间轴,所以要做比较好的字幕,必须用到word。# n- W; c1 b1 Q, e! `# ^
4,word 里面是包含标点符号的,也就是说标点符号不是独立的,是附着在前一个word中
: O, d' |" A. W, s比如 "faster." 这个句号是和前一个单词 faster 放在同一个 word 里面的。6 {' v0 h4 q) |
5,model.transcribe 中参数说明:
; Q. s1 H) `3 M1 T& o, Z你要是对 whisper 的参数有所了解的话,基本上这些参数就是对应whisper 的参数. ]# _4 E# o$ g/ t; J. S9 j
其中
& {# Y5 Q# n+ x word_timestamps=True,
3 i" N8 E. ~8 ?) {- T+ i5 c8 v保证了你能拿到 word,否则是拿不到的
8 V" ^7 r/ ?) q2 i. M5 Y initial_prompt = "Hello, welcome to my lecture.")( K) m" P2 L8 F, W# R
保证能尽可能准确的断句 punctuation,但是不是决定性的。0 }0 p, I0 Y/ ~3 m- C
其他参数可参考源文件:
& V! Z4 }8 p1 K( P) u vhttps://github.com/guillaumekln/ ... isper/transcribe.py+ n& e$ v$ y4 e% E y& l
152 def transcribe(1 Y% s+ f w+ S* u$ x% P: |
从源文件你可以看到是支持中文的句号断句的。8 H, U+ s& Y0 R5 r2 ]
! J5 t* d0 `' h
6,如果要尽可能准确的 punctuation,根本办法是用比较大的模型 medium,或者更大。1 s) k; h' _4 x! f/ j1 J
7,我自己观察一个小时之内可以保证断句准确,再长就很可能不行,所以我的办法是切割文件到一个小时,识别后再聚合,效果不错。/ M% Y) u: t. t' l! }) I) Q( Z1 t
8,faster-whisper 会上传一些信息,检测到不停的使用网络,曾经有一次代码出错就是访问网络,你要是有洁癖就把网络暂时给关了。
: M4 J" k$ ^4 w% \5 \) o5 F* N2 I* Q; V5 c% Q( H; l
% I \* q4 m: i- f
5 f' X1 f% M9 f |
评分
-
查看全部评分
|