내 연락처 정보
우편메소피아@프로톤메일.com
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Alibaba에서 제공하는 데모 코드는 모두 JavaScript이므로 직접 만들 수 있습니다. 참고로 알리바바 문장 받아쓰기 Nls용 타이프스크립트 모듈을 작성했습니다. VUE3의 통합 API 형태
startClient: 받아쓰기를 시작합니다. 다음 단계는 가능한 한 빨리 인식 및 데이터 전송을 활성화하는 것입니다. 그렇지 않으면 6초 후에 닫힙니다.
startRecognition: 인식 트랜잭션을 시작하고 인식 콜백을 전달하며 문자를 인쇄하거나 화면에 표시할 수 있습니다.
sendSound: 바이너리 PCM 데이터 전송(16MHz16비트 형식)
stopRecognition: 인식 트랜잭션 종료
- /**
- * 阿里语音,一句话识别模块for ccframe
- *
- * 无心跳设计,非长连接推送,因此在需要使用的时候才进行连接
- *
- * @Jim 2024/07/08
- */
- import * as utils from '@/utils/index'
- import { nextTick } from 'vue'
- // import Global from '@/utils/constants'
-
- const NLS_SERVER_URL = 'wss://nls-gateway.aliyuncs.com/ws/v1'
- const NLS_MODE = 'SpeechRecognizer' // 一句话识别
- const WEBSOCKET_MAX_RETRY = 3
- const RECONNECT_INTERVAL = 3000
-
- interface INlsConfig {
- url?: string
- appkey: string // 应用的key
- token: string // 从服务器获得,要缓存
- }
-
- let client: (UniNamespace.SocketTask & { readyState?: WsState }) | undefined
- const clientId = utils.uuid(utils.UUIDFormat.StandardCompact)
- let taskId: string = ''
- let config: INlsConfig
- let reconnectAttempts = 0
- let taskStarted = false
-
- enum WsState {
- CONNECTING,
- OPEN,
- CLOSING,
- CLOSED
- }
-
- /**
- *
- * @param action
- * @returns 请求json
- */
- const buildMsg: (action: string, payload: Record<string, any>) => string = (
- action,
- payload = {}
- ) => {
- if (taskId.length === 0) {
- taskId = utils.uuid(utils.UUIDFormat.StandardCompact)
- }
- const msg = {
- header: {
- message_id: utils.uuid(utils.UUIDFormat.StandardCompact),
- task_id: taskId,
- namespace: NLS_MODE,
- name: action,
- appkey: config.appkey
- },
- payload,
- context: {
- sdk: {
- name: 'nls-wx-sdk',
- version: '0.0.1',
- language: 'wxjs'
- }
- }
- }
- return JSON.stringify(msg, null, 0)
- }
-
- /**
- * 开启连接,开启后立即要传,否则会被关闭.
- * @param config
- * @param callback
- */
- export const startClient = (
- conf?: INlsConfig,
- startCallback?: () => void,
- recognizedCallback?: (text: string) => void
- ) => {
- if (client && client.readyState !== WsState.CLOSED) {
- // 关闭原连接
- client.close({})
- }
-
- client = uni.connectSocket({
- url: conf.url ?? NLS_SERVER_URL,
- tcpNoDelay: true,
- header: {
- 'X-NLS-Token': conf?.token ?? config.token
- },
- success: (res) => {
- if (!config) config = conf
- console.log(`connected to ${NLS_SERVER_URL} success`)
- },
- fail: (res) => {
- console.log(`connect to ${NLS_SERVER_URL} failed:${res.errMsg}`)
- }
- })
- client.readyState = WsState.CONNECTING
-
- client.onMessage((res) => {
- if (typeof res.data === 'string') {
- const msgObj = JSON.parse(res.data)
- switch (msgObj?.header?.name) {
- case 'RecognitionStarted': {
- console.log('started')
- break
- }
- case 'RecognitionResultChanged': {
- if (recognizedCallback) {
- const text = msgObj?.payload?.result
- if (text) {
- recognizedCallback(text)
- }
- }
- console.log('changed')
- break
- }
- case 'RecognitionCompleted': {
- const text = msgObj?.payload?.result
- if (text) {
- recognizedCallback(text)
- }
- taskStarted = false // 结束识别
- break
- }
- case 'TaskFailed': {
- taskStarted = false // 结束识别
- break
- }
- }
- }
- console.log('recv:' + res.data)
- })
-
- client.onOpen(() => {
- reconnectAttempts = 0
- client.readyState = WsState.OPEN
- if (startCallback) nextTick(startCallback)
- })
-
- client.onError((error) => {
- console.error('WebSocket error:', error)
- if (reconnectAttempts < WEBSOCKET_MAX_RETRY) {
- setTimeout(() => startClient(), RECONNECT_INTERVAL)
- } else {
- console.error('Max reconnect attempts reached')
- }
- })
-
- client.onClose(() => {
- client.readyState = WsState.CLOSED
- console.log('connection closed')
- })
- }
-
- export const startRecognition = () => {
- if (client && client.readyState === WsState.OPEN)
- client.send({
- data: buildMsg('StartRecognition', {
- format: 'opus',
- sample_rate: 16000,
- enable_intermediate_result: true,
- enable_punctuation_prediction: true,
- enable_inverse_text_normalization: true
- }),
- success: (res) => {
- taskStarted = true
- }
- })
- }
-
- export const stopRecognition = () => {
- if (client && client.readyState === WsState.OPEN)
- client.send({
- data: buildMsg('StopRecognition', {
- format: 'opus',
- sample_rate: 16000,
- enable_intermediate_result: true,
- enable_punctuation_prediction: true,
- enable_inverse_text_normalization: true
- }),
- complete: () => {
- taskStarted = false // 不管是否成功,都不发送音频了
- }
- })
- }
-
- export const sendSound = (msgBytes: ArrayBuffer) => {
- if (client && client.readyState === WsState.OPEN && taskStarted)
- client.send({
- data: msgBytes,
- success: (res) => {
- console.log('send ' + msgBytes.byteLength + ' success')
- }
- })
- }
util의 uuid 도구에 대해서는 이전 기사를 참조하세요.https://mp.csdn.net/mp_blog/creation/editor/140267684https://mp.csdn.net/mp_blog/creation/editor/140267684