将从 m3u8 流中提取的 MP3 音频发送到 IBM Watson Speech To Text

Send MP3 audio extracted from m3u8 stream to IBM Watson Speech To Text

我正在从 M3U8 直播中提取 MP3 格式的音频 url,最终目标是将直播音频流发送到 IBM Watson Speech To Text。 m3u8 是通过进程调用外部脚本获得的。然后我使用 FFMPEG 脚本在标准输出中获取音频。如果我将音频保存在文件中但我不想保存提取的音频,它会起作用,我需要将数据直接发送到 STT 服务。到目前为止,我是这样进行的:

SpeechToTextService speechToTextService = new SpeechToTextService(sttUsername, sttPassword);
string m3u8Url = "https://something.m3u8";
char[] buffer = new char[48000];
Process ffmpeg = new ProcessHelper(@"ffmpeg\ffmpeg.exe", $"-v 0 -i {m3u8Url} -acodec mp3 -ac 2 -ar 48000 -f mp3 -");

ffmpeg.Start();
int count;
while ((count = ffmpeg.StandardOutput.Read(buffer, 0, 48000)) > 0)
{
    ffmpeg.StandardOutput.Read(buffer, 0, 48000);
    var answer = speechToTextService.RecognizeSessionless(
        audio: buffer.Select(c => (byte)c).ToArray(),
        contentType: "audio/mpeg",
        smartFormatting: true,
        speakerLabels: false,
        model: "en-US_BroadbandModel"
    );
    // Get answer.ResponseJson, deserializing, clean buffer, etc...
}

请求转录的音频时出现此错误:

An unhandled exception of type 'System.AggregateException' occurred in IBM.WatsonDeveloperCloud.SpeechToText.v1.dll: 'One or more errors occurred. (The API query failed with status code BadRequest: Bad Request | x-global-transaction-id: bd6cd203720a70d83b9a03451fe28973 | X-DP-Watson-Tran-ID: bd6cd203720a70d83b9a03451fe28973)'
 Inner exceptions found, see $exception in variables window for more details.
 Innermost exception     IBM.WatsonDeveloperCloud.Http.Exceptions.ServiceResponseException : The API query failed with status code BadRequest: Bad Request | x-global-transaction-id: bd6cd203720a70d83b9a03451fe28973 | X-DP-Watson-Tran-ID: bd6cd203720a70d83b9a03451fe28973
   at IBM.WatsonDeveloperCloud.Http.Filters.ErrorFilter.OnResponse(IResponse response, HttpResponseMessage responseMessage)
   at IBM.WatsonDeveloperCloud.Http.Request.<GetResponse>d__30.MoveNext()
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at IBM.WatsonDeveloperCloud.Http.Request.<AsMessage>d__23.MoveNext()
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at IBM.WatsonDeveloperCloud.Http.Request.<As>d__24`1.MoveNext()

ProcessHelper 只是为了方便:

class ProcessHelper : Process
{
    private string command;
    private string arguments;
    public ProcessHelper(string command, string arguments, bool redirectStandardOutput = true)
    {
        this.command = command;
        this.arguments = arguments;
        StartInfo = new ProcessStartInfo()
        {
            FileName = this.command,
            Arguments = this.arguments,
            UseShellExecute = false,
            RedirectStandardOutput = redirectStandardOutput,
            CreateNoWindow = true
        };
    }
}

很确定我做错了,我希望有人能对此有所启发。谢谢

我仍然不知道为什么我无法识别无会话我的缓冲区(第二个 ffmpeg.StandardOutput.Read(buffer, 0, 48000); 顺便说一句,这是一个错字)但我设法让它与 websockets 一起工作,比如在那里解释 https://gist.github.com/nfriedly/0240e862901474a9447a600e5795d500