Le SDK client AOQ prend en charge la lecture audio personnalisée. Le mécanisme de callback de trames audio transmet les données PCM décodées à la couche applicative, vous permettant ainsi d'implémenter votre propre logique de rendu audio.
Présentation
Par défaut, le SDK client AOQ diffuse les données audio distantes reçues via le haut-parleur ou l'écouteur du système. Dans certains cas, le module de lecture audio intégré au SDK peut ne pas répondre à vos besoins. La lecture audio personnalisée s'avère utile lorsque vous devez :
- Diriger les données audio reçues vers un périphérique de lecture spécifique ou un pipeline de traitement audio.
- Post-traiter les données audio reçues, par exemple pour la reconnaissance vocale par IA ou l'application d'effets sonores.
- Contourner des conflits liés aux périphériques de lecture audio.
Le SDK client AOQ offre une prise en charge flexible de la lecture personnalisée. Le mécanisme de callback de trames audio fournit les données PCM décodées à la couche applicative pour leur rendu et leur diffusion.
Exemple de code
Bientôt disponible.
Prérequis
- Vous avez créé une instance de moteur en appelant
createEngine. - La connexion au serveur est établie (le callback
onConnectionStatusChangea signalé l'étatAoqConnectionStatusConnected).
Mise en œuvre
1. Démarrer la lecture audio en mode externe
Lors de l'appel à startAudioPlayer, définissez isExternal=true pour désactiver le périphérique de rendu audio interne du SDK. La couche applicative assure alors la lecture audio.
AoqClientEngine.AoqAudioPlaybackConfig config = new AoqClientEngine.AoqAudioPlaybackConfig();
config.isExternal = true; // Disable SDK internal playback; application layer renders audio
config.channel = 1; // Number of channels
engine.startAudioPlayer(config);
Paramètres :
Paramètre | Type | Valeur par défaut | Description |
|---|---|---|---|
isVoipMode | boolean | false | Active ou non le mode VoIP (AEC matériel). Valable sur mobile. |
isDefaultSpeaker | boolean | true | Définit si le haut-parleur est utilisé par défaut. Valable sur mobile. |
isExternal | boolean | false | Indique si le mode de lecture externe est activé. Si vrai, le SDK n'ouvre pas le périphérique de lecture. |
channel | int | 1 | Nombre de canaux |
2. Configurer l'écouteur de callback de trames audio
Appelez setAudioFrameObserver pour enregistrer l'écouteur de callback des données de trames audio. Implémentez la méthode de callback onPlaybackAudioFrame pour recevoir les données PCM de lecture.
engine.setAudioFrameObserver(new AoqClientListener.AoqAudioFrameListener() {
@Override
public void onPlaybackAudioFrame(@NonNull AoqClientEngine.AoqAudioFrameData frame) {
// Process the received playback audio data here
// frame.dataPtr: PCM data
// frame.numOfSamples: number of samples
// frame.numOfChannels: number of channels
// frame.samplesPerSec: sample rate
// frame.bytesPerSample: bytes per sample
playPcmData(frame);
}
});
3. Activer les callbacks de données de lecture
Appelez enableAudioFrameObserver pour activer les callbacks de trames audio au niveau de la position de lecture. Spécifiez AoqAudioSourcePlayback comme source de données.
AoqClientEngine.AoqAudioObserverConfig observerConfig = new AoqClientEngine.AoqAudioObserverConfig();
observerConfig.sampleRate = 48000; // Callback audio sample rate
observerConfig.channels = 1; // Callback audio channel count
observerConfig.mode = AoqClientEngine.AoqAudioObserverMode.AoqAudioObserverModeReadOnly; // Read-only mode
engine.enableAudioFrameObserver(
true, // Enable callbacks
AoqClientEngine.AoqAudioSource.AoqAudioSourcePlayback, // Playback data source
observerConfig
);
Paramètres :
Paramètre | Type | Valeur par défaut | Description |
|---|---|---|---|
sampleRate | int | 48000 | Taux d'échantillonnage audio du callback (Hz) |
channels | int | 1 | Nombre de canaux audio du callback |
mode | AoqAudioObserverMode | AoqAudioObserverModeReadOnly | Mode lecture/écriture |
4. Implémenter le rendu audio personnalisé
Lorsque des données PCM arrivent dans le callback onPlaybackAudioFrame, la couche applicative gère le rendu et la lecture. Les approches courantes incluent :
- Android AudioTrack : Écrire les données PCM sur le périphérique audio système via AudioTrack.
- Reconnaissance vocale par IA : Transmettre les données PCM à un moteur ASR pour la reconnaissance vocale.
- Effets audio : Appliquer des effets sonores aux données PCM avant leur diffusion.
- Stockage sur fichier : Enregistrer les données audio reçues dans un fichier local.
// Example: Playback using Android AudioTrack
private AudioTrack mAudioTrack;
private volatile boolean mPlayRunning = false;
private void initAudioTrack(int sampleRate, int channels) {
int channelConfig = (channels == 2)
? AudioFormat.CHANNEL_OUT_STEREO
: AudioFormat.CHANNEL_OUT_MONO;
int bufferSize = AudioTrack.getMinBufferSize(
sampleRate, channelConfig, AudioFormat.ENCODING_PCM_16BIT);
mAudioTrack = new AudioTrack(
AudioManager.STREAM_VOICE_CALL,
sampleRate,
channelConfig,
AudioFormat.ENCODING_PCM_16BIT,
bufferSize,
AudioTrack.MODE_STREAM);
mAudioTrack.play();
mPlayRunning = true;
}
private void playPcmData(AoqClientEngine.AoqAudioFrameData frame) {
if (!mPlayRunning || mAudioTrack == null) {
return;
}
if (frame.dataPtr != null && frame.dataSize > 0) {
mAudioTrack.write(frame.dataPtr, 0, frame.dataSize);
}
}
Remarques importantes :
- Le callback
onPlaybackAudioFrames'exécute sur un thread interne du SDK. Le pointeurframe.dataPtrn'est valide que pendant la durée du callback. Pour une utilisation asynchrone des données, copiez-les d'abord. - L'opération
AudioTrack.writeest bloquante. L'écriture directe dans le callback est acceptable car le SDK délivre les callbacks à un rythme contrôlé. - Maintenez le drapeau
mPlayRunningafin d'interrompre le traitement lors de l'arrêt du moteur ou de la lecture.
5. Arrêter la lecture personnalisée
Si la lecture personnalisée n'est plus nécessaire, désactivez d'abord le callback de trames audio, puis arrêtez le périphérique de lecture et libérez les ressources AudioTrack.
// 1. Disable audio frame callbacks at the playback position
AoqClientEngine.AoqAudioObserverConfig observerConfig = new AoqClientEngine.AoqAudioObserverConfig();
engine.enableAudioFrameObserver(
false, // Disable callbacks
AoqClientEngine.AoqAudioSource.AoqAudioSourcePlayback,
observerConfig
);
// 2. Remove the audio frame callback listener
engine.setAudioFrameObserver(null);
// 3. Stop SDK audio playback
engine.stopAudioPlayer();
// 4. Release AudioTrack resources
mPlayRunning = false;
if (mAudioTrack != null) {
mAudioTrack.stop();
mAudioTrack.release();
mAudioTrack = null;
}