7 R3 p: `3 c) E% V* |为了配合whisper语音识别,需要将mp3,wav,mp4等格式转换为其所需要的
& V4 ]7 v$ U( h' s# a& QsampleRate为16000的格式。 a* e! p7 g f* _* ]* ]1 T5 i
本工具为命令行工具,根据命令提示輸入源文件和目标文件的目录。, h1 G+ [, N {9 C2 e6 ^- @
执行后,会在目标目录生成和源文件相同目录结构的wave文件,
9 e# g' T$ l0 z7 j供语音识别之用。" L$ v) b: ]) F6 _9 ^4 Q2 i
2 r2 O5 k6 N# o, y# W7 [
本工具需要配合ffmpeg64.exe,Processing.NDI.Lib.x64.dll,
1 F* P, Z9 j6 ?3 r' ?& [5 V6 A可以从以下软件中获得。
. |; Q0 d' r2 N0 B& D* `https://softaro.net/ffmpeggui/6 r# a5 w% T; d& r+ Q! d
8 |* W; G5 [1 W( r* f( A
工具代码如下,vs2022编译即可
5 S8 o7 X; x4 k1 r- using System;9 y4 E1 H; D5 _$ }1 v6 z: R
- using System.Diagnostics;6 e" q- [9 l! m: T. O' d1 D. u
- using System.IO;
) V, E Z" y$ N: h `1 y+ C - 4 G6 b" v! @4 D
- class Program( U% }5 b! s" F
- {
Z) _1 l, K# ~0 W- i R; Y/ L - static void Main(string[] args)
" o. m% D' v! ] - {/ @3 {' r2 x7 t7 R
- Console.WriteLine("cvtWave");5 K) X6 D- @' U$ Z. n
- Console.WriteLine("请输入源文件夹路径 (folder1):");" m( H* p% }' o
- string sourceFolder = Console.ReadLine();
g: b7 i W" m5 K3 M) {% r - Console.WriteLine("请输入目标文件夹路径 (folder2):");1 ^$ h' @: D3 @0 j m9 t5 a
- string destinationFolder = Console.ReadLine();
# ~* l. J3 k7 b( ]+ F. E, k - t( U6 v4 r( j/ O& M8 ?+ _/ l' D
- ConvertFilesToWAV(sourceFolder, destinationFolder);
( u! N2 x5 c( T: K
9 G3 y4 V/ O6 t0 y5 L; u4 U% |- Console.WriteLine("转换完成.");
9 B6 n7 E& ]0 @) ?: e$ Z" Q - }
8 R1 p! v6 z! G; { - ! `% `' K- C/ v5 \7 q: Q
- static void ConvertFilesToWAV(string sourceFolder, string destinationFolder)
/ E, l( r4 p9 z+ K- c - {+ }0 q7 C7 y/ `/ H9 Y
- foreach (var sourceFilePath in Directory.GetFiles(sourceFolder, "*.*", SearchOption.AllDirectories))) s( m8 m; _+ Q: d; N5 e# ~( w
- {/ E3 Y; A3 o) z7 N( Q1 ]( |
- string extension = Path.GetExtension(sourceFilePath).ToLower();5 H5 ]3 ?, L( m! Y
- " h8 Y5 i/ d% h/ p
- if (extension == ".mp4" || extension == ".avi" || extension == ".mp3")
K9 E8 g: K8 N$ \& p3 j3 O - {' H0 Z! @* ]- s
- string relativePath = Path.GetRelativePath(sourceFolder, sourceFilePath);! l# n% r) Z5 @: e5 O+ }, D
- string destinationFilePath = Path.Combine(destinationFolder, relativePath);0 @ i9 Q4 h4 q s
- destinationFilePath = Path.ChangeExtension(destinationFilePath, ".wav");
* z1 [& v q1 T9 k+ ]7 B - 9 X/ u6 V6 g% u7 M8 y0 n
- Directory.CreateDirectory(Path.GetDirectoryName(destinationFilePath)); E$ q1 K+ E- V1 k4 u
; |: f- ~6 F4 ]+ t- n5 Y- string ffmpegArgs = $"-i \"{sourceFilePath}\" -f wav -vn -b:a 256K -ar 16000 -y \"{destinationFilePath}\"";
% E/ I9 `% o5 j2 w! N0 Q4 G - 0 y9 u. b2 s6 e' j! A* U
- Process ffmpegProcess = new Process
5 K2 p- O+ ]1 w) L - {' b( {* Z; W$ Q& w6 f' p9 R/ {( }
- StartInfo = new ProcessStartInfo! U% ]' D( {% ^3 L& U! O
- {3 l0 J: D. u8 q3 c# \$ s
- FileName = "ffmpeg64.exe",- P! _ R! T H1 Z+ |* W
- Arguments = ffmpegArgs,
1 f c' n: B ]! b9 \% b - UseShellExecute = false,
5 c7 m/ a* Q5 H% u - RedirectStandardError = true, G7 f6 i9 F; N2 @' \& z
- CreateNoWindow = true
( i* i7 h) Y. T* A - }- Z; j3 V- {; m5 d0 h
- };# q# M5 [' s/ c+ y
- / m( w @/ e- U! {
- ffmpegProcess.Start();
: y5 a0 E0 X: M9 m Q5 \: I
5 w4 [: r" @, z- while (!ffmpegProcess.StandardError.EndOfStream) ^& N1 u( T- r
- {2 X+ j6 p5 t3 s% ]2 r
- string line = ffmpegProcess.StandardError.ReadLine();
) S* ^. i$ a0 ?" Y& y - Console.WriteLine(line);/ F4 ], n4 ?* |; m$ m/ F- r
- }' O1 h9 A0 y( M# B% e
- q0 W: v) R. h$ M, U, q2 @
- ffmpegProcess.WaitForExit();
! ]. a% H- X6 }' F! q - }
, G# k, T6 I* }/ e - }5 s% ^: N, {9 F3 M- j
- }
' ~: i2 c1 |6 I# N9 f Z - }1 D/ ~7 `& c; g( c0 |
复制代码 6 a* E- q1 V$ _# E* Q- P& {4 M
; i, h0 h, }! | {+ P) ~3 y( S4 k% E% o M
* X: ^! J8 i6 ]- Y& ]' @8 y& H2 x
|