xfyun-client
Advanced tools
Comparing version 1.0.0 to 1.1.0
@@ -1,3 +0,2 @@ | ||
import * as rxjs from 'rxjs'; | ||
import { BehaviorSubject, Subject } from 'rxjs'; | ||
import { BehaviorSubject, Subject, Observable } from 'rxjs'; | ||
import { ApiConnectionStatus } from './status.js'; | ||
@@ -14,3 +13,10 @@ import { ApiOption, AuthOption } from './option.js'; | ||
protected $status: BehaviorSubject<ApiConnectionStatus>; | ||
/** | ||
* A stream of 16 bit PCM data. | ||
*/ | ||
protected $audio: Subject<Uint8Array>; | ||
/** | ||
* A stream of 16 bit PCM data chunked into `chuckLength` and seperated temporally by `chuckDelay`. | ||
*/ | ||
protected $chunked: Observable<Uint8Array>; | ||
protected Option(): O; | ||
@@ -20,4 +26,12 @@ protected Response(): Res; | ||
protected setStatus(status: ApiConnectionStatus): void; | ||
getStatus(): rxjs.Observable<ApiConnectionStatus>; | ||
getSid(): string; | ||
getStatus(): Observable<ApiConnectionStatus>; | ||
/** | ||
* @returns the {@link $audio} | ||
*/ | ||
getAudio(): Observable<Uint8Array>; | ||
/** | ||
* @returns the {@link $chunked} | ||
*/ | ||
getChunked(): Observable<Uint8Array>; | ||
sendAudioBuffer(audioBuffer: AudioBuffer): Promise<void>; | ||
@@ -24,0 +38,0 @@ sendBuffer(sourceBuffer: Float32Array, sampleRate: number): Promise<void>; |
@@ -1,1 +0,1 @@ | ||
import{a}from"../chunk-E4YGB4FA.js";import"../chunk-P4WGXM62.js";import"../chunk-N5NFW233.js";import"../chunk-L4NF3W25.js";import"../chunk-NP4EEY2K.js";import"../chunk-JDCMXEEN.js";import"../chunk-GW4NARR6.js";import"../chunk-LIPHC4AO.js";export{a as ApiConnection}; | ||
import{a}from"../chunk-SE6DDARR.js";import"../chunk-W4BRMK4G.js";import"../chunk-7ZEMB3HS.js";import"../chunk-N5NFW233.js";import"../chunk-IMAYVM2Y.js";import"../chunk-NP4EEY2K.js";import"../chunk-JDCMXEEN.js";import"../chunk-GW4NARR6.js";import"../chunk-LIPHC4AO.js";export{a as ApiConnection}; |
@@ -1,1 +0,1 @@ | ||
import"../chunk-JZND3VTD.js";import"../chunk-DYKUDQHN.js";import{a as d}from"../chunk-E4YGB4FA.js";import"../chunk-P4WGXM62.js";import"../chunk-N5NFW233.js";import"../chunk-L4NF3W25.js";import"../chunk-NP4EEY2K.js";import{a as b}from"../chunk-JDCMXEEN.js";import{a as c}from"../chunk-GW4NARR6.js";import{a}from"../chunk-LIPHC4AO.js";export{d as ApiConnection,a as ApiConnectionStatus,b as ApiOption,c as ApiResponse}; | ||
import"../chunk-JZND3VTD.js";import{a as d}from"../chunk-SE6DDARR.js";import"../chunk-W4BRMK4G.js";import"../chunk-7ZEMB3HS.js";import"../chunk-N5NFW233.js";import"../chunk-IMAYVM2Y.js";import"../chunk-NP4EEY2K.js";import{a as b}from"../chunk-JDCMXEEN.js";import"../chunk-DYKUDQHN.js";import{a as c}from"../chunk-GW4NARR6.js";import{a}from"../chunk-LIPHC4AO.js";export{d as ApiConnection,a as ApiConnectionStatus,b as ApiOption,c as ApiResponse}; |
@@ -1,1 +0,1 @@ | ||
import{a}from"../chunk-I7AXM2CI.js";import"../chunk-EQKNTHBH.js";import"../chunk-TE2IHAKM.js";import"../chunk-JZND3VTD.js";import"../chunk-DYKUDQHN.js";import"../chunk-E4YGB4FA.js";import"../chunk-P4WGXM62.js";import"../chunk-N5NFW233.js";import"../chunk-L4NF3W25.js";import"../chunk-NP4EEY2K.js";import"../chunk-JDCMXEEN.js";import"../chunk-GW4NARR6.js";import"../chunk-LIPHC4AO.js";export{a as IatConnection}; | ||
import{a}from"../chunk-A7HV3EZ7.js";import"../chunk-EQKNTHBH.js";import"../chunk-TE2IHAKM.js";import"../chunk-JZND3VTD.js";import"../chunk-SE6DDARR.js";import"../chunk-W4BRMK4G.js";import"../chunk-7ZEMB3HS.js";import"../chunk-N5NFW233.js";import"../chunk-IMAYVM2Y.js";import"../chunk-NP4EEY2K.js";import"../chunk-JDCMXEEN.js";import"../chunk-DYKUDQHN.js";import"../chunk-GW4NARR6.js";import"../chunk-LIPHC4AO.js";export{a as IatConnection}; |
@@ -1,1 +0,1 @@ | ||
import"../chunk-E5GULNMT.js";import{a as d}from"../chunk-I7AXM2CI.js";import{a}from"../chunk-EQKNTHBH.js";import"../chunk-D55QM667.js";import{a as b,b as c}from"../chunk-TE2IHAKM.js";import"../chunk-JZND3VTD.js";import"../chunk-DYKUDQHN.js";import"../chunk-E4YGB4FA.js";import"../chunk-P4WGXM62.js";import"../chunk-N5NFW233.js";import"../chunk-L4NF3W25.js";import"../chunk-NP4EEY2K.js";import"../chunk-JDCMXEEN.js";import"../chunk-GW4NARR6.js";import"../chunk-LIPHC4AO.js";export{d as IatConnection,a as IatOption,c as IatResponse,b as IatResponseDataStatus}; | ||
import"../chunk-E5GULNMT.js";import"../chunk-D55QM667.js";import{a as d}from"../chunk-A7HV3EZ7.js";import{a}from"../chunk-EQKNTHBH.js";import{a as b,b as c}from"../chunk-TE2IHAKM.js";import"../chunk-JZND3VTD.js";import"../chunk-SE6DDARR.js";import"../chunk-W4BRMK4G.js";import"../chunk-7ZEMB3HS.js";import"../chunk-N5NFW233.js";import"../chunk-IMAYVM2Y.js";import"../chunk-NP4EEY2K.js";import"../chunk-JDCMXEEN.js";import"../chunk-DYKUDQHN.js";import"../chunk-GW4NARR6.js";import"../chunk-LIPHC4AO.js";export{d as IatConnection,a as IatOption,c as IatResponse,b as IatResponseDataStatus}; |
@@ -14,2 +14,7 @@ export { ApiConnection } from './api/connection.js'; | ||
export { IatResponse, IatResponseData, IatResponseDataStatus, IatResponseResult, IatResponseResultWord, IatResponseResultWordContent } from './iat/response.js'; | ||
export { chuckDelay, chuckLength } from './utils/const.js'; | ||
export { resample } from './utils/resample.js'; | ||
export { splitInChunks } from './utils/splitInChunks.js'; | ||
export { from16BitPCM, to16BitPCM } from './utils/to16BitPCM.js'; | ||
export { toBase64 } from './utils/toBase64.js'; | ||
import 'rxjs'; |
@@ -1,1 +0,1 @@ | ||
import"./chunk-DGPTPROM.js";import{a as x}from"./chunk-KRWZA47M.js";import{a as p,b as t}from"./chunk-AC2MBQTL.js";import{a as m}from"./chunk-HMTOY2UQ.js";import"./chunk-BSEC2ZXW.js";import"./chunk-E5GULNMT.js";import{a as d}from"./chunk-I7AXM2CI.js";import{a}from"./chunk-EQKNTHBH.js";import"./chunk-D55QM667.js";import{a as b,b as c}from"./chunk-TE2IHAKM.js";import"./chunk-JZND3VTD.js";import"./chunk-DYKUDQHN.js";import{a as f}from"./chunk-E4YGB4FA.js";import"./chunk-P4WGXM62.js";import"./chunk-N5NFW233.js";import"./chunk-L4NF3W25.js";import"./chunk-NP4EEY2K.js";import{a as r}from"./chunk-JDCMXEEN.js";import{a as e}from"./chunk-GW4NARR6.js";import{a as o}from"./chunk-LIPHC4AO.js";export{f as ApiConnection,o as ApiConnectionStatus,r as ApiOption,e as ApiResponse,d as IatConnection,a as IatOption,c as IatResponse,b as IatResponseDataStatus,x as IseConnection,m as IseOption,t as IseResponse,p as IseResponseDataStatus}; | ||
import"./chunk-E5GULNMT.js";import"./chunk-D55QM667.js";import"./chunk-DGPTPROM.js";import{a as i}from"./chunk-CF2WP2BS.js";import{a as g,b as h}from"./chunk-AC2MBQTL.js";import{a as d}from"./chunk-HMTOY2UQ.js";import"./chunk-BSEC2ZXW.js";import{a as n}from"./chunk-A7HV3EZ7.js";import{a as j}from"./chunk-EQKNTHBH.js";import{a as k,b as l}from"./chunk-TE2IHAKM.js";import"./chunk-JZND3VTD.js";import{a as c}from"./chunk-SE6DDARR.js";import{a,b}from"./chunk-W4BRMK4G.js";import{a as o}from"./chunk-7ZEMB3HS.js";import{a as f}from"./chunk-N5NFW233.js";import{a as r,b as e}from"./chunk-IMAYVM2Y.js";import{a as x}from"./chunk-NP4EEY2K.js";import{a as p}from"./chunk-JDCMXEEN.js";import"./chunk-DYKUDQHN.js";import{a as t}from"./chunk-GW4NARR6.js";import{a as m}from"./chunk-LIPHC4AO.js";export{c as ApiConnection,m as ApiConnectionStatus,p as ApiOption,t as ApiResponse,n as IatConnection,j as IatOption,l as IatResponse,k as IatResponseDataStatus,i as IseConnection,d as IseOption,h as IseResponse,g as IseResponseDataStatus,b as chuckDelay,a as chuckLength,e as from16BitPCM,o as resample,f as splitInChunks,r as to16BitPCM,x as toBase64}; |
@@ -1,1 +0,1 @@ | ||
import{a}from"../chunk-KRWZA47M.js";import"../chunk-AC2MBQTL.js";import"../chunk-HMTOY2UQ.js";import"../chunk-JZND3VTD.js";import"../chunk-DYKUDQHN.js";import"../chunk-E4YGB4FA.js";import"../chunk-P4WGXM62.js";import"../chunk-N5NFW233.js";import"../chunk-L4NF3W25.js";import"../chunk-NP4EEY2K.js";import"../chunk-JDCMXEEN.js";import"../chunk-GW4NARR6.js";import"../chunk-LIPHC4AO.js";export{a as IseConnection}; | ||
import{a}from"../chunk-CF2WP2BS.js";import"../chunk-AC2MBQTL.js";import"../chunk-HMTOY2UQ.js";import"../chunk-JZND3VTD.js";import"../chunk-SE6DDARR.js";import"../chunk-W4BRMK4G.js";import"../chunk-7ZEMB3HS.js";import"../chunk-N5NFW233.js";import"../chunk-IMAYVM2Y.js";import"../chunk-NP4EEY2K.js";import"../chunk-JDCMXEEN.js";import"../chunk-DYKUDQHN.js";import"../chunk-GW4NARR6.js";import"../chunk-LIPHC4AO.js";export{a as IseConnection}; |
@@ -1,1 +0,1 @@ | ||
import"../chunk-DGPTPROM.js";import{a as d}from"../chunk-KRWZA47M.js";import{a as b,b as c}from"../chunk-AC2MBQTL.js";import{a}from"../chunk-HMTOY2UQ.js";import"../chunk-BSEC2ZXW.js";import"../chunk-JZND3VTD.js";import"../chunk-DYKUDQHN.js";import"../chunk-E4YGB4FA.js";import"../chunk-P4WGXM62.js";import"../chunk-N5NFW233.js";import"../chunk-L4NF3W25.js";import"../chunk-NP4EEY2K.js";import"../chunk-JDCMXEEN.js";import"../chunk-GW4NARR6.js";import"../chunk-LIPHC4AO.js";export{d as IseConnection,a as IseOption,c as IseResponse,b as IseResponseDataStatus}; | ||
import"../chunk-DGPTPROM.js";import{a as d}from"../chunk-CF2WP2BS.js";import{a as b,b as c}from"../chunk-AC2MBQTL.js";import{a}from"../chunk-HMTOY2UQ.js";import"../chunk-BSEC2ZXW.js";import"../chunk-JZND3VTD.js";import"../chunk-SE6DDARR.js";import"../chunk-W4BRMK4G.js";import"../chunk-7ZEMB3HS.js";import"../chunk-N5NFW233.js";import"../chunk-IMAYVM2Y.js";import"../chunk-NP4EEY2K.js";import"../chunk-JDCMXEEN.js";import"../chunk-DYKUDQHN.js";import"../chunk-GW4NARR6.js";import"../chunk-LIPHC4AO.js";export{d as IseConnection,a as IseOption,c as IseResponse,b as IseResponseDataStatus}; |
@@ -1,1 +0,1 @@ | ||
import{a}from"../chunk-P4WGXM62.js";export{a as resample}; | ||
import{a}from"../chunk-7ZEMB3HS.js";export{a as resample}; |
declare const to16BitPCM: (input: Float32Array) => Uint8Array; | ||
declare const from16BitPCM: (input: Uint8Array) => Float32Array; | ||
export { to16BitPCM }; | ||
export { from16BitPCM, to16BitPCM }; |
@@ -1,1 +0,1 @@ | ||
import{a}from"../chunk-L4NF3W25.js";export{a as to16BitPCM}; | ||
import{a,b}from"../chunk-IMAYVM2Y.js";export{b as from16BitPCM,a as to16BitPCM}; |
{ | ||
"name": "xfyun-client", | ||
"version": "1.0.0", | ||
"version": "1.1.0", | ||
"description": "", | ||
@@ -41,3 +41,3 @@ "author": "Arumi Sakura", | ||
"tsup": "^6.7.0", | ||
"typescript": "^5.0.4" | ||
"typescript": "5.1" | ||
}, | ||
@@ -44,0 +44,0 @@ "files": [ |
@@ -1,2 +0,2 @@ | ||
import { BehaviorSubject, concatMap, delay, delayWhen, filter, finalize, firstValueFrom, of, Subject } from 'rxjs'; | ||
import { BehaviorSubject, concatMap, delay, delayWhen, filter, finalize, firstValueFrom, Observable, of, Subject } from 'rxjs'; | ||
import { resample } from '../utils/resample'; | ||
@@ -10,6 +10,4 @@ import { to16BitPCM } from '../utils/to16BitPCM'; | ||
import { toBase64 } from '../utils/toBase64'; | ||
import { chuckLength, chuckDelay } from '../utils/const'; | ||
const chuckLength = 1280; | ||
const chuckDelay = 40; | ||
export class ApiConnection<O extends ApiOption = ApiOption, Req extends ApiRequest = ApiRequest, Res extends ApiResponse = ApiResponse> { | ||
@@ -21,4 +19,13 @@ protected option: O; | ||
protected $status = new BehaviorSubject<ApiConnectionStatus>(ApiConnectionStatus.null); | ||
/** | ||
* A stream of 16 bit PCM data. | ||
*/ | ||
protected $audio = new Subject<Uint8Array>(); | ||
/** | ||
* A stream of 16 bit PCM data chunked into `chuckLength` and seperated temporally by `chuckDelay`. | ||
*/ | ||
protected $chunked: Observable<Uint8Array>; | ||
protected Option(): O { | ||
@@ -35,13 +42,13 @@ return new ApiOption() as O; | ||
this.$audio | ||
.pipe( | ||
delayWhen(() => this.$status.pipe(filter((status) => status === ApiConnectionStatus.ready || status === ApiConnectionStatus.ing))), | ||
splitInChunks(chuckLength), | ||
concatMap((x) => of(x).pipe(delay(chuckDelay))), | ||
finalize(() => this.sendEnd()), | ||
) | ||
.subscribe((buffer) => this.sendAudio(buffer)); | ||
this.$chunked = this.$audio.pipe( | ||
delayWhen(() => this.$status.pipe(filter((status) => status === ApiConnectionStatus.ready || status === ApiConnectionStatus.ing))), | ||
splitInChunks(chuckLength), | ||
concatMap((x) => of(x).pipe(delay(chuckDelay))), | ||
finalize(() => this.sendEnd()), | ||
); | ||
this.$chunked.subscribe((buffer) => this.sendAudio(buffer)); | ||
} | ||
protected setStatus(status: ApiConnectionStatus) { | ||
protected setStatus(status: ApiConnectionStatus): void { | ||
if (this.$status.value !== status) { | ||
@@ -52,11 +59,25 @@ this.$status.next(status); | ||
getStatus() { | ||
getSid(): string { | ||
return this.sid; | ||
} | ||
getStatus(): Observable<ApiConnectionStatus> { | ||
return this.$status.asObservable(); | ||
} | ||
getSid() { | ||
return this.sid; | ||
/** | ||
* @returns the {@link $audio} | ||
*/ | ||
getAudio(): Observable<Uint8Array> { | ||
return this.$audio.asObservable(); | ||
} | ||
async sendAudioBuffer(audioBuffer: AudioBuffer) { | ||
/** | ||
* @returns the {@link $chunked} | ||
*/ | ||
getChunked(): Observable<Uint8Array> { | ||
return this.$chunked; | ||
} | ||
async sendAudioBuffer(audioBuffer: AudioBuffer): Promise<void> { | ||
const sourceBuffer = audioBuffer.getChannelData(0); | ||
@@ -67,3 +88,3 @@ | ||
async sendBuffer(sourceBuffer: Float32Array, sampleRate: number) { | ||
async sendBuffer(sourceBuffer: Float32Array, sampleRate: number): Promise<void> { | ||
const buffer = resample(sourceBuffer, sampleRate, this.option.sampleRate); | ||
@@ -74,3 +95,3 @@ | ||
async send16kBuffer(buffer: Float32Array) { | ||
async send16kBuffer(buffer: Float32Array): Promise<void> { | ||
this.$audio.next(to16BitPCM(buffer)); | ||
@@ -81,3 +102,3 @@ | ||
async complete() { | ||
async complete(): Promise<Res> { | ||
this.$audio.complete(); | ||
@@ -89,3 +110,3 @@ await firstValueFrom(this.$status.pipe(filter((status) => status === ApiConnectionStatus.result))); | ||
async connect() { | ||
async connect(): Promise<void> { | ||
if (this.option.test) { | ||
@@ -148,7 +169,7 @@ this.setStatus(ApiConnectionStatus.init); | ||
protected sendRequest(request: Req) { | ||
protected sendRequest(request: Req): void { | ||
this.webSocket.send(JSON.stringify(request)); | ||
} | ||
protected sendAudio(audioChunk: Uint8Array) { | ||
protected sendAudio(audioChunk: Uint8Array): void { | ||
const data = toBase64(audioChunk); | ||
@@ -169,3 +190,3 @@ if (this.$status.value === ApiConnectionStatus.ready) { | ||
protected sendEnd() { | ||
protected sendEnd(): void { | ||
if (!this.option.test) { | ||
@@ -195,3 +216,3 @@ const wrapped = this.wrapEnd(); | ||
protected setResponse(response: Res) { | ||
protected setResponse(response: Res): void { | ||
if (response) { | ||
@@ -218,5 +239,5 @@ if (this.sid === '') { | ||
getResponse() { | ||
getResponse(): Res { | ||
return this.response; | ||
} | ||
} |
@@ -5,8 +5,8 @@ export class ApiResponse { | ||
isSuccess() { | ||
isSuccess(): boolean { | ||
return true; | ||
} | ||
isEnd() { | ||
isEnd(): boolean { | ||
return true; | ||
} | ||
} |
export * from './api'; | ||
export * from './ise'; | ||
export * from './iat'; | ||
export * from './utils/const'; | ||
export * from './utils/resample'; | ||
export * from './utils/splitInChunks'; | ||
export * from './utils/to16BitPCM'; | ||
export * from './utils/toBase64'; |
@@ -1,2 +0,2 @@ | ||
export const resample = (sourceBuffer: Float32Array, sampleRate: number, newSampleRate: number) => { | ||
export const resample = (sourceBuffer: Float32Array, sampleRate: number, newSampleRate: number): Float32Array => { | ||
const data = new Float32Array(sourceBuffer); | ||
@@ -3,0 +3,0 @@ const fitCount = Math.round(data.length * (newSampleRate / sampleRate)); |
@@ -1,2 +0,2 @@ | ||
import { to16BitPCM } from './to16BitPCM'; | ||
import { from16BitPCM, to16BitPCM } from './to16BitPCM'; | ||
@@ -11,1 +11,10 @@ describe('to16BitPCM', () => { | ||
}); | ||
describe('from16BitPCM', () => { | ||
it('should convert 16 bit PCM formatted Uint8Array to Float32Array', () => { | ||
const input = new Uint8Array([0xff, 0x7f, 0x00, 0xc0, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x80]); | ||
const expected = new Float32Array([1.0, -0.5, 0, 0.4999847412109375, -1.0]); // the convertion is inherently imperfect. | ||
expect(from16BitPCM(input)).toStrictEqual(expected); | ||
}); | ||
}); |
export const to16BitPCM = (input: Float32Array): Uint8Array => { | ||
const dataLength = input.length * (16 / 8); | ||
const dataLength = input.length * 2; | ||
const dataBuffer = new ArrayBuffer(dataLength); | ||
@@ -12,1 +12,14 @@ const dataView = new DataView(dataBuffer); | ||
}; | ||
export const from16BitPCM = (input: Uint8Array): Float32Array => { | ||
const inputView = new DataView(input.buffer); | ||
const dataLength = input.length * 2; | ||
const dataBuffer = new ArrayBuffer(dataLength); | ||
const dataView = new DataView(dataBuffer); | ||
let offset = 0; | ||
for (let i = 0; i < input.length; i += 2, offset += 4) { | ||
const s = inputView.getInt16(i, true); | ||
dataView.setFloat32(offset, s < 0 ? s / 0x8000 : s / 0x7fff, true); | ||
} | ||
return new Float32Array(dataView.buffer); | ||
}; |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Minified code
QualityThis package contains minified code. This may be harmless in some cases where minified code is included in packaged libraries, however packages on npm should not minify code.
Found 5 instances in 1 package
Minified code
QualityThis package contains minified code. This may be harmless in some cases where minified code is included in packaged libraries, however packages on npm should not minify code.
Found 4 instances in 1 package
84437
139
1486
12