84 lines
2.0 KiB
C#
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()
|
|
{
|
|
|
|
}
|
|
}
|
|
} |