@minto-ai/huoshan-tts
Version:
借助“火山引擎在线语音合成API”实现浏览器端“文本转语音
59 lines (52 loc) • 1.74 kB
text/typescript
import type { ParallelTaskExecuteContext } from '../../handler'
import { ParallelHandler } from '../../handler'
class DecodeData extends ParallelHandler<string, AudioBuffer> {
private audioContext: AudioContext = new AudioContext()
/**
* 执行音频解码任务
* @param context - 并行任务执行上下文
*/
public execute(
context: ParallelTaskExecuteContext<string, AudioBuffer>,
): void {
if (context.isLastExecute) {
this.taskCompletedCallback(context.taskItem.uuid)
return
}
if (!context.taskItem.original) {
this.taskCompletedCallback(context.taskItem.uuid)
return
}
fetch(context.taskItem.original)
.then((response) => {
return response.arrayBuffer()
})
.then((arrayBuffer) => {
this.audioContext.decodeAudioData(
arrayBuffer,
(audioData) => {
this.forwardToHandler(audioData)
this.taskCompletedCallback(context.taskItem.uuid)
},
(error) => {
console.error('音频解码失败:', error)
this.executeController?.$bus.emit('_appError', error)
this.taskCompletedCallback(context.taskItem.uuid)
},
)
})
.catch((error) => {
console.error('获取音频数据失败:', error)
this.executeController?.$bus.emit('_appError', error)
this.taskCompletedCallback(context.taskItem.uuid)
})
}
protected onFinish(): void {
if (this.audioContext) {
this.audioContext.suspend()
this.audioContext.close()
}
this.executeController?.$bus.emit('_decodeDataFinish')
}
}
export default DecodeData