Utilice el SDK de HarmonyOS para Qwen-Audio-3.0-Realtime con el fin de crear conversaciones de voz en tiempo real con entrada de audio y salida de audio o texto.
Guía del usuario: Para introducciones a los modelos y consejos de selección, consulte Conversación de voz en tiempo real.
Inicio rápido
-
Descargue el SDK y ejecute el código de ejemplo:
- Descargue el paquete más reciente del SDK.
- Extraiga el paquete del SDK
.tar.gz. Obtenga el SDK HAR deentry/libsy agréguelo a las dependencias de su proyecto. Para la integración con C++, utilicenative/libsynative/includeen el paquete para obtener las bibliotecas dinámicas y los archivos de encabezado. - Abra el proyecto en DevEco Studio. El código de ejemplo se encuentra en
DashQwenAudioChatPage.ets. Reemplace la clave API para probar la función.
Procedimiento de llamada
- Inicialice el SDK.
- Configure los parámetros para su caso de uso. Utilice el argumento
parametersde initialize para establecer los parámetros de conexión y control, y utilice setParams para establecer los parámetros de conversación de voz. - Llame a startDialog para iniciar la conversación.
- En onNuiAudioStateChanged, inicie el dispositivo de grabación según el estado del audio.
- Suministre continuamente datos de grabación en onNuiNeedAudioData, o llame a updateAudio para enviar activamente datos de grabación.
- Reciba continuamente el audio devuelto por el modelo en onNuiAssistEventCallback.
- Escuche los eventos y obtenga la información de los mismos en onNuiEventCallback.
- Llame a stopDialog para detener la conversación y escuche
EVENT_TRANSCRIBER_COMPLETEpara confirmar que ha finalizado. - Cuando ya no necesite la función de conversación, llame a release para liberar los recursos del SDK.
Gestión de dispositivos de audio
A diferencia de Android, que utiliza AudioRecord y AudioTrack, HarmonyOS proporciona captura y reproducción de audio a través de @kit.AudioKit, utilizando AudioCapturer para la grabación y AudioRenderer para la reproducción. El proyecto de ejemplo proporciona las clases de utilidad AudioRecorder.ets y AudioPlayer.ets para su reutilización.
Grabación (AudioCapturer)
- Crear: Llame a
audio.createAudioCapturer(capturerOptions)de forma asíncrona. El ejemplo utiliza audio mono de 16 kHz y 16 bits (SAMPLE_RATE_16000,CHANNEL_1,SAMPLE_FORMAT_S16LEyENCODING_TYPE_RAW). - Fuente de audio (
audio.SourceType):SOURCE_TYPE_MIC: Audio sin procesar del micrófono. Utilice esta fuente cuando la AEC interna del SDK esté habilitada y envíe datos al SDK llamando aupdateAudio.SOURCE_TYPE_VOICE_COMMUNICATION: Audio de llamada en el que el sistema ya ha realizado la cancelación de eco. Utilice esta fuente cuando la AEC interna del SDK esté deshabilitada y proporcione audio a través deonNuiNeedAudioData.
- Evento de datos: Llame a
capturer.on('readData', (buffer: ArrayBuffer) => void)para obtener continuamente el audio grabado. - Evento de estado: Llame a
capturer.on('stateChange', (state: audio.AudioState) => void).STATE_RUNNINGindica que la grabación ha comenzado ySTATE_STOPPEDindica que se ha detenido. - Control: Llame a
start()para iniciar,stop()para detener yrelease()para liberar el grabador.
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();
});
Nota: HarmonyOS crea
AudioCapturerde forma asíncrona. Llame astart()solo después de que se complete la creación. No cree e inicie inmediatamente un grabador enSTATE_OPEN. Créelo primero y luego llame astart()desde la devolución de llamadaSTATE_OPEN. El ejemplo crea el grabador durantedoInity lo inicia duranteonNuiAudioStateChanged.
Reproducción (AudioRenderer)
- Crear: Llame a
audio.createAudioRenderer(rendererOptions)de forma asíncrona. - Frecuencia de muestreo: El audio de respuesta sintetizado devuelto por DashScope Realtime es de 24 kHz. Pase esta frecuencia al constructor de
AudioPlayer. - Evento de datos: Llame a
renderer.on('writeData', (data: ArrayBuffer): audio.AudioDataCallbackResult => ...)para proporcionar audio para la reproducción. DevuelvaAudioDataCallbackResult.VALIDdespués de llenar el búfer oINVALIDcuando no haya datos disponibles. - Evento de estado: Llame a
renderer.on('stateChange', (state: audio.AudioState) => void)para escuchar los eventos de inicio y fin de reproducción. - Control: Llame a
start()para iniciar,stop()para detener ypause()para pausar la reproducción. Pausar conserva los datos almacenados en búfer.
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();
});
Señal de referencia AEC: Cuando la AEC interna del SDK está habilitada, envíe el audio de salida del reproductor al SDK como señal de referencia llamando a
nuiInstance.pushReferenceData(data, false), que corresponde aupdateRefAudioen Android.
Declaración de permisos
Declare el permiso de micrófono en module.json5 antes de grabar audio:
{
"requestPermissions": [
{ "name": "ohos.permission.MICROPHONE" }
]
}
Parámetros de solicitud
Parámetros de conexión y control
Pase una cadena JSON en el argumento parameters de initialize.
Ejemplo: La siguiente cadena JSON no enumera todos los parámetros. Agregue los parámetros según sea necesario para su caso de uso.
{
"url": "wss://dashscope.aliyuncs.com/api-ws/v1/inference",
"apikey": "st-****",
"device_id": "my_device_id",
"service_mode": "1"
}
Parámetros
| Parámetro | Tipo | Obligatorio | Descripción |
|---|---|---|---|
|
| Sí | Endpoint del servicio:
{WorkspaceId} con su ID de espacio de trabajo. |
|
| Sí | Clave de API. |
|
| Sí | Modo de ejecución. Establezca este parámetro en |
|
| Sí | Una cadena única que identifica al usuario final. Puede utilizar un ID de usuario dentro de la aplicación o un identificador de dispositivo generado por el cliente. Este ID se utiliza principalmente para el rastreo de registros y la solución de problemas. |
|
| No | Indica si se deben enviar activamente datos de audio. Valor predeterminado: |
|
| No | La ruta de almacenamiento para los archivos de recursos en el dispositivo. Este parámetro es obligatorio cuando |
|
| No | La ruta de almacenamiento del archivo de registro. Este parámetro solo surte efecto cuando |
|
| No | Indica si se debe guardar el audio de depuración en |
|
| No | El tamaño máximo del archivo de registro en bytes. Este parámetro solo surte efecto cuando |
|
| No | El nivel de filtro para los registros enviados a través de |
|
| No | Configuración avanzada de AEC en el dispositivo. Este objeto solo surte efecto cuando |
|
| No | Indica si se debe habilitar AEC en el dispositivo. Si |
|
| No | Indica si se debe guardar el audio procesado por el módulo AEC en el dispositivo. Si |
|
| No | Indica si se debe devolver el audio procesado por AEC a través de |
|
| No | Configuración avanzada de VAD en el dispositivo. Este objeto solo surte efecto cuando |
|
| No | Indica si se debe habilitar VAD en el dispositivo. Si |
|
| No | Indica si se debe guardar el audio procesado por el módulo VAD en el dispositivo. Si |
Parámetros de conversación de voz
Pase una cadena JSON en el argumento params de setParams.
Ejemplo: La siguiente cadena JSON no enumera todos los parámetros. Agregue los parámetros según sea necesario para su caso de uso.
{
"service_type": 4,
"nls_config": {
"model": "qwen-audio-3.1-realtime-plus",
"sr_format": "pcm"
}
}
Parámetros
| Parámetro de nivel superior | Tipo | Obligatorio | Descripción |
|---|---|---|---|
|
| Sí | Tipo de servicio de voz. Establezca este parámetro en |
|
| Sí | Configuración principal de la conversación de voz, incluida la selección del modelo y el comportamiento de la conversación. |
|
| Sí | Nombre del modelo. Admite las series de modelos |
|
| Sí | Formato de audio de entrada. Solo se admite |
|
| No | Una cadena que contiene una matriz de modalidades de salida. Valores válidos:
|
|
| No | Voz TTS. El valor predeterminado es 3.1 Plus también admite |
|
| No | Indica si se debe habilitar la expresión emocional mejorada. Cuando está habilitada, la voz de respuesta presenta una variación emocional más notable. Valor predeterminado: |
|
| No | Instrucciones del sistema que definen el rol del modelo, el estilo de respuesta y las preferencias de comportamiento para toda la sesión. |
|
| No | Número máximo de turnos históricos de preguntas y respuestas permitidos en una solicitud. Valores válidos: de 1 a 50. Predeterminado: |
|
| No | Una cadena que contiene una matriz de definiciones de herramientas de Function Calling. Después de configurar este parámetro, el modelo decide si llamar a una herramienta basándose en la entrada del usuario. Cada definición utiliza |
|
| No | Una cadena que contiene un objeto JSON para la detección de turnos. Si se omite, la sesión utiliza el modo pulsar para hablar, en el cual el audio se confirma y la inferencia se activa manualmente. Si se establece, se habilita el modo de conversación dúplex. |
|
| No | Tipo de VAD. |
|
| No | Sensibilidad de VAD. Este parámetro solo se aplica a |
|
| No | Duración mínima de silencio después del habla, en milisegundos, antes de que se active la respuesta del modelo. Este parámetro solo se aplica a |
|
| No | Una cadena que contiene una matriz de URL de audio pregrabado de acceso público para el hablante objetivo. Este parámetro solo se aplica a |
API clave
NativeNui
initialize
Inicializa una instancia del SDK de conversación de voz. El SDK utiliza el patrón singleton. No lo inicialice nuevamente antes de llamar a release.
Este método puede bloquearse. Llámelo en un hilo que no sea de UI.
Firma del métodopublic initialize(
callback: INativeNuiCallback,
parameters: string,
level: number,
save_log: boolean = false
): number
Parámetros
| Parámetro | Tipo | Descripción |
|---|---|---|
|
| Una implementación de la interfaz de devolución de llamada de eventos y datos. |
|
| Una cadena JSON que contiene parámetros de autenticación, conexión y depuración. Consulte Parámetros de conexión y control. |
|
| Controla el nivel de impresión de los propios registros del SDK. |
|
| Indica si se deben guardar los registros localmente. Si se establece en |
setParams
Establece los parámetros de conversación de voz en formato JSON. Llame a este método antes de startDialog.
Firma del métodopublic setParams(params: string): number
Parámetros
| Parámetro | Tipo | Descripción |
|---|---|---|
|
|
startDialog
Inicia la conversación.
Firma del métodopublic startDialog(vad_mode: Constants.VadMode, dialog_params: string): number
Parámetros
| Parámetro | Tipo | Descripción |
|---|---|---|
|
| Modo VAD. Fijo en |
|
| Si |
stopDialog
Finaliza la conversación. Después de llamar a este método, el servidor devuelve el resultado final de la conversación y termina la tarea.
Firma del métodopublic stopDialog(): number
cancelDialog
Finaliza la conversación inmediatamente. Después de llamar a este método, la tarea finaliza sin esperar a que el servidor devuelva el resultado final de la conversación.
Firma del métodopublic cancelDialog(): number
dialogAction
Envía un comando de acción de conversación durante una interacción para actualizar el comportamiento en tiempo de ejecución, como el contexto de la conversación.
Firma del métodopublic dialogAction(params: string): number
Parámetros
| Parámetro | Tipo | Descripción |
|---|---|---|
|
| Una cadena JSON utilizada para actualizar el comportamiento en tiempo de ejecución, como el contexto de la conversación. |
|
| Establecido en |
|
| Comando de tiempo de ejecución. Valores válidos:
|
|
| Actualización de solicitud de llamada de función. Se usa cuando |
|
| Tipo de evento. Este parámetro es obligatorio cuando |
|
| Requerido cuando |
|
| Opcional cuando |
Parámetros de context.item:
| Parámetro | Tipo | Descripción |
|---|---|---|
|
| ID de elemento de conversación único opcional. Si se omite, el servidor genera uno. Se devuelve un error si el ID especificado ya existe. |
|
| Tipo de elemento obligatorio. Valores válidos:
|
|
| Requerido para |
|
| Obligatorio para |
|
| Requerido para |
|
| Requerido para |
|
| Requerido para |
|
| Requerido para |
Parámetros de context.response:
| Parámetro | Tipo | Descripción |
|---|---|---|
|
| Modalidades de salida. |
|
| Anula la voz TTS para esta inferencia. |
Ejemplo:
{
"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
Cuando audio_update_manually se establece en "true", los datos de grabación ya no se suministran a través de onNuiNeedAudioData. Utilice este método para enviar activamente los datos en su lugar.
public updateAudio(data: ArrayBuffer, first_pack: boolean): number
Parámetros
| Parámetro | Tipo | Descripción |
|---|---|---|
|
| Datos de audio a enviar (PCM). |
|
| Indica si este es el primer paquete de audio. El SDK calcula el recuento de bytes a partir de |
pushReferenceData (corresponde a updateRefAudio en Android)
Cuando audio_update_manually se establece en "true" y la AEC en el dispositivo está habilitada, utilice este método para enviar el audio reproducido por el reproductor como señal de referencia.
public pushReferenceData(data: ArrayBuffer, first_pack: boolean): number
Parámetros
| Parámetro | Tipo | Descripción |
|---|---|---|
|
| Datos de audio a enviar (PCM). |
|
| Indica si este es el primer paquete de audio. El SDK calcula el recuento de bytes a partir de |
release
Libera todos los recursos internos del SDK. La instancia del SDK deja de estar disponible después de esta llamada. Para volver a utilizar el SDK, llame a initialize para reinicializarlo.
Firma del métodopublic release(): number
GetVersion
Devuelve información sobre la versión actual del SDK.
Firma del métodopublic GetVersion(): string
Valor de retorno
Información sobre la versión actual del SDK.
INativeNuiCallback: callbacks de escucha
onNuiEventCallback: escucha de información de eventos
Firma del métodoonNuiEventCallback: (
event: Constants.NuiEvent,
resultCode: number,
arg2: number,
kwsResult: KwsResult,
asrResult: AsrResult
) => void;
Parámetros
| Parámetro | Tipo | Descripción |
|---|---|---|
|
| Evento de callback. |
|
| Válido solo cuando ocurre el evento |
|
| Parámetro reservado. |
|
| Resultado del reconocimiento de voz. |
|
| Resultado de activación por voz. No necesita utilizar este parámetro. |
onNuiAudioStateChanged: escucha del estado de audio
El SDK utiliza esta devolución de llamada para notificar a la aplicación cuándo iniciar o detener la grabación.
Firma del métodoonNuiAudioStateChanged: (state: Constants.AudioState) => void
Valores de AudioState
| Estado | Descripción |
|---|---|
| La interacción ha comenzado. Puede abrir el dispositivo de grabación e iniciar la grabación. |
| La interacción se ha detenido. Puede detener la grabación. |
| La instancia del SDK ha sido liberada. Puede cerrar completamente el dispositivo de grabación. |
onNuiAudioRMSChanged: escucha del volumen de grabación
Escucha el volumen de grabación, que se puede mostrar en la interfaz de usuario.
Firma del métodoonNuiAudioRMSChanged: (val: number) => number
Parámetros
| Parámetro | Tipo | Descripción |
|---|---|---|
|
| Volumen de grabación. |
onNuiNeedAudioData: suministro de datos de audio
Después de que comienza la conversación, esta devolución de llamada se activa continuamente. Suministre los datos de audio a procesar en esta devolución de llamada. No necesita utilizar esta devolución de llamada cuando audio_update_manually se establece en "true".
onNuiNeedAudioData: (buffer: ArrayBuffer) => number
Parámetros
| Parámetro | Tipo | Descripción |
|---|---|---|
|
| Datos de audio a suministrar. El SDK utiliza |
El número real de bytes suministrados.
onNuiAssistEventCallback: recepción de datos e información auxiliar
Recibe eventos auxiliares internos del SDK y datos relacionados.
Firma del métodoonNuiAssistEventCallback?: (
event: Constants.NuiEvent,
info: string,
infoLen: number,
data: ArrayBuffer
) => void;
Parámetros
| Parámetro | Tipo | Descripción |
|---|---|---|
|
| Evento |
|
| Información adicional, generalmente una cadena JSON. |
|
| Longitud de la información adicional. |
|
| Datos binarios adicionales, como audio TTS devuelto por el modelo. |
Nota: Esta devolución de llamada es opcional (
?) en HarmonyOS. Omítala si no necesita la información.
onNuiLogTrackCallback: escucha de registros de seguimiento
Recibe registros internos detallados del SDK para la resolución de problemas y depuración.
onNuiLogTrackCallback: (level: Constants.LogLevel, log: string) => void
NuiEvent: tipos de eventos
En el SDK de HarmonyOS, los tipos de eventos se definen mediante la enumeración Constants.NuiEvent. La siguiente tabla enumera los eventos relacionados con la conversación de voz en tiempo real:
| Evento | Descripción |
|---|---|
| La tarea se inició correctamente. |
| Se activa inmediatamente después de que comienza la tarea. Esto no significa que se haya detectado el inicio del habla. |
| Se detectó el final del habla. |
| Un resultado intermedio del reconocimiento de voz. |
| Un resultado completo de reconocimiento de voz. |
| Ocurrió un error durante la conversación de voz. |
| Se activa cuando no se reciben datos de audio durante dos segundos consecutivos. |
| Se detectó el inicio de una oración. |
| Se detectó el final de una oración y se devolvió un resultado de reconocimiento completo. |
| La conversación de voz finalizó. |
| Un evento de transcripción de texto incremental para la salida de audio. Los segmentos de transcripción se devuelven en modo streaming. |
| La transcripción de la salida de audio está completa. |
| Otra información de eventos, como un resultado de Function Calling. |
| El modelo comenzó a devolver audio TTS. |
| Audio TTS devuelto por el modelo. |
| El modelo terminó de devolver audio TTS. |
| Un resultado de traducción intermedio. |
| La salida del resultado de traducción está completa. |
| Datos de audio procesados por AEC. |