'use strict'; /** * 阿里云获取语音token接口 * * @author CaiAoLin * @date 2018/1/25 * @version */ const Core = require('@alicloud/pop-core'); const smsAli = require('../const/sms_alitemplate.js'); const Nls = require('alibabacloud-nls'); class NlsToken { constructor(ctx) { this.ctx = ctx; this.appkey = 'nE0d2Ue08rtPhb9e'; this.shotUrl = 'wss://nls-gateway.cn-shanghai.aliyuncs.com/ws/v1'; } async getToken() { const client = new Core({ accessKeyId: smsAli.accessKey, accessKeySecret: smsAli.accessKeySecret, endpoint: 'https://nls-meta.cn-shanghai.aliyuncs.com', // 注意语音服务用这个endpoint apiVersion: '2019-02-28', }); const params = { Action: 'CreateToken', }; const requestOption = { method: 'POST', }; try { const result = await client.request('CreateToken', params, requestOption); return result.Token.Id; } catch (err) { this.ctx.logger.error('获取语音识别Token失败', err); throw err; } } /** * audioBuffer: Buffer of wav (16k) */ async oneShotRecognition(token, audioBuffer, url = this.shotUrl, appkey = this.appkey) { return new Promise(async (resolve, reject) => { let finalText = ''; const sr = new Nls.SpeechRecognition({ url, appkey, token, enable_punctuation_prediction: false, enable_inverse_text_normalization: true, }); sr.on('started', (msg) => { try { const data = JSON.parse(msg); // console.log('Client recv started:', data); } catch (err) { console.log('started parse error:', err); } }); sr.on('changed', (msg) => { try { const data = JSON.parse(msg); if (data.payload && data.payload.result) { finalText = data.payload.result; } console.log('changed finalText:', finalText); } catch (err) { console.log('changed parse error:', err); } }); sr.on('completed', (msg) => { try { const data = JSON.parse(msg); if (data.payload && data.payload.result) { finalText = data.payload.result; } // console.log('completed finalText:', finalText); } catch (err) { console.log('completed parse error:', err); } }); sr.on('closed', () => { // console.log('closed finalText:', finalText); resolve(finalText.trim()); }); sr.on('failed', (msg) => { try { const data = JSON.parse(msg); reject(new Error(JSON.stringify(data))); } catch (err) { reject(new Error(msg)); } }); try { // 启动识别 await sr.start(sr.defaultStartParams(), true, 6000); if (!sr.sendAudio(audioBuffer)) { throw new Error('send audio failed'); } await sr.close(); } catch (err) { console.log('error on start:', err); return reject(err); } }); } } module.exports = NlsToken;