: r" L7 b; @0 T7 j4 T3 V为了配合whisper语音识别,需要将mp3,wav,mp4等格式转换为其所需要的; h8 n: W* P2 P, ?) J' d! N8 k/ k
sampleRate为16000的格式。$ W( Q% G. Y7 f1 p
本工具为命令行工具,根据命令提示輸入源文件和目标文件的目录。
! k! ^0 f7 D k2 A! Z执行后,会在目标目录生成和源文件相同目录结构的wave文件,
# j, {% @4 o$ C7 W3 c供语音识别之用。
' |( V2 I; S, n, h0 u. x; L1 ^6 g- h& K* l7 G
本工具需要配合ffmpeg64.exe,Processing.NDI.Lib.x64.dll,* w* E. C$ Z2 E2 E! _$ J9 u: S+ T( M
可以从以下软件中获得。
& k4 K: ]- X. W( P8 `1 i8 `$ Mhttps://softaro.net/ffmpeggui/
* |9 Z3 t; i- ~4 S7 i% h- c7 M& S( R% e
工具代码如下,vs2022编译即可. @) ~0 E" E+ A0 Y' X8 a* N
- using System; U+ U8 {; H: H T% B
- using System.Diagnostics;
% \- W7 g. O" h5 \ - using System.IO;; N$ r. R6 b- y& y; n2 J6 v
; c& P3 C9 {+ ^# ~: y- class Program6 z: g- l: D5 y( j5 q& K
- {
( T6 O" z4 h: z) y" ^' H3 [ - static void Main(string[] args) {& f0 D% {2 x% T
- {- T, Y) f4 _% i) t0 W* x# L
- Console.WriteLine("cvtWave");/ w- c( E$ k* F, P) O
- Console.WriteLine("请输入源文件夹路径 (folder1):"); \; D9 h7 H5 |( @0 ?/ }
- string sourceFolder = Console.ReadLine();
+ K$ n% h) R( w - Console.WriteLine("请输入目标文件夹路径 (folder2):");8 q! W$ L5 L$ H5 v: b: _7 t1 e
- string destinationFolder = Console.ReadLine();: j( h9 K0 f- M L7 @5 P
! q2 x4 M) ?7 w4 ~- ConvertFilesToWAV(sourceFolder, destinationFolder);' s) K2 {6 V _: \( P% ^3 r* E) Q
) d9 L' W/ s0 m: d. A4 [* g0 z: f- Console.WriteLine("转换完成.");
+ ?! h3 q. R+ A) ^7 j! ]1 p - }
% O0 O& b5 }% m6 P8 A" g0 o- ~ - 0 F/ |; i' F$ o
- static void ConvertFilesToWAV(string sourceFolder, string destinationFolder), F) r2 Q# k% N: b
- {8 s7 B7 f& }, T; `" I
- foreach (var sourceFilePath in Directory.GetFiles(sourceFolder, "*.*", SearchOption.AllDirectories))! N: E: E; E6 [; m* c
- {- e: S4 V6 A9 }
- string extension = Path.GetExtension(sourceFilePath).ToLower();, R4 G" Y5 a/ n" v* p& y
! [ c4 v8 O8 n. C: p- if (extension == ".mp4" || extension == ".avi" || extension == ".mp3")& q/ `, C) B, u4 W
- {
q1 |+ ^( l+ c) A; [ m9 e, j4 A1 y& a - string relativePath = Path.GetRelativePath(sourceFolder, sourceFilePath);
) E; `* T; y9 W4 N% U1 H; {' h7 h - string destinationFilePath = Path.Combine(destinationFolder, relativePath);- [9 x/ x. t0 X
- destinationFilePath = Path.ChangeExtension(destinationFilePath, ".wav");5 N |2 k" C i& W
5 S% c! l) A" w1 W! [4 u/ L: h- R- Directory.CreateDirectory(Path.GetDirectoryName(destinationFilePath));
" D, {: v) r* F- K. ]+ I3 p
) U- y# R. B7 ?' ] h7 L8 Z* y- string ffmpegArgs = $"-i \"{sourceFilePath}\" -f wav -vn -b:a 256K -ar 16000 -y \"{destinationFilePath}\"";
7 Q5 J. O6 G) W4 n# g1 K; i" G" X - 4 ^1 Q3 x" p, t) g" R! k
- Process ffmpegProcess = new Process+ S, ~9 y1 D6 {* ]( t
- {- k# H6 ^* t- [* v, J$ ^' Z! Z
- StartInfo = new ProcessStartInfo
7 j g3 X; C+ l. ~$ S - {
6 _1 J" h0 w% A, s+ v - FileName = "ffmpeg64.exe",
& x0 X0 s$ Z$ r0 a4 U - Arguments = ffmpegArgs,+ A+ \) J% B! }; \) p. @& P# @
- UseShellExecute = false,9 a/ a- D7 P; Z$ I# ~
- RedirectStandardError = true,5 k( R! w# _. X+ j
- CreateNoWindow = true3 R% o( t2 K- N+ G& ]# l
- }7 C0 u* ?4 d! }+ A' w: p, Y0 K
- };
$ p4 H* k3 q; N$ f8 x
1 s/ \ N ]/ A/ x4 J5 w+ `" g- ffmpegProcess.Start();! M6 [1 ?: ?+ t0 o! u5 h: Z
- " M( W N3 |# ] w6 h
- while (!ffmpegProcess.StandardError.EndOfStream)9 W4 u% A% }+ N2 X
- {
' z p# @( v2 S2 S - string line = ffmpegProcess.StandardError.ReadLine();% i/ n Z) }1 }0 F% H6 K7 [
- Console.WriteLine(line);; c5 V6 ]/ D# ?% v
- }
) j, C) S. W9 [+ q0 @, x5 R
$ j( s7 I2 k. q. Q) j. ~- ffmpegProcess.WaitForExit();6 W1 D- l" B0 |! `! K# q
- }( r# t* w+ y7 W7 U: u" C; @
- }- U; b% o$ j; Q' h- C. g
- }
, M1 I' p1 a6 ^: U9 a - }
- j) g* X7 h( r2 B) @
复制代码 / }' X! f! d. I; k: H, R! E
; q; U7 r( ?" T% K2 Z f1 n
! l1 h) k" t* G' v2 T3 T" T
2 f7 r0 P6 [; e- U/ j$ O6 H1 u
|