Xamarin.Forms 및 Cognitive Services에서 스피커 식별을 시도합니다.

소개



이 게시물은 Xamarin Advent Calendar 2017의 17 일째 기사입니다.

Cognitive Services 에서는, 다양한 API 가 제공되고 있습니다.
그러나 「Speaker Recognition API」에 대해서는, 별로 일본 국내에서 이야기를 듣는 것은 없습니다.
그래서 Xamarin.Forms 와 Speaker Recognition API 에서 바삭바삭한 화자 식별 앱을 사용해 보려고 했습니다!

하지만, 사이에 맞지 않았습니다 ...

그래서 Speaker Recognition API의 소개와 Xamarin.Forms에서는 이렇게 사용할 수 있습니다.
라는 소개를 할 수 있으면 좋겠습니다!
여러가지 실험했으므로 그 결과도 공유합니다.

Speaker Recognition API



공식 API Reference는 여기입니다.

스피커 인증 (Speaker Verification)



이것은 "비밀번호 대신 음성 사용"할 수있는 것입니다.
Xamarin으로 만든 모바일 앱에도 이 기능을 쉽게 구현할 수 있습니다.
그러나 아직 일본어를 지원하지 않습니다.

사전에 지정된 10가지 영어 문구 중 하나를 선택하고 읽고 등록합니다.
이 때문에, 일본어에 대응하고 있지 않아도 사용할 수 있는 것 같은 생각이 듭니다만,
불행히도 논네이티브한 발음에서는, 원래 인식을 해 주지 않는 케이스가 많았습니다.

덧붙여서, 일본어 네이티브의 사람의 발음으로 가장 인식률이 높았던 것은,
my name is unknown to you
이었다.
추측입니다만, 이하가 이유일까라고 생각하고 있습니다.
- L이나 R이 포함되어 있지 않습니다.
- my name is 는 그 억양에 익숙한 사람이 많다.

스피커 식별(Speaker Identification)



이것은 "지금 누가 말하는지"를 식별할 수 있는 것입니다.
Xamarin으로 만든 모바일 앱에도 이 기능을 쉽게 구현할 수 있습니다.
불행히도, 이쪽도 아직 일본어에 대응하고 있지 않습니다.

다만, 이쪽에 대해서는, 일본어에서도 나름의 정밀도가 나오는 것 같기 때문에,
앱에 내장해도 재미있을까 생각합니다.

화자 식별 앱을 Xamarin.Forms로 만들어보세요!



이런 느낌을 만들어 보겠습니다.


  • 사용자 지정 등록
  • 사용자를 지정하여 오디오 등록
  • 등록한 누군가가 말한다
  • 누가 이야기했는지 표시



  • 1. 사용자를 사용자 이름으로 등록



    Speaker Recognition API에 Locale을 지정하여 POST합니다.
    등록이 성공하면 JSON에서 사용자의 IdentificationProfileId(GUID)가 돌아옵니다.
    IdentificationProfileId는 여기에서 지정할 수 없으므로 돌아온 결과와 사용자 정보 등을 연결할 필요가 있습니다.
            public async Task<string> CreateProfile()
            {
                var client = new HttpClient();
    
                //SubscriptionKeyはAzureの管理ポータルから確認可能。
                client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", "{SubscriptionKey}");
    
                var uri = "https://westus.api.cognitive.microsoft.com/spid/v1.0/identificationProfiles";
    
                HttpResponseMessage response;
    
                // Localeはja-jpが使えないので en-us にする。
                byte[] byteData = Encoding.UTF8.GetBytes("{\"locale\":\"en-us\"}");
    
                using (var content = new ByteArrayContent(byteData))
                {
                    content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
                    response = await client.PostAsync(uri, content);
                }
    
                //JSONでIdentificationProfileId(GUID)が帰ってくるので受け取ってパースする。
                var responceContent = await response.Content.ReadAsStringAsync();
                var deserializedResponse = JsonConvert.DeserializeObject<IdentificationProfileId>(responceContent);
    
                return deserializedResponse.Id;
            }
    

    2. 사용자를 지정하여 음성 등록



    identificationProfileId를 지정하여 wav 파일을 POST합니다.
    여기서 Xamarin.Forms에서 쉽게 wav를 녹음 할 수 있습니다.
    Audio Recorder plugin for Xamarin and Windows 」를 사용해 보았습니다.
    여기부터 만들기 때문에, 그대로는 움직이지 않습니다. (죄송합니다)
            //作りかけです。。。
         public async Task<string> CreateEnrollment(string identificationProfileId)
            {
    
                var recorder = new AudioRecorderService
                {
                    StopRecordingOnSilence = true,
                    StopRecordingAfterTimeout = true,
                    TotalAudioTimeout = TimeSpan.FromSeconds(15)
                };
    
                var recordTask = await recorder.StartRecording();
                var audioFile = await recordTask;
    
                var client = new HttpClient();
    
                client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", "{SubscriptionKey}");
    
                var uri = $@"https://westus.api.cognitive.microsoft.com/spid/v1.0/identificationProfiles/{identificationProfileId}/enroll?shortAudio=true";
    
                HttpResponseMessage response;
    
                var byteData = new byte[audioFile.Length];
                //結局、DependencyServiceを使わないと、iOSのストレージにアクセスできないじゃん(´;ω;`)
    
                using (var content = new ByteArrayContent(byteData))
                {
                    content.Headers.ContentType = new MediaTypeHeaderValue("multipart/form-data");
    
                    response = await client.PostAsync(uri, content);
                }
    
                var responceContent = await response.Content.ReadAsStringAsync();
    
                return responceContent;
            }
    

    3. 등록한 누군가가 말한다



    2.와 같은 요령으로, 대상이 되는 identificationProfileId 를 지정 (10ID까지) 해, wav 파일을 POST 합니다.
    이제 아래와 같은 결과(발췌)가 돌아옵니다.
    Confidence로서 신뢰도도 돌아옵니다.
    일본어로도 동작했습니다∩(´∀`)∩
        "IdentifiedProfileId": "0e1e82c8-32b1-45b0-8989-fe61efc95ead",
        "Confidence": "High"
    

    4. 누가 이야기했는지 표시



    3.에서 IdentifiedProfileId가 돌아오고 있기 때문에, 그것에 근거해 표시할 뿐이군요.

    결론



    사이에 맞지 않아서 죄송합니다(´;ω;`)

    Speaker Recognition API는 Xamarin에서도 쉽게 사용할 수 있으므로,
    아이디어에 따라 모바일 앱에 화자 식별을 통합한 재미있는 것을 만들 수 있을 것 같네요!

    좋은 웹페이지 즐겨찾기