detemine root cause of download issue.
This commit is contained in:
@ -136,12 +136,32 @@ export function whisperFileExists(whisper_model : whisper_model_tag_t) {
|
||||
return target.exists
|
||||
}
|
||||
|
||||
export async function downloadWhisperModel(
|
||||
export type DownloadCallback = (arg0 : FileSystem.DownloadProgressData) => any;
|
||||
|
||||
async function updateModelSize(model_label : string, size : number) {
|
||||
const db = await getDb();
|
||||
const query = "INSERT OR REPLACE INTO whisper_models (model, bytes_total) VALUES (?, ?)"
|
||||
const stmt = db.prepareSync(query);
|
||||
stmt.executeSync(model_label, size);
|
||||
}
|
||||
|
||||
async function getExpectedModelSize(model_label : string) : Promise<number | undefined> {
|
||||
const db = await getDb();
|
||||
const query = "SELECT bytes_total FROM whisper_models WHERE model = ?"
|
||||
const stmt = db.prepareSync(query);
|
||||
const curs = stmt.executeSync(model_label);
|
||||
const row = curs.getFirstSync()
|
||||
return row ? row.bytes_total : undefined;
|
||||
}
|
||||
|
||||
export async function initiateWhisperDownload(
|
||||
whisper_model: whisper_model_tag_t,
|
||||
options: {
|
||||
force_redownload: boolean;
|
||||
force_redownload?: boolean;
|
||||
onDownload?: DownloadCallback | undefined;
|
||||
} = {
|
||||
force_redownload: false,
|
||||
onDownload: undefined,
|
||||
}
|
||||
) {
|
||||
|
||||
@ -161,34 +181,33 @@ export async function downloadWhisperModel(
|
||||
if (options.force_redownload) {
|
||||
whisperTarget.delete()
|
||||
} else {
|
||||
console.warn("Whisper model for %s already exists", whisper_model);
|
||||
return;
|
||||
const expected = await getExpectedModelSize(whisper_model);
|
||||
if (whisperTarget.size === expected) {
|
||||
console.warn("Whisper model for %s already exists", whisper_model);
|
||||
return undefined;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Initiate a new resumable download.
|
||||
const spec = WHISPER_MODELS[whisper_model];
|
||||
|
||||
console.log("Downloading %s", spec.source);
|
||||
|
||||
const resumable = FileSystem.createDownloadResumable(
|
||||
spec.source,
|
||||
whisperTarget.uri,
|
||||
undefined,
|
||||
{},
|
||||
// On each data write, update the whisper model download status.
|
||||
// Note that since createDownloadResumable callback only works in the foreground,
|
||||
// a background process will also be updating the file size.
|
||||
async (data) => {
|
||||
const db = await getDb();
|
||||
const args = [
|
||||
whisper_model,
|
||||
data.totalBytesWritten,
|
||||
data.totalBytesExpectedToWrite,
|
||||
];
|
||||
console.log("%s, %s of %s", whisper_model, data.totalBytesWritten, data.totalBytesExpectedToWrite);
|
||||
await db.runAsync(
|
||||
`INSERT OR REPLACE INTO whisper_models (model, bytes_done, bytes_remaining) VALUES (?, ?, ?)`,
|
||||
args
|
||||
);
|
||||
}
|
||||
console.log("%s: %d bytes of %d", whisperTarget.uri, data.totalBytesWritten, data.totalBytesExpectedToWrite);
|
||||
await updateModelSize(whisper_model, data.totalBytesExpectedToWrite)
|
||||
if (options.onDownload) await options.onDownload(data);
|
||||
},
|
||||
whisperTarget.exists ? whisperTarget.base64() : undefined,
|
||||
);
|
||||
|
||||
await resumable.downloadAsync();
|
||||
return resumable;
|
||||
}
|
Reference in New Issue
Block a user