如何将STT文件流式传输到IBM Watson(Unity)?

时间:2017-07-25 11:18:24

标签: c# unity3d speech-recognition ibm-watson

我正在使用IBM Watson Unity SDK

网上有一些关于如何将文件发送给IBM Watson的例子。

但没有确切的例子说明如何将长文件流分割为部分。那么我想做什么: 我有一个日志音频文件(约1-3分钟),并希望将其发送给Watson以识别语音。

IBM Watson仅接受< 5mb文件,但我的文件较大,所以我需要将其拆分并作为部分发送。

这是我的代码:

private void OnAudioLoaded (AudioClip clip)
{
    Debug.Log ("Audio was loaded and starting to stream...");
    _chunksCount = 0;

    float[] clipData = new float[(int)(clip.length * CHUNK_SIZE)];
    clip.GetData (clipData, 1);

    try {
        _speechToText.StartListening (OnRecognize);

        for (int i = 0; i < Math.Ceiling (clip.length / SECONDS_TO_SPLIT); i++) {
            Debug.Log ("Iteration of recognition #" + i);
            _chunksCount++;

            // creating array of floats from clip array
            float[] chunkData = new float[SECONDS_TO_SPLIT * (int)CHUNK_SIZE];
            Array.Copy (clipData, i * SECONDS_TO_SPLIT * (int)CHUNK_SIZE, chunkData, 0, clipData.Length - i * SECONDS_TO_SPLIT * CHUNK_SIZE < SECONDS_TO_SPLIT * CHUNK_SIZE ? (int)(clipData.Length - i * SECONDS_TO_SPLIT * CHUNK_SIZE) : SECONDS_TO_SPLIT * (int)CHUNK_SIZE);

            // creating audioclip from floats array
            AudioClip chunk = AudioClip.Create ("ch", clip.frequency * SECONDS_TO_SPLIT, clip.channels, clip.frequency, false);
            chunk.SetData (chunkData, 0);
            AudioData audioData = new AudioData (chunk, chunk.samples);

            // sending recognition request
            _speechToText.OnListen (audioData);
        }
    } catch (OutOfMemoryException e) {
        DialogBoxes.CallErrorBox ("Audio Recognition Error", e.Message);
    }
}

问题是:

在线_speechToText.StartListening (OnRecognize);我分配了一个回调函数OnRecognize,当被识别出某些内容时应该调用它,但它永远不会被调用。

我正在测试的这个文件已经在网站上得到认可,这绝对没问题。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

因此,数字是Watson无法识别的数据块太小,因此我针对此特定问题的解决方案是发送更长的音频块(几秒钟长,大约半分钟),并且识别工作正常。

我发送的音频文件越长,收到的效果越好,但仍然必须小于5mb。

此解决方案非常古老,但是可以帮助遇到相同问题的人。