Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 从浏览器将音频流到带有块的Dialogflow_Node.js_Socket.io_Dialogflow Es_Mediastream - Fatal编程技术网

Node.js 从浏览器将音频流到带有块的Dialogflow

Node.js 从浏览器将音频流到带有块的Dialogflow,node.js,socket.io,dialogflow-es,mediastream,Node.js,Socket.io,Dialogflow Es,Mediastream,我们正在对Dialogflow进行一些实验,目前我们已经完全停止了。我们正在尝试设置一个浏览器客户端,该客户端通过Dialogflow npm包的节点v2beta1版本将音频分块流式传输到Dialogflow。我们按照这个示例来运行它,当我们使用节点服务器通过额外软件(sox)拾取声音时,它可以正常工作,但我们希望从浏览器中进行流式传输。因此,我们设置了一个小代码段,用于从麦克风中提取媒体流 当数据事件触发End时,我们会得到一个区块(arraybuffer),我们会将其以区块的形式传递给节点服

我们正在对Dialogflow进行一些实验,目前我们已经完全停止了。我们正在尝试设置一个浏览器客户端,该客户端通过Dialogflow npm包的节点v2beta1版本将音频分块流式传输到Dialogflow。我们按照这个示例来运行它,当我们使用节点服务器通过额外软件(sox)拾取声音时,它可以正常工作,但我们希望从浏览器中进行流式传输。因此,我们设置了一个小代码段,用于从麦克风中提取媒体流

当数据事件触发End时,我们会得到一个区块(arraybuffer),我们会将其以区块的形式传递给节点服务器

在服务器上,我们遵循以下示例:。唯一不同的是,我们不使用泵来链接流,而是将块写入SessionClient

streamingDetectIntent().write({ inputAudio: [chunk] })
在实验过程中,我们收到了几个我们解决的错误。但在这一点上,我们传递了我们的块,并在过程中和最后收到了空的响应

这是向dialogflow传递音频的有效方法,还是我们真的需要设置流?我们不希望将节点服务器用作条目,它需要是浏览器。我们将拥有完全的控制权

客户

import getUserMedia from 'get-user-media-promise';
import MicrophoneStream from 'microphone-stream';

export const startVoiceStream = () => {
  const microphoneStream = new MicrophoneStream();

    getUserMedia({ video: false, audio: true })
    .then(function(micStream) {

      microphoneStream.setStream(micStream);

      socket.emit('startMicStream');

      state.streamingMic = true;

      setTimeout(() => {
        // Just closing the stream on a timer for now
        socket.emit('endMicStream');
      }, 5000);
    })
    .catch(function(error) {
      console.log(error);
    });

    microphoneStream.on('data', function(chunk) {
    if (state.streamingMic) {
      socket.emit('micStreamData', chunk);
    }
  });
};
服务器代码要长得多,所以我想我将省略细节,但这些是主要部分

const initialStreamRequest = {
    session: sessions.sessionPath,
    queryParams: {
        session: sessions.sessionPath, //TODO: try to delete
    },
    queryInput: {
        audioConfig: {
            audioEncoding: 'AUDIO_ENCODING_LINEAR_16',
            sampleRateHertz: '16000',
            languageCode: 'en-US',
        },
        singleUtterance: false
    },
};

const startRecognitionStream = socketClient => {
    streamIntent = sessions.sessionClient
      .streamingDetectIntent()
      .on('error', error => {
        console.error({ error });
        socketClient.emit('streamError', error);
      })
      .on('data', data => {
        socketClient.emit('debug', { message: 'STREAM "ON DATA"', data });
        if (data.recognitionResult) {
          socketClient.emit(
            'playerTranscript',
            data.recognitionResult.transcript,
          );
          console.log(
            `#Intermediate transcript : ${data.recognitionResult.transcript}`,
          );
        } else {
          socketClient.emit('streamAudioResponse', data);
        }
      });
    streamIntent.write(initialStreamRequest);
  };

socket.on('micStreamData', data => {
    if (streamIntent !== null) {
      stop = true;
      streamIntent.write({ inputAudio: data });
    }
  });