fix: silk duration

This commit is contained in:
linyuchen 2024-03-20 22:47:24 +08:00
parent 560428a5f9
commit fdc23d7721
2 changed files with 23 additions and 13 deletions

View File

@ -11,7 +11,6 @@ import {getConfigUtil} from "../config";
import {dbUtil} from "../db"; import {dbUtil} from "../db";
import * as fileType from "file-type"; import * as fileType from "file-type";
import {net} from "electron"; import {net} from "electron";
import config from "../../../electron.vite.config";
export function isGIF(path: string) { export function isGIF(path: string) {
@ -68,8 +67,6 @@ export async function file2base64(path: string) {
} }
export async function encodeSilk(filePath: string) { export async function encodeSilk(filePath: string) {
const fsp = require("fs").promises
function getFileHeader(filePath: string) { function getFileHeader(filePath: string) {
// 定义要读取的字节数 // 定义要读取的字节数
const bytesToRead = 7; const bytesToRead = 7;
@ -91,6 +88,21 @@ export async function encodeSilk(filePath: string) {
return isWav(fs.readFileSync(filePath)); return isWav(fs.readFileSync(filePath));
} }
async function guessDuration(pttPath: string){
const pttFileInfo = await fsPromise.stat(pttPath)
let duration = pttFileInfo.size / 1024 / 3 // 3kb/s
duration = Math.floor(duration)
duration = Math.max(1, duration)
log(`语音文件${filePath}转换成功!`, pttPath, `通过文件大小估算的时长:`, duration)
return duration
}
function verifyDuration(oriDuration: number, guessDuration: number){
if (oriDuration - guessDuration > 10){
return guessDuration
}
return oriDuration
}
// async function getAudioSampleRate(filePath: string) { // async function getAudioSampleRate(filePath: string) {
// try { // try {
// const mm = await import('music-metadata'); // const mm = await import('music-metadata');
@ -135,27 +147,25 @@ export async function encodeSilk(filePath: string) {
// const sampleRate = await getAudioSampleRate(filePath) || 0; // const sampleRate = await getAudioSampleRate(filePath) || 0;
// log("音频采样率", sampleRate) // log("音频采样率", sampleRate)
const pcm = fs.readFileSync(filePath); const pcm = fs.readFileSync(filePath);
const silk = await encode(pcm, 0); let silk = await encode(pcm, 0);
fs.writeFileSync(pttPath, silk.data); fs.writeFileSync(pttPath, silk.data);
fs.unlink(wavPath, (err) => { fs.unlink(wavPath, (err) => {
}); });
log(`语音文件${filePath}转换成功!`, pttPath, `时长:`, silk.duration) const duration = verifyDuration(silk.duration, await guessDuration(filePath))
return { return {
converted: true, converted: true,
path: pttPath, path: pttPath,
duration: silk.duration, duration
}; };
} else { } else {
const pcm = fs.readFileSync(filePath); const pcm = fs.readFileSync(filePath);
let duration = 0; let duration = 0;
const gDuration = await guessDuration(filePath)
try { try {
duration = getDuration(pcm); duration = verifyDuration(getDuration(pcm), gDuration);
} catch (e) { } catch (e) {
log("获取语音文件时长失败", filePath, e.stack) log("获取语音文件时长失败, 使用文件大小推测时长", filePath, e.stack)
duration = fs.statSync(filePath).size / 1024 / 3 // 每3kb大约1s duration = gDuration;
duration = Math.floor(duration)
duration = Math.max(1, duration)
log("使用文件大小估算时长", duration)
} }
return { return {

View File

@ -117,7 +117,7 @@ export function callNTQQApi<ReturnType>(params: NTQQApiParams) {
} }
const apiArgs = [methodName, ...args] const apiArgs = [methodName, ...args]
if (!cbCmd) { if (!cbCmd) {
// QQ后端会返回结果并且可以根据uuid识别 // QQ后端会返回结果并且可以根据uuid识别
hookApiCallbacks[uuid] = (r: ReturnType) => { hookApiCallbacks[uuid] = (r: ReturnType) => {
success = true success = true
resolve(r) resolve(r)