nls_token.js 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. 'use strict';
  2. /**
  3. * 阿里云获取语音token接口
  4. *
  5. * @author CaiAoLin
  6. * @date 2018/1/25
  7. * @version
  8. */
  9. const Core = require('@alicloud/pop-core');
  10. const smsAli = require('../const/sms_alitemplate.js');
  11. const Nls = require('alibabacloud-nls');
  12. class NlsToken {
  13. constructor(ctx) {
  14. this.ctx = ctx;
  15. this.appkey = 'nE0d2Ue08rtPhb9e';
  16. this.shotUrl = 'wss://nls-gateway.cn-shanghai.aliyuncs.com/ws/v1';
  17. }
  18. async getToken() {
  19. const client = new Core({
  20. accessKeyId: smsAli.accessKey,
  21. accessKeySecret: smsAli.accessKeySecret,
  22. endpoint: 'https://nls-meta.cn-shanghai.aliyuncs.com', // 注意语音服务用这个endpoint
  23. apiVersion: '2019-02-28',
  24. });
  25. const params = {
  26. Action: 'CreateToken',
  27. };
  28. const requestOption = {
  29. method: 'POST',
  30. };
  31. try {
  32. const result = await client.request('CreateToken', params, requestOption);
  33. return result.Token.Id;
  34. } catch (err) {
  35. this.ctx.logger.error('获取语音识别Token失败', err);
  36. throw err;
  37. }
  38. }
  39. /**
  40. * audioBuffer: Buffer of wav (16k)
  41. */
  42. async oneShotRecognition(token, audioBuffer, url = this.shotUrl, appkey = this.appkey) {
  43. return new Promise(async (resolve, reject) => {
  44. let finalText = '';
  45. const sr = new Nls.SpeechRecognition({
  46. url,
  47. appkey,
  48. token,
  49. enable_punctuation_prediction: false,
  50. enable_inverse_text_normalization: true,
  51. });
  52. sr.on('started', (msg) => {
  53. try {
  54. const data = JSON.parse(msg);
  55. // console.log('Client recv started:', data);
  56. } catch (err) {
  57. console.log('started parse error:', err);
  58. }
  59. });
  60. sr.on('changed', (msg) => {
  61. try {
  62. const data = JSON.parse(msg);
  63. if (data.payload && data.payload.result) {
  64. finalText = data.payload.result;
  65. }
  66. console.log('changed finalText:', finalText);
  67. } catch (err) {
  68. console.log('changed parse error:', err);
  69. }
  70. });
  71. sr.on('completed', (msg) => {
  72. try {
  73. const data = JSON.parse(msg);
  74. if (data.payload && data.payload.result) {
  75. finalText = data.payload.result;
  76. }
  77. // console.log('completed finalText:', finalText);
  78. } catch (err) {
  79. console.log('completed parse error:', err);
  80. }
  81. });
  82. sr.on('closed', () => {
  83. // console.log('closed finalText:', finalText);
  84. resolve(finalText.trim());
  85. });
  86. sr.on('failed', (msg) => {
  87. try {
  88. const data = JSON.parse(msg);
  89. reject(new Error(JSON.stringify(data)));
  90. } catch (err) {
  91. reject(new Error(msg));
  92. }
  93. });
  94. try {
  95. // 启动识别
  96. await sr.start(sr.defaultStartParams(), true, 6000);
  97. if (!sr.sendAudio(audioBuffer)) {
  98. throw new Error('send audio failed');
  99. }
  100. await sr.close();
  101. } catch (err) {
  102. console.log('error on start:', err);
  103. return reject(err);
  104. }
  105. });
  106. }
  107. }
  108. module.exports = NlsToken;