4 |& c9 O/ v L l为了配合whisper语音识别,需要将mp3,wav,mp4等格式转换为其所需要的, M& {( E! {4 i D0 v
sampleRate为16000的格式。
- X( z" G s; R$ U' w本工具为命令行工具,根据命令提示輸入源文件和目标文件的目录。
9 u4 E$ a) a5 U6 u F执行后,会在目标目录生成和源文件相同目录结构的wave文件,6 f9 y1 K9 E# b1 f( f4 K4 ^
供语音识别之用。
1 X+ T4 h+ O! g6 |) {( M; R3 \1 K) ?% R" D, ]
本工具需要配合ffmpeg64.exe,Processing.NDI.Lib.x64.dll,
0 v$ t. [( H4 N$ l' Q0 H' R" |) o+ m可以从以下软件中获得。7 O/ `5 n% f3 q ~
https://softaro.net/ffmpeggui/0 I' U: R8 V5 b2 _: P8 L0 K
& y- S q6 u( V* ^8 g/ [
工具代码如下,vs2022编译即可2 ~% [: E3 t0 a, x' M! _
- using System;
9 k! z ^. h2 W y0 M! p - using System.Diagnostics;
( |( A( F1 j, \ n - using System.IO;
0 q: Z8 q$ ^; S
# J% D6 s8 u% h0 Z& F( G7 h* |- class Program
g3 s3 X" |' j% l+ O* q% t$ \4 } - {0 s3 E( g$ O0 ~5 v* _
- static void Main(string[] args)
/ w: t3 a5 ~4 F1 n1 X8 T - {% r+ z. ]& G9 V! e
- Console.WriteLine("cvtWave");
% {' W* Q/ U: a! ^; s7 L q - Console.WriteLine("请输入源文件夹路径 (folder1):");
+ e0 L2 D/ N3 C2 r4 Z" c# f - string sourceFolder = Console.ReadLine();# D7 H @4 e7 ~2 L9 B, |/ \1 j
- Console.WriteLine("请输入目标文件夹路径 (folder2):");
6 A3 ~5 e' j7 m - string destinationFolder = Console.ReadLine();
% T; q+ Y- P# K. I4 W- v2 ~. R - 5 @2 v2 Z1 z# w9 Z8 b+ ^
- ConvertFilesToWAV(sourceFolder, destinationFolder);
4 p1 C( y! i: C9 } - - B$ @- c! b p$ G6 J$ P) ]
- Console.WriteLine("转换完成.");
9 b, K. c6 n0 O) z+ X - }
' p6 y1 }. v5 Y2 p" l8 B
& ~) A3 v7 f0 k- static void ConvertFilesToWAV(string sourceFolder, string destinationFolder)
6 {; h& g. l3 T - {% i, s, ]8 P. X& O+ d* J
- foreach (var sourceFilePath in Directory.GetFiles(sourceFolder, "*.*", SearchOption.AllDirectories))
8 ^; b' E% a# ]" o% l/ s - {
2 d8 n k' s0 `- | - string extension = Path.GetExtension(sourceFilePath).ToLower();) J' {' l" R) W8 |6 u9 E% B/ J
2 @2 z' \) s+ ^6 g- if (extension == ".mp4" || extension == ".avi" || extension == ".mp3")7 ?8 d$ G: D7 \/ r+ ~
- {
! @! A! v0 _# {6 t- p - string relativePath = Path.GetRelativePath(sourceFolder, sourceFilePath);" E. R7 Y$ n: K
- string destinationFilePath = Path.Combine(destinationFolder, relativePath);( C% D& R" K% \" b$ j' d8 a \
- destinationFilePath = Path.ChangeExtension(destinationFilePath, ".wav");
, [6 I& S5 @5 U4 E3 C f
8 ~- V2 k j7 d& ~- C8 P2 s- Directory.CreateDirectory(Path.GetDirectoryName(destinationFilePath));1 X. [7 s: m1 N; Z) N" ~" z
- % D% Z1 }2 b+ P% r8 h% S9 [
- string ffmpegArgs = $"-i \"{sourceFilePath}\" -f wav -vn -b:a 256K -ar 16000 -y \"{destinationFilePath}\"";( O9 _) o! Q2 B& c" m
# F; j9 G' w( f+ @- Process ffmpegProcess = new Process
3 b: J9 U+ {3 f! H - {
3 }5 I0 U- d) s6 X$ z - StartInfo = new ProcessStartInfo
. W! |8 i/ F( I0 D0 q. C& d - {
8 n6 X4 X6 o% r! k) H3 G - FileName = "ffmpeg64.exe",/ b# x0 q) l* @, `/ X
- Arguments = ffmpegArgs,5 J7 |" I1 L. @5 r! O
- UseShellExecute = false,& B2 P, A; t% ^. y2 Y0 G
- RedirectStandardError = true,5 h8 z0 P& L \+ i7 T, ^ f8 _, j
- CreateNoWindow = true
2 L* h9 L3 R) H% o5 [3 h, y - }9 J, K1 P6 r9 B2 T2 L
- };
- l F8 r( @/ M7 p
" c! R w L7 Z, K4 H- ffmpegProcess.Start();
2 Q4 H5 N; M3 ~# W; h
5 u9 m4 v6 K8 ?6 |+ _8 u% J0 P& B- while (!ffmpegProcess.StandardError.EndOfStream)
" }, F6 ?, F3 y( r4 M - {
$ Z- T5 K9 ~0 L: J! U! ?, J - string line = ffmpegProcess.StandardError.ReadLine();0 Q& _+ g% @2 _& H; h! Q9 F
- Console.WriteLine(line);
4 _1 x; q# s/ ^) y9 Z - }$ x- i5 s, o' M' e
- + K9 ^: o' f& o9 N. @
- ffmpegProcess.WaitForExit();. z, r/ p) k: \$ a g
- }
) \* n* h- x% z - }, p6 Z8 e! n/ z$ A
- }
/ E" O9 { L- E1 Q+ X( \ - }6 [7 Z9 w. T5 u
复制代码 ) k' ~! j" V" ?) C( u
6 T$ _; p' d8 v$ h* |7 I
7 k# _- T% Y& e4 ^
( E: u# S' T6 b |