ОБЗОР
Я использую 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"];
?>