7 votes

Connexion à l'API Cognitive Speaker Recognition de Microsoft via Xamarin.Android

J'ai créé une application de test pour authentifier les utilisateurs par l'intermédiaire de Microsoft's Cognitive Speaker Recognition API . Cela semble simple, mais comme mentionné dans leur Documents de l'API Lors de la création de l'inscription, j'ai besoin d'envoyer le fichier byte[] du fichier audio que j'enregistre. Comme j'utilise Xamarin.Android, j'ai pu enregistrer le fichier audio et le sauvegarder. Maintenant, les exigences de THAT audio sont assez spécifiques par Microsoft's Cognitive Speaker Recognition API .

Selon la documentation de l'API, le format de fichier audio doit répondre aux exigences suivantes.

Container -> WAV
Encoding -> PCM
Rate -> 16K
Sample Format -> 16 bit
Channels -> Mono

Suivant cette recette J'ai réussi à enregistrer l'audio et après avoir joué un peu et consulté quelques documents Android, j'ai pu mettre en œuvre ces paramètres également :

_recorder.SetOutputFormat(OutputFormat.ThreeGpp);

_recorder.SetAudioChannels(1);
_recorder.SetAudioSamplingRate(16);
_recorder.SetAudioEncodingBitRate(16000);

_recorder.SetAudioEncoder((AudioEncoder) Encoding.Pcm16bit);

Ce fichier répond à la plupart des critères du fichier audio requis. Mais je ne parviens pas à enregistrer le fichier au format ".wav" et je ne peux pas vérifier si le fichier est bien en cours d'enregistrement. PCM codé ou non.

Voici mon AXML et MainActivity.cs : Github Gist

J'ai également suivi ce code et je l'ai incorporé dans mon code : Github Gist

Les spécifications du fichier semblent correctes, mais la durée est erronée. Quelle que soit la durée de l'enregistrement, il n'affiche que 250 ms, ce qui donne un son trop court.

Existe-t-il un moyen de le faire ? En fait, je veux juste pouvoir me connecter à Microsoft's Cognitive Speaker Recognition API via Xamarin.Android. Je n'ai trouvé aucune ressource de ce type pour me guider.

6voto

Brandon Minnick Points 5950

Enregistrement audio

Ajouter le Audio Recorder Plugin NuGet Package au projet Android (et à toutes les bibliothèques PCL, netstandard ou iOS si vous les utilisez).

Configuration du projet Android

  1. Dans AndroidMainifest.xml, ajoutez les permissions suivantes :

    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.INTERNET" />

  2. Dans AndroidManifest.xml, ajoutez ce qui suit provider à l'intérieur les <application></application> étiquette.

    <provider android:name="android.support.v4.content.FileProvider" android:authorities="${applicationId}.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths"></meta-data> </provider>

enter image description here

  1. Dans le dossier Resources, créez un nouveau dossier appelé xml

  2. À l'intérieur de Resources/xml, créez un nouveau fichier appelé file_paths.xml

enter image description here

  1. En file_paths.xml ajoutez le code suivant, en remplaçant [votre nom de paquetage] par le paquetage de votre projet Android
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name="my_images" path="Android/data/[your package name]/files/Pictures"/>
    <external-path name="my_movies" path="Android/data/[your package name]/files/Movies" />
</paths>

Exemple de nom de paquet

enter image description here

Code de l'enregistreur Android

AudioRecorderService AudioRecorder { get; } = new AudioRecorderService
{
    StopRecordingOnSilence = true,
    PreferredSampleRate = 16000
});

public async Task StartRecording()
{
    AudioRecorder.AudioInputReceived += HandleAudioInputReceived;
    await AudioRecorder.StartRecording();
}

public async Task StopRecording()
{
    AudioRecorder.AudioInputReceived += HandleAudioInputReceived;
    await AudioRecorder.StartRecording();
}

async void HandleAudioInputReceived(object sender, string e)
{
    AudioRecorder.AudioInputReceived -= HandleAudioInputReceived;

    PlaybackRecording();

    //replace [UserGuid] with your unique Guid
    await EnrollSpeaker(AudioRecorder.GetAudioFileStream(), [UserGuid]);
}

Code de reconnaissance du locuteur des services cognitifs

HttpClient Client { get; } = CreateHttpClient(TimeSpan.FromSeconds(10));

public static async Task<EnrollmentStatus?> EnrollSpeaker(Stream audioStream, Guid userGuid)
{
    Enrollment response = null;
    try
    {
        var boundryString = "Upload----" + DateTime.Now.ToString("u").Replace(" ", "");
        var content = new MultipartFormDataContent(boundryString)
        {
            { new StreamContent(audioStream), "enrollmentData", userGuid.ToString("D") + "_" + DateTime.Now.ToString("u") }
        };

        var requestUrl = "https://westus.api.cognitive.microsoft.com/spid/v1.0/verificationProfiles" + "/" + userGuid.ToString("D") + "/enroll";
        var result = await Client.PostAsync(requestUrl, content).ConfigureAwait(false);
        string resultStr = await result.Content.ReadAsStringAsync().ConfigureAwait(false);

        if (result.StatusCode == HttpStatusCode.OK)
            response = JsonConvert.DeserializeObject<Enrollment>(resultStr);

        return response?.EnrollmentStatus;
    }
    catch (Exception)
    {

    }

    return response?.EnrollmentStatus;
}

static HttpClient CreateHttpClient(TimeSpan timeout)
{
    HttpClient client = new HttpClient();

    client.Timeout = timeout;
    client.DefaultRequestHeaders.AcceptEncoding.Add(new StringWithQualityHeaderValue("gzip"));
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

    //replace [Your Speaker Recognition API Key] with your Speaker Recognition API Key from the Azure Portal
    client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", [Your Speaker Recognition API Key]);

    return client;
}

public class Enrollment : EnrollmentBase
{
    [JsonConverter(typeof(StringEnumConverter))]
    public EnrollmentStatus EnrollmentStatus { get; set; }
    public int RemainingEnrollments { get; set; }
    public int EnrollmentsCount { get; set; }
    public string Phrase { get; set; }
}

public enum EnrollmentStatus
{
    Enrolling
    Training,
    Enrolled
}

Lecture audio

Configuration

Ajouter le SimpleAudioPlayer Plugin NuGet Package au projet Android (et à toutes les bibliothèques PCL, netstandard ou iOS si vous les utilisez).

Code

public void PlaybackRecording()
{
    var isAudioLoaded = Plugin.SimpleAudioPlayer.CrossSimpleAudioPlayer.Current.Load(AudioRecorder.GetAudioFileStream());

    if (isAudioLoaded)
        Plugin.SimpleAudioPlayer.CrossSimpleAudioPlayer.Current.Play();
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X