POST rest/v3/verify

Efetua uma verificação biométrica com um ou mais áudios fornecidos.

A função permite efetuar a verificação com vários usuários, caso em que o áudio de entrada será comparado com o voiceprint de todos os usuários fornecidos, e resultados individuais serão retornados. Erros específicos dos usuários são reportados no resultado para o usuário correspondente e a função em si continua retornando sucesso. A função retornará erro apenas em caso de falhas gerais, como problemas com os áudios, parâmetros inválidos ou indisponibilidade do sistema.

Requisição

A requisição deve estar estruturada como multipart (Content-Type definido como multipart/form-data). O primeiro boundary, denominado verify, deve conter um objeto JSON (application/json) com os seguintes campos:

repository_uri

string - URL do repositório biométrico. Campo obrigatório.

scenario

string - identificador único do cenário, incluindo o modelo. Campo obrigatório. Deve seguir os critérios definidos em Cenário.

user_ids

uint64 - Lista de identificadores de usuário que devem ser verificados com os áudios fornecidos pela aplicação. Devem ser informados como valores decimais positivos de até 63-bits. Podem ser indicados de 1 a 128 identificadores. Serão retornados resultados individuais para cada um destes usuários. Campo obrigatório.

media_type

string - Formato do áudio fornecido. O valor padrão é auto. Saiba mais sobre os formatos aceitos em Formatos de áudio

verification_threshold

float - Limiar de aceitação. Se o score da verificação for maior ou igual a este limiar, a decisão será ACCEPTED, caso contrário será REJECTED. Caso não seja informado, a decisão permanece UNDECIDED.

configuration

BiometricConfig - Parâmetros de configuração da verificação.

Os demais boundaries devem conter, cada um deles, um áudio a ser utilizado na operação biométrica. São permitidos o envio de até 10 áudios, cada qual com tamanho de até 5MiB. O formato dos áudios depende do valor indicado em media_type, no primeiro boundary. Não é permitido misturar áudios PCM Linear com áudios contendo cabeçalho.

Em caso de erro na validação dos argumentos de entrada ou na verificação biométrica, o endpoint deve retornar HTTP 400 com um objeto ErrorInfo descrevendo o problema.

Resposta

A resposta é um objeto JSON contendo os seguintes campos:

transaction_id

uint64 - Identificador único da transação. Contém um valor decimal positivo de 63-bits.

results

ResultInfo - Lista de objetos contendo os resultados das verificações biométricas. Haverá uma entrada para cada usuário indicado na requisição.

utterances

UtteranceInfo - Lista de objetos contendo as informações sobre os enunciados nos áudios fornecidos. Este campo pode estar vazio ou ser omitido caso nenhum áudio tenha sido processado.

Exemplo

Chamada REST enviando o audio via multipart:

curl --request POST \
  --url http://10.245.15.2/bmt/rest/v3/verify \
  --header 'Authorization: Bearer <token>' \
  --header 'Content-Type: multipart/form-data' \
  --header 'User-Agent: insomnia/8.6.0' \
  --form 'verify={ "repository_uri": "http://service-repository-teste:9090",
  "scenario": "demo",
  "verification_threshold": 0.5,
  "user_ids": ["490499949419563008","490490457298569216"],
  "configuration":
                {
                        "logging_tag": "TESTES_LOG_TAG",
                        "max_constraint_behavior": "TRIM",
                        "min_speech": 1000,
                        "max_speech": 120000,
                        "end_silence": 500,
                        "min_utterances": 1,
                        "max_utterances": 20,
                        "end_silence": 1000
                }

        }' \

--form audio=@<path-to-file>/claudia_enroll.wav

Resultado JSON:

{
    "transaction_id": "490499983603138560",
    "results": [
        {
            "user_id": "490499949419563008",
            "score": 0.838265,
            "decision": "ACCEPTED",
            "detail": {
                "biometric_decision": "ACCEPTED",
                "antispoofing_decision": "ACCEPTED"
            }
        },
        {
            "user_id": "490490457298569216",
            "score": 0.838265,
            "decision": "REJECTED",
            "detail": {
                "biometric_decision": "ACCEPTED",
                "antispoofing_decision": "UNDECIDED"
            }
        }
    ],
    "utterances": [
        {
            "audio_counter": 0,
            "utterance_counter": 0,
            "utterance_duration": 3410,
            "ignored": false,
            "start_time": 770,
            "end_time": 4870
        },
        {
            "audio_counter": 0,
            "utterance_counter": 1,
            "utterance_duration": 3750,
            "ignored": false,
            "start_time": 7950,
            "end_time": 12440
        },
        {
            "audio_counter": 0,
            "utterance_counter": 2,
            "utterance_duration": 4430,
            "ignored": false,
            "start_time": 15340,
            "end_time": 20480
        },
        {
            "audio_counter": 0,
            "utterance_counter": 3,
            "utterance_duration": 3580,
            "ignored": false,
            "start_time": 22340,
            "end_time": 26610
        },
        {
            "audio_counter": 0,
            "utterance_counter": 4,
            "utterance_duration": 4500,
            "ignored": false,
            "start_time": 28440,
            "end_time": 33340
        }
    ]
}