Skip to content

Commit

Permalink
fix(qq): fix audio encoding (#289)
Browse files Browse the repository at this point in the history
  • Loading branch information
idranme authored Jul 16, 2024
1 parent eebde78 commit 3bba22c
Showing 1 changed file with 6 additions and 5 deletions.
11 changes: 6 additions & 5 deletions adapters/qq/src/message.ts
Original file line number Diff line number Diff line change
Expand Up @@ -403,28 +403,29 @@ export class QQMessageEncoder<C extends Context = Context> extends MessageEncode
} else if (type === 'audio' && (attrs.src || attrs.url)) {
await this.flush()
const { data } = await this.bot.ctx.http.file(attrs.src || attrs.url, attrs)
if (data.slice(0, 7).toString().includes('#!SILK')) {
if (new TextDecoder().decode(data.slice(0, 7)).includes('#!SILK')) {
const onlineFile = await this.sendFile(type, {
src: `data:audio/amr;base64,` + Buffer.from(data).toString('base64'),
})
this.attachedFile = onlineFile
} else {
const silk = this.bot.ctx.get('silk')
if (!silk) return this.bot.logger.warn('missing silk service, cannot send non-silk audio')
if (silk.isWav(data)) {
const allowSampleRate = [8000, 12000, 16000, 24000, 32000, 44100, 48000]
if (silk.isWav(data) && allowSampleRate.includes(silk.getWavFileInfo(data).fmt.sampleRate)) {
const result = await silk.encode(data, 0)
const onlineFile = await this.sendFile(type, {
src: `data:audio/amr;base64,` + Buffer.from(result.data).toString('base64'),
})
if (onlineFile) this.attachedFile = onlineFile
} else {
if (!this.bot.ctx.get('ffmpeg')) return this.bot.logger.warn('missing ffmpeg service, cannot send non-silk audio except wav')
const wavBuf = await this.bot.ctx.get('ffmpeg')
if (!this.bot.ctx.get('ffmpeg')) return this.bot.logger.warn('missing ffmpeg service, cannot send non-silk audio except some wav')
const pcmBuf = await this.bot.ctx.get('ffmpeg')
.builder()
.input(Buffer.from(data))
.outputOption('-ar', '24000', '-ac', '1', '-f', 's16le')
.run('buffer')
const result = await silk.encode(wavBuf, 24000)
const result = await silk.encode(pcmBuf, 24000)
const onlineFile = await this.sendFile(type, {
src: `data:audio/amr;base64,` + Buffer.from(result.data).toString('base64'),
})
Expand Down

0 comments on commit 3bba22c

Please sign in to comment.