|
|
本帖最后由 nanimarcus 于 2023-6-4 02:24 编辑 7 I0 J$ y1 b U, V! X- [& d4 Q
+ l: {2 _% v) @/ X2 X5 m+ U
借着 chatGPT 这股热潮研究了一下 Whisper,学名叫 automatic speech recognition (ASR) ,就是转换声音到文字的。
4 B7 k) [+ ^/ { a$ p; w/ p) J0 P效果我是很满意的,唯一不满的是速度,在六年前的主流显卡上基本上是一倍速,基本上只用在自己特别喜欢的媒体文件上了。
# v: q$ R+ U. w, @' X----------------------------------------
# I T$ B! r5 T7 N* H/ ~9 F( q" M显然不满意的不是我一个,活雷锋很快就出来了,名字很谦虚也很霸气 faster-whisper。/ P1 O. w7 q' v, f; @& W% A1 q
在六年前主力显卡3G内存上,model small,能跑到12倍速,这个是相当满意了。5 ?. J* m, p+ P
----------------------------------------5 |' Z2 H5 O9 y
https://github.com/guillaumekln/faster-whisper
3 _% v Y& n9 T安装如下:3 u# f [3 v4 L9 N
1, Windows 10
s* L. L6 S1 P2 t' N9 N2, Python 3.10.11$ T# @0 q3 v3 z' w9 N1 J1 W
3, CUDA 12.1
4 O9 w) T( Z& |8 r1 X* z! z4, 在python 3 中安装
! ~8 j/ i/ b9 @, Hpip install setuptools-rust torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu117' O% B( d: Q1 `5 k: y
这一步最后一个安装文件 cu117-cp310-cp310-win_amd64.whl 大小2343.6 MB,如果没显示,你得检查一下你的环境。
b' q6 C9 R, B6 P6 ^& E8 ~9 i5,pip install -U openai-whisper4 H5 k3 N( v! n0 f: P9 p) h0 q* m! X. o
这是向whisper 致敬,可以不装
/ v6 E5 ?# T. F6,pip install faster-whisper
6 \ K4 E. q+ m' ]) {) z----------------------------------------
+ h e( F3 G% d1 |( z" U* Jwhisper 我用的命令行,faster-whisper 我用的是python。) X2 L. P) F- c8 J( r8 }& X
下面给出了部分参考代码,根据主页上的参考代码我做了修改,但这个不是能运行的代码:! X1 f0 Q8 s+ u7 q1 d
1 G4 q G% S; b0 E3 E1 i
----------------------------------------
6 a( }, v! d) N( b( P T- b _( u/ l9 T; I8 q1 `. w
from faster_whisper import WhisperModel
C% K" C E9 ~& T- J
! D6 J2 I. ^, X4 d4 {model_size = "small"1 K8 J# V2 Q6 H9 c9 _
* |# ~3 w! B: z4 C9 A" Fmodel = WhisperModel(model_size, device="cuda", compute_type="int8")' o( {. k) {. I
" T( B% q8 K1 i3 ~3 ~
segments, info = model.transcribe(
1 U3 [; B; \8 F4 J% n8 R sourceFileName,
1 D% l4 o/ q; f2 Z p9 X$ n beam_size=5, - i, i6 t. b6 r# v: G6 ?8 p
language="en", # z; G8 t0 P V5 ?( n. @+ i
task="transcribe",
) c5 x" ^$ {& G; ] word_timestamps=True, $ u0 \) h# U9 N0 r# o( E* O
initial_prompt = "Hello, welcome to my lecture.")
, E& y) x# @0 P. A- y1 [& s
- ]" q* \1 K' r6 P. x( o$ x n; h) Gfor segment in segments:
& b1 S, d v( f& d2 C9 r print("[%.2fs -> %.2fs] %s" % (segment.start, segment.end, segment.text))5 U/ W- u* E! D; u" d' k
( N9 X# \3 f) J h( ~) K3 B
for word in segment.words:- |5 n4 @/ U+ _) T& Q M
3 d5 {1 ?/ j* r% o9 L ^
----------------------------------------1 ]) {" \/ g% q- a& w
9 b0 j- W- l/ e) K$ [# j/ ?代码说明:
/ e E) V7 G' j; T1,model.transcribe 只是建立了模型,并没有运行,运行 是从 for segment in segments: 这一句开始的。
- a+ Z7 b: `: |% n但是这一步很重要(废话),我的程序有时候会无征兆退出就是在这一步,没有任何错误信息,倒是Windows 侦测到,但也没给出有意义的信息。: R8 l( _$ n% _* `/ |+ q3 E
2,segment 本身是很粗糙的,做字幕勉强能用。/ j5 `1 a2 ]9 n
3,word 才是真正的精确控制的,本身带时间轴,所以要做比较好的字幕,必须用到word。8 [) P3 i* @: U4 p, B! r
4,word 里面是包含标点符号的,也就是说标点符号不是独立的,是附着在前一个word中* }5 N: c" p& ^' L3 {
比如 "faster." 这个句号是和前一个单词 faster 放在同一个 word 里面的。: w# W4 P2 s9 `, B" {. [
5,model.transcribe 中参数说明:
1 R1 s, ^5 t5 g2 B你要是对 whisper 的参数有所了解的话,基本上这些参数就是对应whisper 的参数3 w& E" J# ^6 a; k7 C9 t8 F
其中) R3 R# W( W8 K
word_timestamps=True, 3 V# ?$ B! p* N9 K2 v0 E# B
保证了你能拿到 word,否则是拿不到的$ O. n) e# a# E, S; j1 Z- {& P1 |
initial_prompt = "Hello, welcome to my lecture.")
. ]; I6 ]. v1 c% K& O/ \& p/ ^* g保证能尽可能准确的断句 punctuation,但是不是决定性的。8 E6 o! }: V4 y% M
其他参数可参考源文件:0 \2 h" ~0 T& G: \
https://github.com/guillaumekln/ ... isper/transcribe.py
7 t% R3 S: n3 W% D6 s' J) |1 M0 {152 def transcribe(
( u$ t6 \2 B) Z- c8 l& g从源文件你可以看到是支持中文的句号断句的。
$ \, L5 I- @& H8 r0 k" M8 U/ w
- c4 a+ G) U- Y g5 Y6 z6,如果要尽可能准确的 punctuation,根本办法是用比较大的模型 medium,或者更大。9 N/ l, X# _" L1 }. [* y
7,我自己观察一个小时之内可以保证断句准确,再长就很可能不行,所以我的办法是切割文件到一个小时,识别后再聚合,效果不错。1 y4 e& ^& p- a6 V9 O
8,faster-whisper 会上传一些信息,检测到不停的使用网络,曾经有一次代码出错就是访问网络,你要是有洁癖就把网络暂时给关了。
5 O5 @4 ~7 Y5 o) @2 C% E! S; b
% y; l- }6 {- L( q5 J6 b
' O% I1 A" y- [, G
4 _4 a5 l9 w: M# p+ l% L: c |
评分
-
查看全部评分
|