audio: add frame to allow changing bot background sound
This commit is contained in:
@@ -6,14 +6,18 @@
|
|||||||
|
|
||||||
import asyncio
|
import asyncio
|
||||||
|
|
||||||
|
from dataclasses import dataclass
|
||||||
from typing import Any, Dict, Mapping
|
from typing import Any, Dict, Mapping
|
||||||
|
|
||||||
|
from botocore.model import instance_cache
|
||||||
import numpy as np
|
import numpy as np
|
||||||
|
|
||||||
from pipecat.audio.utils import resample_audio
|
from pipecat.audio.utils import resample_audio
|
||||||
from pipecat.processors.frame_processor import FrameProcessor, FrameDirection
|
from pipecat.processors.frame_processor import FrameProcessor, FrameDirection
|
||||||
from pipecat.frames.frames import (
|
from pipecat.frames.frames import (
|
||||||
CancelFrame,
|
CancelFrame,
|
||||||
|
ControlFrame,
|
||||||
|
ErrorFrame,
|
||||||
OutputAudioRawFrame,
|
OutputAudioRawFrame,
|
||||||
Frame,
|
Frame,
|
||||||
EndFrame,
|
EndFrame,
|
||||||
@@ -35,6 +39,11 @@ except ModuleNotFoundError as e:
|
|||||||
raise Exception(f"Missing module: {e}")
|
raise Exception(f"Missing module: {e}")
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class ChangeBotBackgroundFrame(ControlFrame):
|
||||||
|
sound_name: str
|
||||||
|
|
||||||
|
|
||||||
class BotBackgroundSound(FrameProcessor):
|
class BotBackgroundSound(FrameProcessor):
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
@@ -72,6 +81,8 @@ class BotBackgroundSound(FrameProcessor):
|
|||||||
elif isinstance(frame, TTSAudioRawFrame):
|
elif isinstance(frame, TTSAudioRawFrame):
|
||||||
frame.audio = self._mix_with_sound(frame.audio)
|
frame.audio = self._mix_with_sound(frame.audio)
|
||||||
await self.push_frame(frame)
|
await self.push_frame(frame)
|
||||||
|
elif isinstance(frame, ChangeBotBackgroundFrame):
|
||||||
|
await self._change_background_sound(frame)
|
||||||
else:
|
else:
|
||||||
await self.push_frame(frame, direction)
|
await self.push_frame(frame, direction)
|
||||||
|
|
||||||
@@ -86,6 +97,15 @@ class BotBackgroundSound(FrameProcessor):
|
|||||||
self._audio_task.cancel()
|
self._audio_task.cancel()
|
||||||
await self._audio_task
|
await self._audio_task
|
||||||
|
|
||||||
|
async def _change_background_sound(self, frame: ChangeBotBackgroundFrame):
|
||||||
|
if frame.sound_name in self._sound_files:
|
||||||
|
self._current_sound = frame.sound_name
|
||||||
|
self._sound_pos = 0
|
||||||
|
else:
|
||||||
|
error_msg = f"{self} sound {frame.sound_name} is not available"
|
||||||
|
logger.error(error_msg)
|
||||||
|
await self.push_error(ErrorFrame(error_msg))
|
||||||
|
|
||||||
def _load_sound_file(self, sound_name: str, file_name: str):
|
def _load_sound_file(self, sound_name: str, file_name: str):
|
||||||
try:
|
try:
|
||||||
logger.debug(f"{self} loading background sound from {file_name}")
|
logger.debug(f"{self} loading background sound from {file_name}")
|
||||||
|
|||||||
Reference in New Issue
Block a user