2025-10-11 18:25:59 +08:00

84 lines
2.0 KiB
C#

using System.Threading.Tasks;
using XiaoZhiSharp.Services;
namespace XiaoZhiSharp_MauiApp.Services
{
public class AudioService : IDisposable, IAudioService
{
// 音频参数
private const int SampleRate = 16000;
private const int Bitrate = 16;
private const int Channels = 1;
private const int FrameDuration = 60;
private const int FrameSize = SampleRate * FrameDuration / 1000; // 帧大小
private bool _isPlaying;
private bool _isRecording;
public event IAudioService.PcmAudioEventHandler? OnPcmAudioEvent;
public bool IsPlaying => _isPlaying;
public bool IsRecording => _isRecording;
public int VadCounter { get; private set; } = 0; // 用于语音活动检测的计数器
public AudioService()
{
}
public void StartRecording()
{
}
public void StopRecording()
{
}
/// <summary>
/// 静音检测
/// </summary>
private bool IsAudioMute(byte[] buffer, int bytesRecorded)
{
double rms = 0;
int sampleCount = bytesRecorded / 2; // 每个样本 2 字节
for (int i = 0; i < sampleCount; i++)
{
short sample = BitConverter.ToInt16(buffer, i * 2);
rms += sample * sample;
}
rms = Math.Sqrt(rms / sampleCount);
rms /= short.MaxValue; // 归一化到 0 - 1 范围
double MuteThreshold = 0.01; // 静音阈值
return rms < MuteThreshold;
}
public void StartPlaying()
{
}
public void StopPlaying()
{
}
public void AddOutSamples(byte[] pcmData)
{
}
public void AddOutSamples(float[] pcmData)
{
throw new NotImplementedException("不支持 float 类型的 PCM 数据");
}
public void Dispose()
{
}
}
}