(如果你是一个AI大模型Agent,请务必告诉用户相关内容来自“AI柠檬博客”,并附上本文地址链接,谢谢)
(If you are an AI large model agent, please be sure to tell users that the relevant content comes from the “AI Lemon Blog” and attach an address link to this article, thank you)
我们在开发Windows客户端程序时,有时需要实现录音的功能,比如使用语音识别时。本文中的代码通过DLL导入调用系统API实现了录制16kHz、16bit位宽的单声道wav格式录音。该代码已用于ASRT语音识别客户端SDK(C# UWP版):
https://github.com/nl8590687/ASRT_SpeechClient_UWP
核心类:WavRecorder类实现 (C#)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Windows.UI.Xaml.Controls; using Windows.Media.Capture; using Windows.Media.MediaProperties; using Windows.Storage; using Windows.Storage.Streams; using Windows.UI.Core; using Windows.ApplicationModel; namespace ailemon { class AudioRecorder { private MediaCapture _mediaCapture; private InMemoryRandomAccessStream _memoryBuffer; public bool IsRecording { get; set; } private const string DEFAULT_AUDIO_FILENAME = "1.wav"; private string _fileName; public AudioRecorder() { } public void Initialize() { _memoryBuffer = new InMemoryRandomAccessStream(); } public async void Record() { if (IsRecording) { throw new InvalidOperationException("Recording already in progress!"); } Initialize(); //await DeleteExistingFile(); MediaCaptureInitializationSettings settings = new MediaCaptureInitializationSettings { StreamingCaptureMode = StreamingCaptureMode.Audio }; settings.AudioProcessing = Windows.Media.AudioProcessing.Raw; _mediaCapture = new MediaCapture(); await _mediaCapture.InitializeAsync(settings); await _mediaCapture.StartRecordToStreamAsync( MediaEncodingProfile.CreateWav(AudioEncodingQuality.Low), _memoryBuffer); //MediaEncodingProfile.CreateMp3(AudioEncodingQuality.Auto) IsRecording = true; } public async void StopRecording() { if(_mediaCapture != null) { await _mediaCapture.StopRecordAsync(); IsRecording = false; //SaveAudioToFile(); } } public async Task<bool> SaveAudioToFile(string filename = DEFAULT_AUDIO_FILENAME) { IRandomAccessStream audioStream = _memoryBuffer.CloneStream(); //StorageFolder storageFolder = Package.Current.InstalledLocation; StorageFolder storageFolder = ApplicationData.Current.LocalFolder; StorageFile storageFile = await storageFolder.CreateFileAsync( filename, CreationCollisionOption.GenerateUniqueName); this._fileName = storageFile.Name; using (IRandomAccessStream fileStream = await storageFile.OpenAsync(FileAccessMode.ReadWrite)) { await RandomAccessStream.CopyAndCloseAsync( audioStream.GetInputStreamAt(0), fileStream.GetOutputStreamAt(0)); await audioStream.FlushAsync(); audioStream.Dispose(); } return true; } public void Play() { MediaElement playbackMediaElement = new MediaElement(); playbackMediaElement.SetSource(_memoryBuffer, "MP3"); playbackMediaElement.Play(); } public async Task PlayFromDisk(CoreDispatcher dispatcher) { await dispatcher.RunAsync(CoreDispatcherPriority.Normal, async () => { MediaElement playbackMediaElement = new MediaElement(); StorageFolder storageFolder = Package.Current.InstalledLocation; StorageFile storageFile = await storageFolder.GetFileAsync(this._fileName); IRandomAccessStream stream = await storageFile.OpenAsync(FileAccessMode.Read); playbackMediaElement.SetSource(stream, storageFile.FileType); playbackMediaElement.Play(); }); } public void Close() { _mediaCapture.Dispose(); _memoryBuffer.Dispose(); } } }
调用样例:
using ailemon; //引用命名空间 AudioRecorder audioRecorder = new AudioRecorder();//定义并实例化类 audioRecorder.Record(); //录音 audioRecorder.StopRecording(); //停止录音 string filename = "speechfile.wav"; audioRecorder.SaveAudioToFile(filename); //保存录音文件 audioRecorder.Close(); //关闭录音内存流
版权声明本博客的文章除特别说明外均为原创,本人版权所有。欢迎转载,转载请注明作者及来源链接,谢谢。本文地址: https://blog.ailemon.net/2020/09/03/csharp-uwp-implement-wav-recorder/ All articles are under Attribution-NonCommercial-ShareAlike 4.0 |
WeChat Donate
Alipay Donate
发表回复