{"id":18651298,"url":"https://github.com/julienvincent/whalker","last_synced_at":"2025-10-19T07:28:30.192Z","repository":{"id":210405641,"uuid":"725696259","full_name":"julienvincent/whalker","owner":"julienvincent","description":"Whisper talker","archived":false,"fork":false,"pushed_at":"2023-12-02T14:31:05.000Z","size":24,"stargazers_count":4,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-05-09T01:37:27.669Z","etag":null,"topics":["whisper","whisper-ai","whisper-cpp"],"latest_commit_sha":null,"homepage":"","language":"Clojure","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/julienvincent.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2023-11-30T17:23:30.000Z","updated_at":"2023-12-04T18:17:35.000Z","dependencies_parsed_at":"2023-12-02T15:39:04.329Z","dependency_job_id":null,"html_url":"https://github.com/julienvincent/whalker","commit_stats":null,"previous_names":["julienvincent/whalker"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/julienvincent/whalker","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/julienvincent%2Fwhalker","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/julienvincent%2Fwhalker/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/julienvincent%2Fwhalker/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/julienvincent%2Fwhalker/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/julienvincent","download_url":"https://codeload.github.com/julienvincent/whalker/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/julienvincent%2Fwhalker/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":269090246,"owners_count":24358225,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-06T02:00:09.910Z","response_time":99,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["whisper","whisper-ai","whisper-cpp"],"created_at":"2024-11-07T06:49:18.114Z","updated_at":"2025-10-19T07:28:30.085Z","avatar_url":"https://github.com/julienvincent.png","language":"Clojure","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Whalker\n\nThis is a small wrapper around [whisper.cpp](https://github.com/ggerganov/whisper.cpp) that enabled an easy to use way of transcribing mic audio on the fly. This is done by registering a global keybinding which, when pressed, starts recording mic audio. When the keybinding is released the audio is transcribed using whisper and the transcribed audio is placed into the system clipboard.\n\n## Usage\n\nThis tool requires that you download whisper ml models separately. This was tested on the models provided by `whisper.cpp` - head to [the whisper.cpp model docs](https://github.com/ggerganov/whisper.cpp/tree/master/models) for instructions on how to download them.\n\nOnce you have an appropriate whisper ml model on your machine you can proceed to downloading the whalker jar from the [releases page](https://github.com/julienvincent/whalker/releases) and then run:\n\n```bash\njava -jar whalker.jar --model-path=/path/to/downloaded/model.bin --chord Ctrl+Shift+1\n```\n\nNative binaries will eventually be made available one I can figure out how to get JNI working with GraalVM.\n\n## Configuration\n\nYou can configure the tool with cli args or with a `config.edn` file. By default the tool will look for a `config.edn` file in the current working directory or this can be changed by specifying `--config=/path/to/config.edn`.\n\nThe config file looks as follows:\n\n```clj\n{:model-path \"/path/to/ggml-large-v3.bin\"\n\n ; Or using key text - #{\"Ctrl\" \"Shift\" \"1\"}\n :chord #{55 10}}\n```\n\nAny key in the config file can be used as a cli flag. For example `--chord` and `--model-path` can be given as cli args.\n\n### Chords\n\nWhen specifying key chords it is recommended to use the numeric key codes like `59+56+18` instead of the textual codes like `Ctrl+Shift+1` because there is some bug either in the keylogger lib I am using or in my usage of it that causes the textual codes to be unstable.\n\nTo find the raw numeric keycodes that you can use you can run the jar in keylogger mode by adding the flag `--keylogger`.\n\n```bash\njava -jar whalker.jar --keylogger\n```\n\nThis will print out to console every keypress. You can then press the keys you are wanting to use and see what their raw keycodes are.\n\n---\n\n## Using the GPU\n\nThis tool uses by default a pre-built version of libwhisper that comes bundled with the [io.github.givimad/whisper-jni](https://github.com/GiviMAD/whisper-jni) module. This pre-built version of libwhisper does not come with GPU support included which means the model executes on the CPU and the transcription will be painfully slow.\n\nTo speed things up it is recommended to build the [whisper.cpp](https://github.com/ggerganov/whisper.cpp) binaries yourself and configure whalker to use the locally built versions. This might sound daunting but the `whisper.cpp` homepage has pretty good docs on how to do all this and it's really straight forward.\n\nWhen it comes to configuring whalker there are essentially two strategies:\n\n### 1. Use the bin transcriber\n\nThis will shell out to the whisper.cpp executable binary for transcription. It's simpler to configure but a bit slower to execute.\n\nMake sure you have built the executable in your local clone of `whisper.cpp`:\n\n```bash\nmake main\n```\n\nThen use the following config:\n\n```clj\n{...\n :transcriber :bin\n :bin-path \"/path/to/whisper.cpp/main\"\n ...}\n```\n\n### 1. Use the jni transcriber\n\nThis uses the same JNI native interface as the default whalker configuration with the exception that it will load `libwhisper.so` from your local build of whisper.cpp\n\nFirst of all make sure you have compiled libwhisper in whisper.cpp:\n\n```bash\n# Run this in your local clone of `whisper.cpp`\nmake libwhisper.so\n```\n\nThen use the following config:\n\n```clj\n{...\n :transcriber :jni\n :lib-path \"/path/to/whisper.cpp/libwhisper.so\"\n ...}\n```\n\n\u003e [!NOTE]\n\u003e\n\u003e On MacOS (and maybe other platforms?) the CPU support is provided by a separately built `ggml-metal.metal` binary. This binary needs to be in the CWD of wherever you execute `whalker.jar` from or else this will not load.\n\u003e\n\u003e You can copy the binary as-is to wherever you are running `whalker.jar` from.\n\u003e\n\u003e This is a limitation in how `whisper-jni` loads `libwhisper.so` and will hopefully be solved upstream at some point.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjulienvincent%2Fwhalker","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjulienvincent%2Fwhalker","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjulienvincent%2Fwhalker/lists"}