whisper_flutter_new/lib/download_model.dart
小草林(田梓萱) af91fc48cb
feat: publish v1.0.1
Signed-off-by: 小草林(田梓萱) <xcl@xuegao-tzx.top>
2024-06-12 10:31:01 +08:00

88 lines
2.0 KiB
Dart

/*
* Copyright (c) 田梓萱[小草林] 2021-2024.
* All Rights Reserved.
* All codes are protected by China's regulations on the protection of computer software, and infringement must be investigated.
* 版权所有 (c) 田梓萱[小草林] 2021-2024.
* 所有代码均受中国《计算机软件保护条例》保护,侵权必究.
*/
import "dart:io";
import "package:flutter/foundation.dart";
/// Available whisper models
enum WhisperModel {
// no model
none(""),
/// tiny model for all languages
tiny("tiny"),
/// base model for all languages
base("base"),
/// small model for all languages
small("small"),
/// medium model for all languages
medium("medium"),
/// large model for all languages
largeV1("large-v1"),
largeV2("large-v2");
const WhisperModel(this.modelName);
/// Public name of model
final String modelName;
/// Get local path of model file
String getPath(String dir) {
return "$dir/ggml-$modelName.bin";
}
}
/// Download [model] to [destinationPath]
Future<String> downloadModel(
{required WhisperModel model,
required String destinationPath,
String? downloadHost}) async {
if (kDebugMode) {
debugPrint("Download model ${model.modelName}");
}
final httpClient = HttpClient();
Uri modelUri;
if (downloadHost == null || downloadHost.isEmpty) {
/// Huggingface url to download model
modelUri = Uri.parse(
"https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-${model.modelName}.bin",
);
} else {
modelUri = Uri.parse(
"$downloadHost/ggml-${model.modelName}.bin",
);
}
final request = await httpClient.getUrl(
modelUri,
);
final response = await request.close();
final file = File("$destinationPath/ggml-${model.modelName}.bin");
final raf = file.openSync(mode: FileMode.write);
await for (var chunk in response) {
raf.writeFromSync(chunk);
}
await raf.close();
if (kDebugMode) {
debugPrint("Download Down . Path = ${file.path}");
}
return file.path;
}