[WebRTC音频底座]:完成全双工音频基础模块,包含环形缓冲、APM接口和fake回声抑制测试
This commit is contained in:
@@ -23,6 +23,10 @@ class ErrorCode(str, Enum):
|
||||
AUDIO_PERMISSION_DENIED = "AUDIO_PERMISSION_DENIED"
|
||||
AUDIO_STREAM_UNDERRUN = "AUDIO_STREAM_UNDERRUN"
|
||||
AUDIO_FORMAT_UNSUPPORTED = "AUDIO_FORMAT_UNSUPPORTED"
|
||||
AUDIO_APM_UNAVAILABLE = "AUDIO_APM_UNAVAILABLE"
|
||||
AUDIO_APM_FORMAT_MISMATCH = "AUDIO_APM_FORMAT_MISMATCH"
|
||||
AUDIO_APM_PROCESS_FAILED = "AUDIO_APM_PROCESS_FAILED"
|
||||
AUDIO_BUFFER_OVERRUN = "AUDIO_BUFFER_OVERRUN"
|
||||
CONFIG_MISSING_VALUE = "CONFIG_MISSING_VALUE"
|
||||
WAKE_MODEL_MISSING = "WAKE_MODEL_MISSING"
|
||||
WAKE_MODEL_LOAD_FAILED = "WAKE_MODEL_LOAD_FAILED"
|
||||
@@ -78,6 +82,38 @@ class AudioFrame:
|
||||
if self.frame_id < 0:
|
||||
raise ValueError("frame_id must be non-negative")
|
||||
|
||||
@property
|
||||
def duration_ms(self) -> int:
|
||||
metadata_duration = self.metadata.get("duration_ms")
|
||||
if isinstance(metadata_duration, int):
|
||||
return metadata_duration
|
||||
bytes_per_sample = 2
|
||||
if self.channels <= 0:
|
||||
return 0
|
||||
sample_count = len(self.pcm) // (bytes_per_sample * self.channels)
|
||||
return round(sample_count * 1000 / self.sample_rate)
|
||||
|
||||
def to_fixture(self) -> dict[str, Any]:
|
||||
return {
|
||||
"pcm_hex": self.pcm.hex(),
|
||||
"sample_rate": self.sample_rate,
|
||||
"channels": self.channels,
|
||||
"timestamp_ms": self.timestamp_ms,
|
||||
"frame_id": self.frame_id,
|
||||
"metadata": dict(self.metadata),
|
||||
}
|
||||
|
||||
@classmethod
|
||||
def from_fixture(cls, data: Mapping[str, Any]) -> "AudioFrame":
|
||||
return cls(
|
||||
pcm=bytes.fromhex(str(data["pcm_hex"])),
|
||||
sample_rate=int(data["sample_rate"]),
|
||||
channels=int(data["channels"]),
|
||||
timestamp_ms=int(data["timestamp_ms"]),
|
||||
frame_id=int(data["frame_id"]),
|
||||
metadata=dict(data.get("metadata") or {}),
|
||||
)
|
||||
|
||||
|
||||
@dataclass(frozen=True, slots=True)
|
||||
class AudioSegment:
|
||||
|
||||
Reference in New Issue
Block a user