2017-05-01 86 views
1

我使用node.js客戶端庫,特別是startRecognition方法,並獲得我使用speech.operation的結果。然而,我沒有得到以下結果 - 查看包含一些編碼字符串而不是JavaScript對象的「值」對象。Google speech api,node.js客戶端 - 使用'operation'時出錯的結果

{ result: 'response', 
    name: '3939860839213416358', 
    metadata: 
    { typeUrl: 'type.googleapis.com/google.cloud.speech.v1.LongRunningRecognizeMetadata', 
    value: 'CGQSCwiKx47IBRCg6pRuGgsIqM6OyAUQgO+vYQ==' }, 
    done: true, 
    error: null, 
    response: 
    { typeUrl: 'type.googleapis.com/google.cloud.speech.v1.LongRunningRecognizeResponse', 
    value: 'EoQaCtICCsoCVGhleSBzbWFsbCBsYXRlc3QgZW52aXJvbm1lbnQuIFdlIGhhdmUgYSBjb3Jwb3JhdGUgYnVzaW5lc3Mgc2VydmljZSBhbmQgdGhlcmVmb3Jl' } } 

有沒有人看到這個?這是一個錯誤?或者有沒有辦法將其解碼爲JavaScript對象?

這裏有一個代碼片段演示了這個問題:

var Speech = require('@google-cloud/speech')({ 
    projectId: 'my project name', 
    keyFilename: '<key file name>.json' 
}); 

var opName=''; 

var config = { 
    encoding: 'LINEAR16', 
    sampleRateHertz: 48000, 
    languageCode: 'en-US', 
    maxAlternatives: 10 
}; 

asyncGoogleASR('gs://file-location',config); 

function asyncGoogleASR(googleCloudURI,request) { 
    Speech.startRecognition(googleCloudURI, request,async_callback); 
} 
function async_callback(err, operation, apiResponse) { 
    if (err) { 
    console.log(err); 
    } 
    opName=operation.latestResponse.name; 

    operation 
    .on('error', function(err) { 
     console.log("error"); 
     console.log(err); 
    }) 
    .on('complete', function(results) { 
     console.log(results); // this works okay 
     var op = Speech.operation(opName); 
      op 
      .on('error', function(err) { 
       console.log("error"); 
       console.log(err); 
      }) 
      .on('complete', function(results) { 
       console.log(results); // this prints garbage 
      }); 
    }); 


} 
+0

你可以顯示代碼發出請求的位置嗎? –

+0

剛剛更新了帖子,添加了我正在使用的代碼 – MirM

回答

0

的LongRunningOperation從第一請求返回,但在操作完成之後,必須檢索結果。換句話說,speech.startRecognize將返回輪詢的「操作」標識符,直到操作完成並稍後用於檢索結果。

下面的代碼進行測試工作,並可能會有所幫助,讓您開始:

const Speech = require('@google-cloud/speech'); 
const speech = Speech(); 
const request = { 
    encoding: encoding, 
    sampleRateHertz: sampleRateHertz, 
    languageCode: languageCode 
}; 

speech.startRecognition(gcsUri, request) 
    .then((results) => { 
    const operation = results[0]; 
    return operation.promise(); 
    }) 
    .then((results) => { 
    const transcription = results[0]; 
    console.log(`Transcription: ${transcription}`); 
    }) 
    .catch((err) => { 
    console.error('ERROR:', err); 
    }); 

你要知道這個代碼是使用speech.recognize,而是speech.startRecognize(它允許你使用大文件它們存儲在Google雲端存儲中)。

要看到它的工作,嘗試:

node recognize.js async-gcs gs://gcs-test-data/vr.flac -e FLAC -r 16000` 

作爲證明in the Github project

+1

是的,我知道這段代碼工作正常。遺憾的是,這並不能幫助我,只是因爲我需要轉錄的文件太長,操作超時。這就是我需要使用「操作」方法的原因 - 我打印操作名稱並每隔幾分鐘嘗試獲取結果。但是當操作完成時,結果顯示不正確。 – MirM

+0

使用異步方法的音頻轉錄僅限於60分鐘,您的音頻是否超過60分鐘?如果您達到限制,您可能會將不正確的轉錄設置傳遞給API。例如,如果你有44.1千赫的音頻,並且告訴API它是16khz,那麼API將會把它解釋爲3倍,只要它實際上是。 – class

+0

不,它不超過60分鐘,而且我沒有收到表示時間過長的回覆。該操作只是在node.js過程中超時,我得到一個超時異常。 – MirM

相關問題