audio — Module Audio

Le module audio permet d’enregistrer des échantillons audio depuis un microphone. Les échantillons PDM capturés par le microphone sont filtrés et décimés en échantillons PCM, qui peuvent être transmis à une fonction de rappel utilisateur ou lus directement dans un tampon.

Fonctions

audio.init(channels: int = 1, frequency: int = 16000, gain_db: int = 24, highpass: float | bool = 0.9883, samples: int = -1, buffers: int = 16, overflow: bool = True, clkdiv: int = 0) None

Initialise le module audio. Doit être appelée en premier avant d’utiliser le module audio.

channels est le nombre de canaux audio. Peut valoir 1 ou 2. Les échantillons audio sont entrelacés lorsque plusieurs canaux sont utilisés. La capture multicanal n’est prise en charge que sur les cartes équipées de plus d’un microphone.

frequency est la fréquence d’échantillonnage PCM en Hz. L’ensemble des fréquences prises en charge dépend du port et de la carte.

gain_db est le gain du microphone à appliquer, en décibels.

highpass est le coefficient du filtre passe-haut (STM32) ou un booléen activant le filtre passe-haut (Alif). Ignoré sur les ports qui n’implémentent pas de filtre passe-haut.

samples est le nombre d’échantillons PCM à accumuler par appel de la fonction de rappel. S’il est réglé à -1, la valeur est calculée automatiquement à partir du facteur de décimation et du nombre de canaux. Doit être un multiple de 16. Disponible sur les ports STM32 et Alif.

buffers est le nombre de tampons PCM internes utilisés pour mettre en file d’attente les échantillons entre l’ISR du DMA et l’utilisateur. Disponible sur les ports Alif et RP2.

overflow détermine si un débordement de tampon déclenche une RuntimeError. Lorsqu’il vaut False, le tampon le plus ancien est écrasé et le flux continue. Disponible sur les ports Alif et RP2.

clkdiv remplace le diviseur d’horloge PIO utilisé pour piloter l’horloge PDM. Lorsqu’il vaut 0, le diviseur est calculé à partir de la fréquence demandée. Disponible sur le port RP2.

audio.start_streaming(callback: Callable[[bytearray], None] | None) None

Démarre la capture audio.

callback est appelée par l’ordonnanceur avec un unique argument pcmbuf chaque fois qu’un nouveau tampon PCM est prêt. pcmbuf est un bytearray d’échantillons PCM signés sur 16 bits dont la longueur est déterminée par le facteur de décimation, le nombre de canaux et l’argument samples passé à audio.init(). En mode monocanal, chaque entrée correspond à un échantillon de 16 bits ; en mode bicanal, les échantillons sont entrelacés par paires.

Sur les ports qui prennent en charge audio.get_buffer() (Alif et RP2), passer une valeur non appelable (par exemple None) démarre la capture sans fonction de rappel, de sorte que les tampons puissent être vidés avec audio.get_buffer() à la place.

audio.stop_streaming() None

Arrête la capture audio et supprime toute fonction de rappel installée.

audio.get_buffer(timeout: int = 0) bytearray

Renvoie le prochain tampon PCM disponible. Bloque jusqu’à ce qu’un tampon soit prêt ou jusqu’à ce que timeout millisecondes se soient écoulées (0 signifie attendre indéfiniment). Déclenche une RuntimeError si le flux n’est pas activé, si un débordement de tampon s’est produit alors que overflow vaut True, ou si une fonction de rappel de flux est installée.

Disponible sur les ports Alif et RP2.

audio.read_pdm(buf: bytearray) None

Lit les échantillons PDM bruts du microphone directement dans buf. buf doit être un array/bytearray dont la taille des éléments correspond au nombre de canaux (1 octet pour le mono, 2 octets pour le stéréo).

Disponible uniquement sur le port STM32 (cartes basées sur SAI).

audio.samples() int

Renvoie le nombre total d’échantillons PCM capturés depuis le dernier appel à audio.start_streaming().

Disponible uniquement sur le port RP2.

audio.overflow() bool

Renvoie True si un débordement de tampon s’est produit depuis le dernier appel à audio.start_streaming().

Disponible uniquement sur le port RP2.