Utilisez le SDK HarmonyOS pour Qwen-Audio-3.0-Realtime afin de créer des conversations vocales en temps réel avec une entrée audio et une sortie audio ou textuelle.
Guide d'utilisation : Pour les présentations des modèles et les conseils de sélection, consultez Conversation vocale en temps réel.
Démarrage rapide
-
Téléchargez le SDK et exécutez l'exemple de code :
- Téléchargez le dernier package du SDK.
- Extrayez le package SDK
.tar.gz. Obtenez le SDK HAR depuisentry/libset ajoutez-le aux dépendances de votre projet. Pour l'intégration C++, utiliseznative/libsetnative/includedans le package pour obtenir les bibliothèques dynamiques et les fichiers d'en-tête. - Ouvrez le projet dans DevEco Studio. Le code d'exemple se trouve dans
DashQwenAudioChatPage.ets. Remplacez la clé API pour tester la fonctionnalité.
Procédure d'appel
- Initialiser le SDK.
- Définissez les paramètres pour votre cas d'utilisation. Utilisez l'argument
parametersde initialize pour définir les paramètres de connexion et de contrôle, et utilisez setParams pour définir les paramètres de conversation vocale. - Appelez startDialog pour démarrer la conversation.
- Dans onNuiAudioStateChanged, démarrez le périphérique d'enregistrement en fonction de l'état audio.
- Fournissez en continu des données d'enregistrement dans onNuiNeedAudioData, ou appelez updateAudio pour pousser activement les données d'enregistrement.
- Recevez en continu l'audio renvoyé par le modèle dans onNuiAssistEventCallback.
- Écoutez les événements et obtenez les informations d'événement dans onNuiEventCallback.
- Appelez stopDialog pour arrêter la conversation, et écoutez
EVENT_TRANSCRIBER_COMPLETEpour confirmer qu'elle est terminée. - Lorsque la fonctionnalité de conversation n'est plus nécessaire, appelez release pour libérer les ressources du SDK.
Gestion des périphériques audio
Contrairement à Android, qui utilise AudioRecord et AudioTrack, HarmonyOS fournit la capture et la lecture audio via @kit.AudioKit, en utilisant AudioCapturer pour l'enregistrement et AudioRenderer pour la lecture. Le projet d'exemple fournit les classes utilitaires AudioRecorder.ets et AudioPlayer.ets pour réutilisation.
Enregistrement (AudioCapturer)
- Création : Appelez
audio.createAudioCapturer(capturerOptions)de manière asynchrone. L'exemple utilise un audio mono 16 kHz, 16 bits (SAMPLE_RATE_16000,CHANNEL_1,SAMPLE_FORMAT_S16LEetENCODING_TYPE_RAW). -
Source audio (
audio.SourceType) :SOURCE_TYPE_MIC: Audio brut du microphone. Utilisez cette source lorsque l'AEC interne au SDK est activé, et envoyez les données au SDK en appelantupdateAudio.SOURCE_TYPE_VOICE_COMMUNICATION: Audio d'appel sur lequel le système a déjà effectué l'annulation d'écho. Utilisez cette source lorsque l'AEC interne au SDK est désactivé, et fournissez l'audio viaonNuiNeedAudioData.
- Événement de données : Appelez
capturer.on('readData', (buffer: ArrayBuffer) => void)pour obtenir en continu l'audio enregistré. - Événement d'état : Appelez
capturer.on('stateChange', (state: audio.AudioState) => void).STATE_RUNNINGindique que l'enregistrement a démarré, etSTATE_STOPPEDindique qu'il s'est arrêté. - Contrôle : Appelez
start()pour démarrer,stop()pour arrêter, etrelease()pour libérer l'enregistreur.
import { audio } from '@kit.AudioKit';
const audioStreamInfo: audio.AudioStreamInfo = {
samplingRate: audio.AudioSamplingRate.SAMPLE_RATE_16000,
channels: audio.AudioChannel.CHANNEL_1,
sampleFormat: audio.AudioSampleFormat.SAMPLE_FORMAT_S16LE,
encodingType: audio.AudioEncodingType.ENCODING_TYPE_RAW
};
const audioCapturerInfo: audio.AudioCapturerInfo = {
source: audio.SourceType.SOURCE_TYPE_MIC,
capturerFlags: 0
};
const options: audio.AudioCapturerOptions = { streamInfo: audioStreamInfo, capturerInfo: audioCapturerInfo };
audio.createAudioCapturer(options).then((capturer) => {
capturer.on('readData', (buffer: ArrayBuffer) => {
// Send the recorded audio to the SDK.
nuiInstance.updateAudio(buffer, false);
});
capturer.start();
});
Remarque : HarmonyOS crée
AudioCapturerde manière asynchrone. Appelezstart()uniquement une fois la création terminée. Ne créez pas et ne démarrez pas immédiatement un enregistreur dansSTATE_OPEN. Créez-le d'abord, puis appelezstart()depuis le rappelSTATE_OPEN. L'exemple crée l'enregistreur pendantdoInitet le démarre pendantonNuiAudioStateChanged.
Lecture (AudioRenderer)
- Création : Appelez
audio.createAudioRenderer(rendererOptions)de manière asynchrone. - Fréquence d'échantillonnage : L'audio de réponse synthétisé renvoyé par DashScope Realtime est de 24 kHz. Transmettez cette fréquence au constructeur
AudioPlayer. - Événement de données : Appelez
renderer.on('writeData', (data: ArrayBuffer): audio.AudioDataCallbackResult => ...)pour fournir l'audio pour la lecture. RenvoyezAudioDataCallbackResult.VALIDaprès avoir rempli le tampon ouINVALIDlorsqu'aucune donnée n'est disponible. - Événement d'état : Appelez
renderer.on('stateChange', (state: audio.AudioState) => void)pour écouter les événements de début et de fin de lecture. - Contrôle : Appelez
start()pour démarrer,stop()pour arrêter, etpause()pour mettre en pause la lecture. La mise en pause conserve les données en mémoire tampon.
import { audio } from '@kit.AudioKit';
const audioStreamInfo: audio.AudioStreamInfo = {
samplingRate: audio.AudioSamplingRate.SAMPLE_RATE_24000,
channels: audio.AudioChannel.CHANNEL_1,
sampleFormat: audio.AudioSampleFormat.SAMPLE_FORMAT_S16LE,
encodingType: audio.AudioEncodingType.ENCODING_TYPE_RAW
};
const audioRendererInfo: audio.AudioRendererInfo = {
usage: audio.StreamUsage.STREAM_USAGE_VOICE_ASSISTANT,
rendererFlags: 0
};
const options: audio.AudioRendererOptions = { streamInfo: audioStreamInfo, rendererInfo: audioRendererInfo };
audio.createAudioRenderer(options, (err, renderer) => {
renderer.on('writeData', (data: ArrayBuffer): audio.AudioDataCallbackResult => {
// Fill data with model response audio from the queue and return VALID or INVALID.
return audio.AudioDataCallbackResult.VALID;
});
renderer.start();
});
Signal de référence AEC : Lorsque l'AEC interne au SDK est activé, envoyez l'audio de sortie du lecteur au SDK en tant que signal de référence en appelant
nuiInstance.pushReferenceData(data, false), ce qui correspond àupdateRefAudiosur Android.
Déclaration des autorisations
Déclarez l'autorisation du microphone dans module.json5 avant d'enregistrer l'audio :
{
"requestPermissions": [
{ "name": "ohos.permission.MICROPHONE" }
]
}
Paramètres de requête
Paramètres de connexion et de contrôle
Transmettez une chaîne JSON dans l'argument parameters de initialize.
Exemple : La chaîne JSON suivante ne répertorie pas tous les paramètres. Ajoutez les paramètres nécessaires pour votre cas d'utilisation.
{
"url": "wss://dashscope.aliyuncs.com/api-ws/v1/inference",
"apikey": "st-****",
"device_id": "my_device_id",
"service_mode": "1"
}
Paramètres
| Paramètre | Type | Obligatoire | Description |
|---|---|---|---|
|
| Oui | Point de terminaison du service :
{WorkspaceId} par votre véritable ID d'espace de travail. |
|
| Oui | Clé API. |
|
| Oui | Mode d'exécution. Définissez ce paramètre sur |
|
| Oui | Une chaîne unique qui identifie l'utilisateur final. Vous pouvez utiliser un identifiant d'utilisateur dans l'application ou un identifiant d'appareil généré par le client. Cet identifiant est principalement utilisé pour le suivi des journaux et le dépannage. |
|
| Non | Indique s'il faut pousser activement les données audio. Valeur par défaut : |
|
| Non | Le chemin de stockage des fichiers de ressources sur l'appareil. Ce paramètre est requis lorsque |
|
| Non | Le chemin de stockage du fichier journal. Ce paramètre prend effet uniquement lorsque |
|
| Non | Indique s'il faut enregistrer l'audio de débogage sous |
|
| Non | Taille maximale du fichier journal en octets. Ce paramètre prend effet uniquement lorsque |
|
| Non | Le niveau de filtrage pour les journaux envoyés via |
|
| Non | Configuration AEC avancée sur l'appareil. Cet objet prend effet uniquement lorsque |
|
| Non | Indique s'il faut activer l'AEC sur l'appareil. Si |
|
| Non | Indique s'il faut enregistrer l'audio traité par le module AEC sur l'appareil. Si |
|
| Non | Indique s'il faut renvoyer l'audio traité par l'AEC via |
|
| Non | Configuration VAD avancée sur l'appareil. Cet objet prend effet uniquement lorsque |
|
| Non | Indique s'il faut activer le VAD sur l'appareil. Si |
|
| Non | Indique s'il faut enregistrer l'audio traité par le module VAD sur l'appareil. Si |
Paramètres de conversation vocale
Transmettez une chaîne JSON dans l'argument params de setParams.
Exemple : La chaîne JSON suivante ne répertorie pas tous les paramètres. Ajoutez les paramètres nécessaires pour votre cas d'utilisation.
{
"service_type": 4,
"nls_config": {
"model": "qwen-audio-3.1-realtime-plus",
"sr_format": "pcm"
}
}
Paramètres
| Paramètre de niveau supérieur | Type | Obligatoire | Description |
|---|---|---|---|
|
| Oui | Type de service vocal. Définissez ce paramètre sur |
|
| Oui | Configuration principale de la conversation vocale, y compris la sélection du modèle et le comportement de la conversation. |
|
| Oui | Nom du modèle. Prend en charge les séries de modèles |
|
| Oui | Format audio d'entrée. Seul |
|
| Non | Une chaîne contenant un tableau de modalités de sortie. Valeurs valides :
|
|
| Non | Voix TTS. La valeur par défaut est 3.1 Plus prend également en charge |
|
| Non | Indique s'il faut activer l'expression émotionnelle améliorée. Lorsqu'elle est activée, la voix de réponse présente des variations émotionnelles plus perceptibles. Valeur par défaut : |
|
| Non | Instructions système qui définissent le rôle du modèle, le style de réponse et les préférences comportementales pour l'ensemble de la session. |
|
| Non | Nombre maximal de tours de questions-réponses historiques autorisés dans une requête. Valeurs valides : 1 à 50. Valeur par défaut : |
|
| Non | Une chaîne contenant un tableau de définitions d'outils d'appel de fonction. Après avoir configuré ce paramètre, le modèle décide s'il doit appeler un outil en fonction de l'entrée de l'utilisateur. Chaque définition utilise |
|
| Non | Une chaîne contenant un objet JSON pour la détection des tours de parole. S'il est omis, la session utilise le mode push-to-talk, dans lequel l'audio est validé et l'inférence est déclenchée manuellement. S'il est défini, le mode de conversation duplex est activé. |
|
| Non | Type de VAD. |
|
| Non | Sensibilité du VAD. Ce paramètre s'applique uniquement à |
|
| Non | Durée minimale de silence après la parole, en millisecondes, avant que la réponse du modèle ne soit déclenchée. Ce paramètre s'applique uniquement à |
|
| Non | Une chaîne contenant un tableau d'URL d'audio préenregistré accessibles au public pour le locuteur cible. Ce paramètre s'applique uniquement à |
API clés
NativeNui
initialize
Initialise une instance du SDK de conversation vocale. Le SDK utilise le modèle singleton. Ne l'initialisez pas à nouveau avant d'appeler release.
Cette méthode peut bloquer. Appelez-la sur un thread autre que celui de l'interface utilisateur.
Signature de la méthodepublic initialize(
callback: INativeNuiCallback,
parameters: string,
level: number,
save_log: boolean = false
): number
Paramètres
| Paramètre | Type | Description |
|---|---|---|
|
| Une implémentation de l'interface de rappel des événements et des données. |
|
| Une chaîne JSON contenant les paramètres d'authentification, de connexion et de débogage. Voir Paramètres de connexion et de contrôle. |
|
| Contrôle le niveau d'impression des propres journaux du SDK. |
|
| Indique s'il faut enregistrer les journaux localement. Si défini sur |
setParams
Définit les paramètres de conversation vocale au format JSON. Appelez cette méthode avant startDialog.
Signature de la méthodepublic setParams(params: string): number
Paramètres
| Paramètre | Type | Description |
|---|---|---|
|
|
startDialog
Démarre la conversation.
Signature de la méthodepublic startDialog(vad_mode: Constants.VadMode, dialog_params: string): number
Paramètres
| Paramètre | Type | Description |
|---|---|---|
|
| Mode VAD. Fixé à |
|
| Si |
stopDialog
Met fin à la conversation. Après avoir appelé cette méthode, le serveur renvoie le résultat final de la conversation et met fin à la tâche.
Signature de la méthodepublic stopDialog(): number
cancelDialog
Met fin immédiatement à la conversation. Après avoir appelé cette méthode, la tâche se termine sans attendre que le serveur renvoie le résultat final de la conversation.
Signature de la méthodepublic cancelDialog(): number
dialogAction
Envoie une commande d'action de conversation pendant une interaction pour mettre à jour le comportement d'exécution, tel que le contexte de la conversation.
Signature de la méthodepublic dialogAction(params: string): number
Paramètres
| Paramètre | Type | Description |
|---|---|---|
|
| Une chaîne JSON utilisée pour mettre à jour le comportement d'exécution, tel que le contexte de conversation. |
|
| Définir sur |
|
| Commande d'exécution. Valeurs valides :
|
|
| Mise à jour de la requête d'appel de fonction. Utilisé lorsque |
|
| Type d'événement. Ce paramètre est requis lorsque |
|
| Obligatoire lorsque |
|
| Facultatif lorsque |
Paramètres de context.item :
| Paramètre | Type | Description |
|---|---|---|
|
| Identifiant unique facultatif de l'élément de conversation. S'il est omis, le serveur en génère un. Une erreur est renvoyée si l'identifiant spécifié existe déjà. |
|
| Type d'élément requis. Valeurs valides :
|
|
| Obligatoire pour |
|
| Obligatoire pour |
|
| Obligatoire pour |
|
| Obligatoire pour |
|
| Obligatoire pour |
|
| Obligatoire pour |
Paramètres de context.response :
| Paramètre | Type | Description |
|---|---|---|
|
| Modalités de sortie. |
|
| Remplace la voix TTS pour cette inférence. |
Exemple :
{
"type": "action",
"command": "function_call",
"context": {
"item": {
"call_id": "call_xxxx",
"output": "{\"city\":\"Hangzhou\",\"condition\":\"sunny\",\"temperature\":18}",
"type": "function_call_output"
},
"type": "conversation.item.create"
}
}
{
"type": "action",
"command": "function_call",
"context": {
"response": {
"modalities": ["text", "audio"]
},
"type": "response.create"
}
}
updateAudio
Lorsque audio_update_manually est défini sur "true", les données d'enregistrement ne sont plus fournies via onNuiNeedAudioData. Utilisez plutôt cette méthode pour pousser activement les données.
public updateAudio(data: ArrayBuffer, first_pack: boolean): number
Paramètres
| Paramètre | Type | Description |
|---|---|---|
|
| Données audio à pousser (PCM). |
|
| Indique s'il s'agit du premier paquet audio. Le SDK calcule le nombre d'octets à partir de |
pushReferenceData (correspond à updateRefAudio sur Android)
Lorsque audio_update_manually est défini sur "true" et que l'AEC sur l'appareil est activé, utilisez cette méthode pour pousser l'audio lu par le lecteur en tant que signal de référence.
public pushReferenceData(data: ArrayBuffer, first_pack: boolean): number
Paramètres
| Paramètre | Type | Description |
|---|---|---|
|
| Données audio à pousser (PCM). |
|
| Indique s'il s'agit du premier paquet audio. Le SDK calcule le nombre d'octets à partir de |
release
Libère toutes les ressources internes du SDK. L'instance du SDK devient indisponible après cet appel. Pour réutiliser le SDK, appelez initialize pour le réinitialiser.
Signature de la méthodepublic release(): number
GetVersion
Renvoie des informations sur la version actuelle du SDK.
Signature de la méthodepublic GetVersion(): string
Valeur de retour
Informations sur la version actuelle du SDK.
INativeNuiCallback : rappels de l'écouteur
onNuiEventCallback : écouter les informations d'événement
Signature de la méthodeonNuiEventCallback: (
event: Constants.NuiEvent,
resultCode: number,
arg2: number,
kwsResult: KwsResult,
asrResult: AsrResult
) => void;
Paramètres
| Paramètre | Type | Description |
|---|---|---|
|
| Événement de rappel. |
|
| Valide uniquement lorsque l’événement |
|
| Paramètre réservé. |
|
| Résultat de la reconnaissance vocale. |
|
| Résultat du réveil vocal. Vous n'avez pas besoin d'utiliser ce paramètre. |
onNuiAudioStateChanged : écouter l'état audio
Le SDK utilise ce rappel pour notifier à l'application quand démarrer ou arrêter l'enregistrement.
Signature de la méthodeonNuiAudioStateChanged: (state: Constants.AudioState) => void
Valeurs AudioState
| État | Description |
|---|---|
| L'interaction a démarré. Vous pouvez ouvrir le périphérique d'enregistrement et commencer l'enregistrement. |
| L'interaction s'est arrêtée. Vous pouvez arrêter l'enregistrement. |
| L'instance du SDK a été libérée. Vous pouvez fermer complètement le périphérique d'enregistrement. |
onNuiAudioRMSChanged : écouter le volume d'enregistrement
Écoute le volume d'enregistrement, qui peut être affiché dans l'interface utilisateur.
Signature de la méthodeonNuiAudioRMSChanged: (val: number) => number
Paramètres
| Paramètre | Type | Description |
|---|---|---|
|
| Volume d'enregistrement. |
onNuiNeedAudioData : fournir des données audio
Une fois la conversation démarrée, ce rappel est déclenché en continu. Fournissez les données audio à traiter dans ce rappel. Vous n'avez pas besoin d'utiliser ce rappel lorsque audio_update_manually est défini sur "true".
onNuiNeedAudioData: (buffer: ArrayBuffer) => number
Paramètres
| Paramètre | Type | Description |
|---|---|---|
|
| Données audio à fournir. Le SDK utilise |
Le nombre réel d'octets fournis.
onNuiAssistEventCallback : recevoir des données et des informations auxiliaires
Reçoit les événements auxiliaires internes du SDK et les données associées.
Signature de la méthodeonNuiAssistEventCallback?: (
event: Constants.NuiEvent,
info: string,
infoLen: number,
data: ArrayBuffer
) => void;
Paramètres
| Paramètre | Type | Description |
|---|---|---|
|
| Événement |
|
| Informations supplémentaires, généralement une chaîne JSON. |
|
| Longueur des informations supplémentaires. |
|
| Données binaires supplémentaires, telles que l'audio TTS renvoyé par le modèle. |
Remarque : Ce rappel est facultatif (
?) sur HarmonyOS. Omettez-le si vous n'avez pas besoin de ces informations.
onNuiLogTrackCallback : écouter les journaux de trace
Reçoit les journaux internes détaillés du SDK pour le dépannage et le débogage.
onNuiLogTrackCallback: (level: Constants.LogLevel, log: string) => void
NuiEvent : types d'événements
Dans le SDK HarmonyOS, les types d'événements sont définis par l'énumération Constants.NuiEvent. Le tableau suivant répertorie les événements liés à la conversation vocale en temps réel :
| Événement | Description |
|---|---|
| La tâche a démarré avec succès. |
| Déclenché immédiatement après le démarrage de la tâche. Cela ne signifie pas que le début de la parole a été détecté. |
| La fin de la parole a été détectée. |
| Un résultat intermédiaire de reconnaissance vocale. |
| Un résultat de reconnaissance vocale complet. |
| Une erreur s'est produite pendant la conversation vocale. |
| Déclenché lorsqu'aucune donnée audio n'est reçue pendant deux secondes consécutives. |
| Le début d'une phrase a été détecté. |
| La fin d'une phrase a été détectée et un résultat de reconnaissance complet a été renvoyé. |
| La conversation vocale est terminée. |
| Événement de transcription textuelle incrémentielle pour la sortie audio. Les segments de transcription sont renvoyés en mode streaming. |
| La transcription de la sortie audio est terminée. |
| Autres informations d'événement, telles qu'un résultat de Function Calling. |
| Le modèle a commencé à renvoyer l'audio TTS. |
| Audio TTS renvoyé par le modèle. |
| Le modèle a terminé de renvoyer l'audio TTS. |
| Un résultat de traduction intermédiaire. |
| La sortie du résultat de la traduction est terminée. |
| Données audio traitées par l'AEC. |