API WebSocket

Esta seção detalha a API WebSocket do Speech Server para o recurso de reconhecimento de fala (ASR). Ela é baseada na API do produto CPQD Reconhecimento de Fala, com parâmetros adicionais para uso de novas funcionalidades.

A seguir, são descritas as mensagens da API original que sofreram alterações com acréscimo de novos parâmetros. Para verificar todos os detalhes da API, consulte a documentação do CPQD Reconhecimento de Fala.

Acesso

A API WebSocket pode ser acessada pela nuvem do CPQD e em instalações locais, se aplicável. Abaixo temos as URLs de acesso:

Tipo de Acesso

URL

Nuvem

https://speechd.cpqd.com.br/asr/ws/v3/recognize

Local

http://{ip_speechd_server}:8000/asr/ws/v3/recognize

Onde {ip_speech_server} deve ser substituído pelo IP da máquina onde está instalado o Speech Server.

Aviso

O acesso à API hospedada em nuvem é restrita e requer credencial de acesso. Entre em contato com o CPQD para maiores informações.

Protocolo

A API WebSocket utiliza um conjunto de mensagens para acionar as funções do servidor. A conexão entre cliente e servidor mantém um socket bi-direcional persistente para troca de mensagens entre os dois endpoints.

A versão da API WebSocket é a 2.4. Ela é baseada na versão 2.3 com alterações nas seguintes mensagens.

Mensagens alteradas em relação à versão 2.3.

Mensagem

Descrição

CREATE SESSION

Acrescentado header para compartilhamento de dados entre sessões de recursos diversos do MRCP.

START RECOGNITION

Novo header para armazenamento do áudio do reconhecimento no buffer de verificação biométrica

SET PARAMETERS

Novos headers para acionamento de classificadores de voz (gênero, idade e emoção).

GET PARAMETERS

Novos headers para acionamento de classificadores de voz.

Mensagens enviadas pelo servidor.

Mensagem

Descrição

RECOGNITION RESULT

Novos objetos de resultado dos classificadores de voz.

Mensagens

CREATE SESSION

Os headers abaixo foram acrescentados em relação à mensagem original.

Headers:

Channel-Identifier

(Opcional) Identificação da sessão no MRCP para compartilhamento de recursos

Exemplo:

ASR 2.4 CREATE_SESSION
Channel-Identifier: 698dc19d489c4e4db73e28a713eab07b

SET PARAMETERS

Os headers abaixo foram acrescentados em relação à mensagem original.

Infer-age-enabled

(Opcional) Habilita a classificação da idade do usuário. Valores válidos:

  • true

  • false (padrão)

Infer-gender-enabled

(Opcional) Habilita a classificação do gênero do usuário. Valores válidos:

  • true

  • false (padrão)

Infer-emotion-enabled

(Opcional) Habilita a classificação do tom emocional do usuário. Valores válidos:

  • true

  • false (padrão)

license.manager.accountTag

(Opcional) define uma tag para geração de bilhetes multiusuário

Se os headers acima estiverem setados, os respectivos serviços serão acionados durante o reconhecimento de fala. A resposta dos serviços será combinada à resposta do ASR.

GET PARAMETERS

Headers: Ver headers da mensagem SET PARAMETERS

START RECOGNITION

Os headers abaixo foram acrescentados em relação à mensagem original.

Headers:

Infer-age-enabled

(Opcional) Habilita a classificação da idade do usuário. Valores válidos:

  • true

  • false (padrão)

Infer-gender-enabled

(Opcional) Habilita a classificação do gênero do usuário. Valores válidos:

  • true

  • false (padrão)

Infer-emotion-enabled

(Opcional) Habilita a classificação do gênero do usuário. Valores válidos:

  • true

  • false (padrão)

Verify-Buffer-Utterance

(Opcional) Indica se o áudio deve ser armazenado no buffer de verificação biométrica. Valores:

  • true

  • false (padrão)

Media-Type

Indica o formato da mídia (áudio) a ser enviado.

  • application/octet-stream – arquivo codificado num formato suportado

  • audio/wav – arquivo codificado num formato suportado

  • audio/raw – áudio PCM Linear sem cabeçalho

Se o header Verify-Buffer-Utterance for definido como true, o áudio será gravado no buffer de verificação. A identificação do buffer de verificação é feita pelo header Channel-Identifier (ver mensagem CREATE SESSION).

Exemplos:

ASR 2.4 START_RECOGNITION
Content-Length: 20
Content-Type: text/uri-list
Media-Type: audio/wav

builtin:slm/general

RECOGNITION RESULT

Mensagem que contém o resultado do reconhecimento. Ela conter o resultado da classificação de gênero, idade e emoção caso estejam disponíveis. Os campos abaixo (em negrito) são acrescentados ao objeto do resultado do reconhecimento de fala.

Campos adicionais para o resultado do reconhecimento:

Campo

Descrição

Tipo do campo

age_scores:

Dicionário que contém o tipo de evento, a idade estipulada, a probabilidade por faixa etária e um índice de confiança.

{
    event:  <string>,
    age:    <int>,
    p:      <dict>
    {
        <0-10>: <float>,
        <10-20>: <float>,
        <20-30>: <float>,
        <30-40>: <float>,
        <40-50>: <float>,
        <50-60>: <float>,
        <60-70>: <float>,
        <70-80>: <float>,
        <80-90>: <float>,
        <90-100>: <float>
    },
    confidence: <string>
}

gender_scores:

Dicionário que contém o tipo de evento, a probabilidade e o gênero.

{
    event:  <string>,
    p:      <array[float]>,
    gender: <string>
}

emotion_scores:

Dicionário que contém a probabilidade e o tipo de emoção em um formato <K,V>.

{
    event:  <string>,
    emotion: <sting>,
    p: <dict>
    {
        <enojado>: <float>,
        <frustrado>: <float>,
        <triste>: <float>,
        <ansioso>: <float>,
        <entusiasmado>: <float>,
        <feliz>: <float>,
        <surpreso>: <float>,
        <amedrontado>: <float>,
        <neutro>: <float>,
        <irritado>: <float>

    },
    p_groups: <dict>
    {
        <negativo_desativado>: <float>,
        <positivo>: <float>,
        <neutro>: <float>,
        <negativo_ativado>: <float>
    }
}

Exemplo de conteúdo resultado JSON:

[
	{
		"alternatives": [
			{
				"text": "boa noite",
				"words": [
					{
						"text": "boa",
						"score": 100,
						"start_time": 1.31,
						"end_time": 1.64
					},
					{
						"text": "noite",
						"score": 100,
						"start_time": 1.64,
						"end_time": 2.1499999
					}
				],
				"score": 100,
				"lm": "builtin:slm/general"
			}
		],
		"segment_index": 0,
		"last_segment": false,
		"final_result": true,
		"start_time": 1.16,
		"end_time": 2.23,
		"result_status": "RECOGNIZED"
	},
	{
		"alternatives": [],
		"segment_index": 1,
		"last_segment": true,
		"final_result": true,
		"start_time": 0.0,
		"end_time": 0.0,
		"result_status": "NO_SPEECH"
	},
	{
		"age_scores": {
			"event": "AGE RESULT",
			"age": 26,
			"p": {
				"0-10": 0.5179844523782638,
				"10-20": 0.11152846598428226,
				"20-30": 0.07900322754578767,
				"30-40": 0.06298531934154068,
				"40-50": 0.1626517805220346,
				"50-60": 0.045204182877111004,
				"60-70": 0.020613460175818818,
				"70-80": 8.55482456966086e-06,
				"80-90": 1.7022939418759654e-05,
				"90-100": 3.533411172730065e-06
			},
			"confidence": "low"
		}
	},
	{
		"gender_scores": {
			"event": "GENDER RESULT",
			"p": [
				0.3941764441529113,
				0.6058235558470887
			],
			"gender": "F"
		}
	},
	{
		"emotion_scores": {
			"event": "EMOTION RESULT",
			"emotion": "neutro",
			"group": "neutro",
			"p": {
				"enojado": 0.01711287908256054,
				"frustrado": 0.011172660626471043,
				"triste": 0.045132115483284,
				"ansioso": 0.017092114314436913,
				"entusiasmado": 0.054251641035079956,
				"feliz": 0.010503247380256653,
				"surpreso": 0.005758626386523247,
				"amedrontado": 0.022531844675540924,
				"neutro": 0.804568886756897,
				"irritado": 0.01187601312994957
			},
			"p_groups": {
				"negativo_desativado": 0.07341765519231558,
				"positivo": 0.08760562911629677,
				"neutro": 0.8271007314324379,
				"negativo_ativado": 0.01187601312994957
			}
		}
	}
]