Как пройти аутентификацию в Watson IBM.WatsonDeveloperCloud.SpeechToText.v1 .NET API Сбой objSpeechToText.SetCredential (objTokenOptions) (неавторизован) - PullRequest
0 голосов
/ 07 декабря 2018

ОБЗОР

Я использую Visual Studio 2017 15.9.3 и Microsoft.NET Framework 4.7.03190

Я установил все обновления Visual Studio перед установкой API изNuget

Я установил пакет Nuget IBM.WatsonDeveloperCloud.SpeechToText.v1 версии 2.11.0 в Visual Studio 2017.

Мой проект использует 4.7 Framework, и установка прошла полностью успешно.

Я пытаюсь в конечном итоге создать конвертер речи в текст в Visual Basic (не C #), который будет переводить речь в текст в режиме реального времени.

Я всюду искал примеры кодирования и даже связывалсяСлужба поддержки IBM и единственный пример, на который они могли мне указать, - это python и java.

Поэтому, не оставив ничего другого, я исследовал API в средстве просмотра объектов Visual Basic, пытаясь начать хотя бы с чего-то.

Проект, приведенный ниже, будет успешно записан в файл NAudio, и я намерен захватить аудиозаписьили как поток в Уотсон.Не знаю, сработает ли этот подход, и я перейду этот мост позже, сейчас мне нужно сначала пройти аутентификацию.

ВОПРОС

МожетКто-нибудь, помогите мне выяснить, как аутентифицироваться с помощью метода SetCredential, передавая ему apikey и URL https://stream.watsonplatform.net/speech-to-text/api/v1/recognize? Он не поддерживает имя пользователя и пароль, вы должны использовать apikey и URL.

VB CODE

Imports IBM.WatsonDeveloperCloud.Util
Imports IBM.WatsonDeveloperCloud.SpeechToText.v1
Imports NAudio.Wave
Imports System.ComponentModel

Public Class Form1
    Dim WithEvents objWaveInEvent As WaveInEvent = New WaveInEvent()
    Dim WithEvents objWaveFileWriter As WaveFileWriter = Nothing
    Dim blnClosing As Boolean = False
    Dim outputFilePath As String = Application.StartupPath & "/outputfile.wav"
    Dim outputFilePath2 As String = Application.StartupPath & "/outputfile2.wav"
    Dim objStream As IO.Stream
    Dim byteArrayAudio As Byte()
    Dim objSpeechToText As New SpeechToTextService
    Dim speechRecognitionResults As New Model.SpeechRecognitionResults

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    End Sub

    Private Sub buttonRecord_Click(sender As Object, e As EventArgs) Handles buttonRecord.Click

        ' Start the Recording
        objWaveFileWriter = New WaveFileWriter(outputFilePath, objWaveInEvent.WaveFormat)
        objWaveInEvent.StartRecording()
        buttonRecord.Enabled = False
        buttonStop.Enabled = True

        ' Authenticate to Watson
        Dim objTokenOptions As TokenOptions = New TokenOptions With {
                .IamApiKey = "<apikey>",
                .IamUrl = "https://stream.watsonplatform.net/speech-to-text/api/v1/recognize"
            }
        Try
            objSpeechToText.SetCredential(objTokenOptions) '(should fail as "Unauthorized but does not")
        Catch exServiceResponse As IBM.WatsonDeveloperCloud.Http.Exceptions.ServiceResponseException
            Debug.WriteLine("objSpeechToText.SetCredential(objTokenOptions): " & exServiceResponse.Message)
        End Try

    End Sub

    Private Sub objWaveInEvent_DataAvailable(sender As Object, e As WaveInEventArgs) Handles objWaveInEvent.DataAvailable
        objWaveFileWriter.Write(e.Buffer, 0, e.BytesRecorded)

        objStream = New IO.MemoryStream(e.Buffer)

        'This next line fails with the following error from Watson:
        'IBM.WatsonDeveloperCloud.Http.Exceptions.ServiceResponseException
        '  HResult=0x80131500
        '  Message=The API query failed with status code Unauthorized: Unauthorized | x-global-transaction-id:  | X-DP-Watson-Tran-ID: 
        '  Source=IBM.WatsonDeveloperCloud.SpeechToText.v1
        Try
            objSpeechToText.Recognize("audio/l16; rate=1600", objStream, "chunked")
        Catch exServiceResponse As IBM.WatsonDeveloperCloud.Http.Exceptions.ServiceResponseException
            Debug.WriteLine("objSpeechToText.Recognize(): " & exServiceResponse.Message)
        End Try

        If (objWaveFileWriter.Position > objWaveInEvent.WaveFormat.AverageBytesPerSecond * 30) Then
            objWaveInEvent.StopRecording()
        End If

    End Sub

    Private Sub objWaveInEvent_RecordingStopped(sender As Object, e As StoppedEventArgs) Handles objWaveInEvent.RecordingStopped
        objWaveFileWriter.Dispose()
        objWaveFileWriter = Nothing
        buttonRecord.Enabled = True
        buttonStop.Enabled = False
        If (blnClosing) Then
            objWaveInEvent.Dispose()
        End If
    End Sub

    Private Sub buttonStop_Click(sender As Object, e As EventArgs) Handles buttonStop.Click
        objWaveInEvent.StopRecording()
    End Sub

    Private Sub Form1_Closing(sender As Object, e As CancelEventArgs) Handles Me.Closing
        blnClosing = True
        objWaveInEvent.StopRecording()
    End Sub

End Class

КОД PHP (это работает)

Я также включил некоторый код PHP для подтверждения концепции, которая прекрасно работает с тем же apikey и URLно он читает файл flac с моего веб-сервера.Вам нужно будет создать тестовый аудиофайл flac (test.flac).

<?php
  $url = 'https://stream.watsonplatform.net/speech-to-text/api/v1/recognize';
  $file = fopen('test.flac', 'r');
  $size = filesize('test.flac');
  $fildata = fread($file,$size);
  $headers = array(    "Content-Type: audio/flac",
            "Transfer-Encoding: chunked");

  //apikey:snWVDdTG-lK2xkqdk7or9uf0mVkiwhP2o3E9TbO_z3kQ                     
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $url);
  //curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");
  curl_setopt($ch, CURLOPT_USERPWD, "apikey:<apikey>"); //PUT YOUR API KEY IN PLACE OF <apikey>
  curl_setopt($ch, CURLOPT_POST, TRUE);
  curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
  curl_setopt($ch, CURLOPT_BINARYTRANSFER, TRUE);
  curl_setopt($ch, CURLOPT_POSTFIELDS, $fildata);
  curl_setopt($ch, CURLOPT_INFILE, $file);
  curl_setopt($ch, CURLOPT_INFILESIZE, $size);
  curl_setopt($ch, CURLOPT_VERBOSE, true);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  $executed = curl_exec($ch);
  curl_close($ch);
  //var_dump($executed);
  $obj = json_decode($executed,true);
  echo $obj["results"][0]["alternatives"][0]["confidence"] . '~' . $obj["results"][0]["alternatives"][0]["transcript"];
?>
...