簡體   English   中英

如何在 NodeJS 中暫停特定的 function?

[英]How can I pause a specific function in NodeJS?

好的,所以我一直在嘗試這樣做很長時間,但我找不到解決方案。 我正在構建一個個人語音助手,它只在檢測到啟動指令時記錄,直到這里一切正常。 為了錄制音頻,我使用的是 npm package node-record-lcpm16。 我似乎找不到暫停或停止(並重新開始)錄制的解決方案。 在錄音機的 npm 網站上,有一個 function 指定,上面寫着recording.stop(),但它對我不起作用。 我現在的代碼是:


const recorder = require('node-record-lpcm16');
const fs = require('file-system');
const speech = require('@google-cloud/speech');
const say = require('say');
const notifier = require('node-notifier');
const Bumblebee = require('bumblebee-hotword-node');
const { setTimeout } = require('timers');
const { record } = require('node-record-lpcm16');
const bumblebee = new Bumblebee;
const voice = 'Microsoft Zira Desktop';


bumblebee.addHotword('computer');

const config = {
  encoding: 'LINEAR16',
  sampleRateHertz: 16000,
  languageCode: 'en-US',
};

const request = {
  config,
  interimResults: false,
};


const client = new speech.SpeechClient();




const recognizeStream = client
  .streamingRecognize(request)
  .on('error', console.error)
  .on('data', data => findfunction(data.results[0].alternatives[0].transcript)
  );

const recording = recorder.record({
  sampleRateHertz: 16000,
  threshold: 0, 
  recorder: 'sox',
  silence: '5.0',
  })
  .stream().on('error', console.error); //Here is the Recorder, and I can't actually stop it and that's my problem.

recording.pipe(recognizeStream);

bumblebee.on('hotword', function(hotword){
  console.log('Hotword detected:', hotword);  // It does these actions as soon as the hotword is detected
  recording.pipe(recognizeStream);
  setTimeout(function stop(){
    recording.pipe(fs.createWriteStream("\\\\.\\NUL")),
    console.log('Stopped Recording.')
  }, 5000);
});


console.log('Computer initiated.');

bumblebee.start();
//Everything down from here is just what do to with the translated speech, it doesn't play a role in my problem.

function findfunction(Data){
  let findFunction = Data;
  console.log(Data);


  if(findFunction.includes('time')){
    whattimeisit(findFunction);
  };

  if(findFunction.includes('day')){
    whatdateisit(findFunction);
  };

  if(findFunction.includes('thank you')){
    thankyou();
  };

  if(findFunction.includes('remind')){
    setatimer(findFunction);
  };

};

function whattimeisit(timeString){
  const date = new Date();
  const time = date.toLocaleTimeString();
  say.speak(`It's currently ${time}.`, voice);
  console.log(`It's currently ${time}.`);
};

function whatdateisit(dateString){
  const date = new Date();
  const currentDate = date.toLocaleDateString();
  say.speak(`It's currently ${currentDate}.`, voice);
  console.log(`It's currently ${currentDate}.`);
};

function thankyou(){
  say.speak("You're welcome!", voice);
  console.log("You're welcome!");
};

function setatimer(timerString){
  const timer = timerString.replace(/\D/g, '');
  setTimeout(function stop() {notifier.notify({title: 'Computer', message: 'Your timer ran out!', icon: './computericon1.png'})} , timer * 60000);
  if(timer == 1){
    say.speak(`Set a timer for ${timer} minute.`, voice);
    console.log(`Set a timer for ${timer} minute.`);
  }else{
    say.speak(`Set a timer for ${timer} minutes.`, voice);
    console.log(`Set a timer for ${timer} minutes.`);
  };
};

任何幫助將不勝感激!

我玩過你的代碼..這絕對是一個有趣的項目!

我建議也許只是修改代碼以記錄到緩沖區,然后將其發送到谷歌語音識別引擎。

recording.stop() 可能對您不起作用的原因是您在 stream 上調用它。 如果我們將recording 和recordingStream 變量分開,我們可以更好地控制流程。

我已經更新了代碼,所以當我們得到啟動指令時,我們會停止錄制,識別語音,然后重新開始錄制。

const recorder = require('node-record-lpcm16');
const Bumblebee = require('bumblebee-hotword-node');

const say = require('say');
const voice = 'Microsoft Zira Desktop';

const speech = require('@google-cloud/speech');

let chunks = null;
let recording = null;

function startRecording() {
    console.log("listening...");
    chunks = [];
    recording = recorder.record({
        sampleRateHertz: 16000,
        threshold: 0, 
        recorder: 'sox',
        silence: '5.0',
    })

    const recordingStream = recording.stream();
    recordingStream.on('error', () => {});

    // Tune this to ensure we only send the last few seconds of audio to google..
    const maxChunks = 10;
    recordingStream.on('data', (chunk) => {
        chunks.push(chunk);
        // keep the number of chunks below a reasonable limit...
        if (chunks.length > maxChunks) {
            chunks = chunks.slice(-maxChunks);
        }
    });
    recordingStream.on('end', async () => {
        // Create a buffer from our recording, it should only be a few seconds long.
        const audioBuffer = Buffer.concat(chunks);
        console.log("Chunk count:", chunks.length);
        await recognizeSpeech(audioBuffer);
        startRecording();
    });
}

async function recognizeSpeech(audioBuffer) {
    console.log(`recognizeSpeech: Converting audio buffer to text (${audioBuffer.length} bytes)...`)
    const client = new speech.SpeechClient();
    const request = {
        config: { encoding: 'LINEAR16', sampleRateHertz: 16000, languageCode: 'en-US'},
        audio: { content: audioBuffer.toString("base64") }
    };
    // Convert our audio to text.
    const response = await client.recognize(request)    
    findfunction(response[0].results[0].alternatives[0].transcript);
}

startRecording();
startBumblebee();

function startBumblebee() {
    const bumblebee = new Bumblebee();
    bumblebee.addHotword('computer');
    bumblebee.on('hotword', function(hotword){
        console.log('Hotword detected:', hotword);
        setTimeout(() => {
            console.log('Stopping recording...');
            recording.stop()
        }, 2000);
    });
    bumblebee.start( );
}

// Nothing changed from here...
function findfunction(Data){
    let findFunction = Data;
    console.log(Data);


    if(findFunction.includes('time')){
    whattimeisit(findFunction);
    };

    if(findFunction.includes('day')){
    whatdateisit(findFunction);
    };

    if(findFunction.includes('thank you')){
    thankyou();
    };

    if(findFunction.includes('remind')){
    setatimer(findFunction);
    };

};

function whattimeisit(timeString){
    const date = new Date();
    const time = date.toLocaleTimeString();
    say.speak(`It's currently ${time}.`, voice);
    console.log(`It's currently ${time}.`);
};

function whatdateisit(dateString){
    const date = new Date();
    const currentDate = date.toLocaleDateString();
    say.speak(`It's currently ${currentDate}.`, voice);
    console.log(`It's currently ${currentDate}.`);
};

function thankyou(){
    say.speak("You're welcome!", voice);
    console.log("You're welcome!");
};

function setatimer(timerString){
    const timer = timerString.replace(/\D/g, '');
    setTimeout(function stop() {notifier.notify({title: 'Computer', message: 'Your timer ran out!', icon: './computericon1.png'})} , timer * 60000);
    if(timer == 1){
    say.speak(`Set a timer for ${timer} minute.`, voice);
    console.log(`Set a timer for ${timer} minute.`);
    }else{
    say.speak(`Set a timer for ${timer} minutes.`, voice);
    console.log(`Set a timer for ${timer} minutes.`);
    };
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM