diff --git a/src/onebot/action/file/GetRecord.ts b/src/onebot/action/file/GetRecord.ts index 4e9e69b0..05288c20 100644 --- a/src/onebot/action/file/GetRecord.ts +++ b/src/onebot/action/file/GetRecord.ts @@ -2,7 +2,7 @@ import { GetFileBase, GetFilePayload, GetFileResponse } from './GetFile'; import { ActionName } from '../types'; import { spawn } from 'node:child_process'; import { promises as fs } from 'fs'; - +import { decode } from 'silk-wasm'; const FFMPEG_PATH = process.env.FFMPEG_PATH || 'ffmpeg'; interface Payload extends GetFilePayload { @@ -16,25 +16,39 @@ export default class GetRecord extends GetFileBase { const res = await super._handle(payload); if (payload.out_format && typeof payload.out_format === 'string') { const inputFile = res.file; - const outputFile = `${inputFile}.${payload.out_format}`; if (!inputFile) throw new Error('file not found'); + const pcmFile = `${inputFile}.pcm`; + const outputFile = `${inputFile}.${payload.out_format}`; try { await fs.access(inputFile); - await this.convertFile(inputFile, outputFile, payload.out_format); + await this.decodeFile(inputFile, pcmFile); + await this.convertFile(pcmFile, outputFile, payload.out_format); const base64Data = await fs.readFile(outputFile, { encoding: 'base64' }); res.file = outputFile; res.url = outputFile; res.base64 = base64Data; } catch (error) { console.error('Error processing file:', error); + throw error; // 重新抛出错误以便调用者可以处理 } } return res; } + private async decodeFile(inputFile: string, outputFile: string): Promise { + try { + const inputData = await fs.readFile(inputFile); + const decodedData = await decode(inputData, 24000); + await fs.writeFile(outputFile, Buffer.from(decodedData.data)); + } catch (error) { + console.error('Error decoding file:', error); + throw error; // 重新抛出错误以便调用者可以处理 + } + } + private convertFile(inputFile: string, outputFile: string, format: string): Promise { return new Promise((resolve, reject) => { - const ffmpeg = spawn(FFMPEG_PATH, ['-i', inputFile, outputFile]); + const ffmpeg = spawn(FFMPEG_PATH, ['-f', 's16le', '-ar', '24000', '-ac', '1', '-i', inputFile, outputFile]); ffmpeg.on('close', (code) => { if (code === 0) { diff --git a/src/onebot/api/msg.ts b/src/onebot/api/msg.ts index 25073258..77917d04 100644 --- a/src/onebot/api/msg.ts +++ b/src/onebot/api/msg.ts @@ -696,8 +696,9 @@ export class OneBotMsgApi { resMsg.sub_type = 'group'; const ret = await this.core.apis.MsgApi.getTempChatInfo(ChatType.KCHATTYPETEMPC2CFROMGROUP, msg.senderUid); if (ret.result === 0) { + let member = await this.core.apis.GroupApi.getGroupMember(msg.peerUin, msg.senderUin); resMsg.group_id = parseInt(ret.tmpChatInfo!.groupCode); - resMsg.sender.nickname = ret.tmpChatInfo!.fromNick; + resMsg.sender.nickname = member?.nick ?? member?.cardName ?? '临时会话'; resMsg.temp_source = resMsg.group_id; } else { resMsg.group_id = 284840486; //兜底数据