6 c. L/ q, p) b% B: W" {3 ~- j, f
为了配合whisper语音识别,需要将mp3,wav,mp4等格式转换为其所需要的
- X+ v2 S$ \7 D/ zsampleRate为16000的格式。( h9 }; d$ c5 c$ o6 A3 j
本工具为命令行工具,根据命令提示輸入源文件和目标文件的目录。
& y+ E# Z. `& |2 p执行后,会在目标目录生成和源文件相同目录结构的wave文件,
& c% W$ H' y3 c- O4 h供语音识别之用。
$ ?0 @6 I3 B3 G2 k' D5 r7 T: k/ V, a7 K! ~& c0 O& {. t$ w
本工具需要配合ffmpeg64.exe,Processing.NDI.Lib.x64.dll," U w; n* j$ k1 i2 ~
可以从以下软件中获得。
8 }" F' M P$ D$ G% W$ qhttps://softaro.net/ffmpeggui/" N$ i3 r8 M' x4 M [. V1 ]; @
$ I0 ~; y; G0 a% Q0 |; L4 x
工具代码如下,vs2022编译即可
8 v4 G8 D* I, u' t; e- using System;
/ {9 `- O7 x' A. m x0 Q4 q - using System.Diagnostics;
" ^5 i# I6 v5 ]4 C8 v - using System.IO;0 s% w9 A4 {1 ?# o
- # w# N7 \( X! i [1 v+ A
- class Program/ I+ G- R: |/ l% u7 D+ F
- {
6 S- T& {7 G6 {: G+ K+ m! k - static void Main(string[] args)/ t& o7 l" l/ ~9 {
- {+ m0 {3 E* `" D' Q5 D
- Console.WriteLine("cvtWave");
$ R" L$ {( b' _ - Console.WriteLine("请输入源文件夹路径 (folder1):");
& K/ y2 Q- ^# U& l4 G - string sourceFolder = Console.ReadLine();4 M" ^, D2 U0 h5 y, z) L$ u* ]
- Console.WriteLine("请输入目标文件夹路径 (folder2):");' M3 _* ^% W; b
- string destinationFolder = Console.ReadLine();) t2 v, u. P- v5 t; [; F. C& ~# W
- E7 X$ P, H9 S8 c- ConvertFilesToWAV(sourceFolder, destinationFolder);. a- I8 w" d. p* A
- ( A* \) f k" K: a7 t9 ~5 R
- Console.WriteLine("转换完成.");# M* |# B. ^# ] m
- }
% e. p5 q- {& m0 ] - ; u7 C4 J& C( @5 N' Q; J; L
- static void ConvertFilesToWAV(string sourceFolder, string destinationFolder)
7 K7 |) `& @" K* }6 t! ~8 v - {( _% y/ Q! j) N. S, F$ K: J
- foreach (var sourceFilePath in Directory.GetFiles(sourceFolder, "*.*", SearchOption.AllDirectories))* S4 `! {& ?0 z# ^# H
- {
2 @' r2 [/ K# q - string extension = Path.GetExtension(sourceFilePath).ToLower();
" [8 `9 Z$ p) g3 d, S! Q5 M
" G z' x; f4 E7 l$ h- if (extension == ".mp4" || extension == ".avi" || extension == ".mp3")
, c& M% C# R4 @# D% y2 X: ?5 { - {0 x( u) q' q7 ]$ V
- string relativePath = Path.GetRelativePath(sourceFolder, sourceFilePath);8 ~3 m2 }( I$ b4 S% A( a
- string destinationFilePath = Path.Combine(destinationFolder, relativePath);
! X8 g0 s$ B: U8 N( L - destinationFilePath = Path.ChangeExtension(destinationFilePath, ".wav");& j/ L( Y$ J+ p) R! A* ^
/ _; w) \" @3 Q2 f- Directory.CreateDirectory(Path.GetDirectoryName(destinationFilePath));
5 C# h- ` J9 r/ }+ F - / F- }4 O+ X/ g& k4 a& f! Z G
- string ffmpegArgs = $"-i \"{sourceFilePath}\" -f wav -vn -b:a 256K -ar 16000 -y \"{destinationFilePath}\"";
8 D+ Z6 i1 b+ g, \( |- g3 \
" [& k) j9 m, E: Y- Process ffmpegProcess = new Process
5 d6 ]/ o5 o o+ ~/ n6 |6 Y; \9 K5 y% R - {6 D: L+ d- u0 U2 U# u% P, A
- StartInfo = new ProcessStartInfo
8 x" Z4 L2 b3 Q2 V- i - {: K$ j l" S/ t3 U; ]1 h
- FileName = "ffmpeg64.exe",* c, }' B- e) a; i
- Arguments = ffmpegArgs,# v* p3 ]1 i1 P* X7 {" X$ s
- UseShellExecute = false,
- U/ T1 I3 G3 p3 m5 X6 t3 ` - RedirectStandardError = true,
% w2 E1 p/ b4 [1 Y - CreateNoWindow = true
% f: r9 h4 x1 k5 i5 S5 W. H. K - }! H8 S" ~" E5 s% o+ L( n8 B. h
- };
- Q7 u3 u$ y5 e
7 L8 Y; L, B7 }9 f$ h+ M5 k- ffmpegProcess.Start();; t* T& U) \; S) M1 |
3 X; k: p1 v9 x, N4 b- while (!ffmpegProcess.StandardError.EndOfStream)
2 g, \! p A- W% h" { - {
# N. e4 ^9 N7 O! [- B0 r) W% p - string line = ffmpegProcess.StandardError.ReadLine();
% H- h8 i$ }1 h. x; F - Console.WriteLine(line);
( T) b3 J6 e' r: E/ e5 ?: X0 G - }
+ {! C/ c5 _7 N5 B- I
; O3 t) s7 t. }: @% `# `- ffmpegProcess.WaitForExit();
/ a9 K; \' H g* a: \6 Z% p - }
% g" _0 U2 R5 o) `" d8 h: ? - }0 F0 S j( Z0 e
- }
2 e8 W* k- I. P4 Z; y - }( U0 v. g, b8 y1 Q4 I2 y" s+ p
复制代码 ! R7 [7 t& D B' ]+ b2 c
8 v g H- X, Y+ Z3 k! C
0 A* v( n1 x# l& h) _: ]
- t5 a& m4 W* z! A8 n |