2017-07-02 6 views
1

Google音声APIを使用してテキストをテキストに変換する簡単なWebアプリケーションを作成しようとしています。 Google Speech API認証などを正しく設定して、Googleのノードサンプルを管理するようにしました。私はこれをしようとすると、私が取得ExpressサーバでGoogle Speech APIを使用する

const express = require("express"); 
const fs = require("fs"); 
const app = express(); 
app.set("port", process.env.PORT || 3001); 

function syncRecognize (filename, encoding, sampleRateHertz, languageCode) { 

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

    const request = { 
    encoding: encoding, 
    sampleRateHertz: sampleRateHertz, 
    languageCode: languageCode 
    }; 

    speech.recognize(filename, request) 
    .then((results) => { 
     const transcription = results[0]; 
     return transcription; 
    }) 
    .catch((err) => { 
     console.error('ERROR:', err); 
    }); 
} 

app.get("/api/transcribe", (req, res) => { 

    syncRecognize(
    './audio.raw', 
    'LINEAR16', 
    16000, 
    'en-US' 
).then(text => {res.json(text)}) 
    .catch((err) => { 
    console.error('ERROR:', err); 
    }); 
}) 

:今、私は次のserver.jsと同じディレクトリに住んでいる「audio.raw」と呼ばれるローカルファイルに私自身のサーバーからそれを呼び出したいです次のエラー:

[0] TypeError: Cannot read property 'then' of undefined 
[0]  at /path/to/server.js:62:4 // the .then after syncRecognize(...) 
... 

どうすればいいですか? [OK]を

EDIT

ので、私はsyncRecognize機能が実際にいくつかの点で正しいconst transcriptionを返すことを確認しました。問題は、なんらかの理由で。が返されるのを待たないということです。

私は ".then"演算子を使用するために、約束を返す必要があることを読んだ。私はこれを行う方法や、より良い選択肢があるかどうかについては正確にはわかりません。私はそれが本当に非同期についての私の知識の欠如の問題だと思います。

答えて

0

関数の最後の数行で、recognize()というメソッド呼び出しが実際にPromiseを返すことがわかります。あなたは簡単にあなたが約束としてapp.get()でこのメソッドを呼び出しているので、単にあなたの方法での約束を返す.then().catch()

F使用して伝えることができます:

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

function syncRecognize (filename, encoding, sampleRateHertz, languageCode) { 

    const request = { 
    encoding, 
    sampleRateHertz, 
    languageCode, 
    } 

    return speech.recognize(filename, request) 
} 
+0

おかげで、最終的にもそれがで働かせましたコールバックが、私は(希望)これはよりエレガントだと思う:)。 jsonの解析などを行うために、複数の '.then(...)'を順番に呼び出すのは普通ですか? – anthnyprschka

+0

私の意見では、async/awaitを使う方がよりエレガントです。プロミスをチェーン化することに何も問題はありません。それは、プロミスがプロミスを返すことができるという重要な概念の1つです。 –

関連する問題