mirror of
https://github.com/ggerganov/whisper.cpp.git
synced 2024-12-18 20:27:53 +00:00
0463028bc2
* whisper : check state->ctx_metal not null * whisper : add whisper_context_params { use_gpu } * whisper : new API with params & deprecate old API * examples : use no-gpu param && whisper_init_from_file_with_params * whisper.objc : enable metal & disable on simulator * whisper.swiftui, metal : enable metal & support load default.metallib * whisper.android : use new API * bindings : use new API * addon.node : fix build & test * bindings : updata java binding * bindings : add missing whisper_context_default_params_by_ref WHISPER_API for java * metal : use SWIFTPM_MODULE_BUNDLE for GGML_SWIFT and reuse library load * metal : move bundle var into block * metal : use SWIFT_PACKAGE instead of GGML_SWIFT * style : minor updates --------- Co-authored-by: Georgi Gerganov <ggerganov@gmail.com>
94 lines
3.0 KiB
C++
94 lines
3.0 KiB
C++
//
|
|
// This is the Javascript API of whisper.cpp
|
|
//
|
|
// Very crude at the moment.
|
|
// Feel free to contribute and make this better!
|
|
//
|
|
// See the tests/test-whisper.js for sample usage
|
|
//
|
|
|
|
#include "whisper.h"
|
|
|
|
#include <emscripten.h>
|
|
#include <emscripten/bind.h>
|
|
|
|
#include <thread>
|
|
#include <vector>
|
|
|
|
struct whisper_context * g_context;
|
|
|
|
EMSCRIPTEN_BINDINGS(whisper) {
|
|
emscripten::function("init", emscripten::optional_override([](const std::string & path_model) {
|
|
if (g_context == nullptr) {
|
|
g_context = whisper_init_from_file_with_params(path_model.c_str(), whisper_context_default_params());
|
|
if (g_context != nullptr) {
|
|
return true;
|
|
} else {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}));
|
|
|
|
emscripten::function("free", emscripten::optional_override([]() {
|
|
if (g_context) {
|
|
whisper_free(g_context);
|
|
g_context = nullptr;
|
|
}
|
|
}));
|
|
|
|
emscripten::function("full_default", emscripten::optional_override([](const emscripten::val & audio, const std::string & lang, bool translate) {
|
|
if (g_context == nullptr) {
|
|
return -1;
|
|
}
|
|
|
|
struct whisper_full_params params = whisper_full_default_params(whisper_sampling_strategy::WHISPER_SAMPLING_GREEDY);
|
|
|
|
params.print_realtime = true;
|
|
params.print_progress = false;
|
|
params.print_timestamps = true;
|
|
params.print_special = false;
|
|
params.translate = translate;
|
|
params.language = whisper_is_multilingual(g_context) ? lang.c_str() : "en";
|
|
params.n_threads = std::min(8, (int) std::thread::hardware_concurrency());
|
|
params.offset_ms = 0;
|
|
|
|
std::vector<float> pcmf32;
|
|
const int n = audio["length"].as<int>();
|
|
|
|
emscripten::val heap = emscripten::val::module_property("HEAPU8");
|
|
emscripten::val memory = heap["buffer"];
|
|
|
|
pcmf32.resize(n);
|
|
|
|
emscripten::val memoryView = audio["constructor"].new_(memory, reinterpret_cast<uintptr_t>(pcmf32.data()), n);
|
|
memoryView.call<void>("set", audio);
|
|
|
|
// print system information
|
|
{
|
|
printf("\n");
|
|
printf("system_info: n_threads = %d / %d | %s\n",
|
|
params.n_threads, std::thread::hardware_concurrency(), whisper_print_system_info());
|
|
|
|
printf("\n");
|
|
printf("%s: processing %d samples, %.1f sec, %d threads, %d processors, lang = %s, task = %s ...\n",
|
|
__func__, int(pcmf32.size()), float(pcmf32.size())/WHISPER_SAMPLE_RATE,
|
|
params.n_threads, 1,
|
|
params.language,
|
|
params.translate ? "translate" : "transcribe");
|
|
|
|
printf("\n");
|
|
}
|
|
|
|
// run whisper
|
|
{
|
|
whisper_reset_timings(g_context);
|
|
whisper_full(g_context, params, pcmf32.data(), pcmf32.size());
|
|
whisper_print_timings(g_context);
|
|
}
|
|
|
|
return 0;
|
|
}));
|
|
}
|