【问题标题】:Connect to Microsoft's Cognitive Speaker Recognition API via Xamarin.Android通过 Xamarin.Android 连接到 Microsoft 的 Cognitive Speaker Recognition API
【发布时间】:2018-03-15 08:32:33
【问题描述】:

我正在构建一个测试应用程序来通过Microsoft's Cognitive Speaker Recognition API 对用户进行身份验证。这看起来很简单,但正如他们的API Docs 中所述,在创建注册时,我需要发送我录制的音频文件的byte[]。现在,由于我使用的是 Xamarin.Android,我能够录制音频并保存它。现在,Microsoft's Cognitive Speaker Recognition API 对 THAT 音频的要求非常具体。

根据 API 文档,音频文件格式必须满足以下要求。

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

this recipe 之后,我成功录制了音频,在玩了一会儿并使用了一些 android 文档之后,我也能够实现这些设置:

_recorder.SetOutputFormat(OutputFormat.ThreeGpp);

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

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

这符合所需音频文件的大部分标准。但是,我似乎无法以实际的“.wav”格式保存文件,也无法验证该文件是否实际上是 PCM 编码的。

这是我的 AXML 和 MainActivity.cs:Github Gist

我也关注了this code 并将其合并到我的代码中:Github Gist

文件的规格看起来不错,但持续时间错误。无论我录制多长时间,它都只是显示 250 毫秒,这导致音频太短。

有没有办法做到这一点?基本上我只想能够通过 Xamarin.Android 连接到Microsoft's Cognitive Speaker Recognition API。我找不到任何这样的资源来指导自己。

【问题讨论】:

标签: c# xamarin xamarin.android microsoft-cognitive


【解决方案1】:

录音

Audio Recorder Plugin NuGet Package 添加到 Android 项目(以及任何 PCL、netstandard 或 iOS 库,如果您正在使用它们)。

Android 项目配置

  1. 在AndroidMainifest.xml中,添加以下权限:
<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" />
  1. 在 AndroidManifest.xml 中,将以下 providerinside 添加到 &lt;application&gt;&lt;/application&gt; 标记中。
<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>

  1. 在 Resources 文件夹中,创建一个名为xml的新文件夹

  2. 在 Resources/xml 内部,创建一个名为file_paths.xml的新文件

  1. file_paths.xml中,添加以下代码,将[your package name]替换为您的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>

示例包名称

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]);
}

认知服务说话人识别码

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
}

音频播放

配置

SimpleAudioPlayer Plugin NuGet Package 添加到 Android 项目(以及任何 PCL、netstandard 或 iOS 库,如果您正在使用它们)。

代码

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

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

【讨论】:

  • 感谢您的详细指南。我跟着这个并得到了一些错误,我修复了。但是,有一个我似乎无法修复的错误。一旦我停止录制,我就会收到Java.IO.IOException: Prepare failed.: status=0x1。我环顾四周,检查了我的手机,没有保存可供播放器读取的音频文件。因此,这个错误。好像没有办法离线保存录制的音频。
  • 您的手机是什么品牌/型号,或者您使用的是模拟器?该设备使用的是什么版本的 Android?
  • 我在 Xiaomi MI A1,库存 Android 8.0.0。我没有使用模拟器。
  • 我仔细检查了,记录音频和存储的权限都已正确授予应用程序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-02
  • 2020-05-06
  • 2018-06-23
  • 1970-01-01
  • 2016-10-24
  • 1970-01-01
相关资源
最近更新 更多