mirror of
https://github.com/xzeldon/whisper-api-server.git
synced 2025-07-12 15:04:37 +03:00
Compare commits
4 Commits
Author | SHA1 | Date | |
---|---|---|---|
482616fb4c
|
|||
b36fe91b5c
|
|||
4078a17240
|
|||
aa93d79b38
|
28
README.md
28
README.md
@ -6,10 +6,17 @@ This API server enables audio transcription using the OpenAI Whisper models.
|
||||
|
||||
# Setup
|
||||
|
||||
- Download the desired model from [huggingface](https://huggingface.co/ggerganov/whisper.cpp/tree/main)
|
||||
- Update the model path in the `main.go` file
|
||||
- Download `Whisper.dll` from [github](https://github.com/Const-me/Whisper/releases/tag/1.12.0) (`Library.zip`) and place it in the project's root directory
|
||||
- Build project: `go build .` (you only need go compiler, without gcc)
|
||||
- Download `.exe` from [Releases](https://github.com/xzeldon/whisper-api-server/releases/latest)
|
||||
- Just run it!
|
||||
|
||||
# Build from source
|
||||
|
||||
Download the sources and use `go build`.
|
||||
For example, you can build using the following command:
|
||||
|
||||
```bash
|
||||
go build -ldflags "-s -w" -o server.exe main.go
|
||||
```
|
||||
|
||||
# Usage example
|
||||
|
||||
@ -29,12 +36,25 @@ Receive a response in JSON format:
|
||||
}
|
||||
```
|
||||
|
||||
# Usage with [Obsidian](https://obsidian.md/)
|
||||
|
||||
To integrate this with the [Obsidian voice recognotion plugin](https://github.com/nikdanilov/whisper-obsidian-plugin), follow these steps:
|
||||
|
||||
1. Open the plugin's settings.
|
||||
2. Set the following values:
|
||||
- API KEY: `sk-1`
|
||||
- API URL: `http://localhost:3000/v1/audio/transcriptions`
|
||||
- Model: `whisper-1`
|
||||
|
||||
# Roadmap
|
||||
|
||||
- [x] Implement automatic model downloading from [huggingface](https://huggingface.co/ggerganov/whisper.cpp/tree/main)
|
||||
- [x] Implement automatic `Whisper.dll` downloading from [Guthub releases](https://github.com/Const-me/Whisper/releases)
|
||||
- [x] Provide prebuilt binaries for Windows
|
||||
- [ ] Include instructions for running on Linux with Wine (likely possible).
|
||||
- [ ] Use flags to override the model path
|
||||
- [ ] Use flags to override the model type (when downloading the model)
|
||||
- [ ] Use flags to override the port
|
||||
|
||||
# Credits
|
||||
|
||||
|
2
go.mod
2
go.mod
@ -9,10 +9,12 @@ require (
|
||||
)
|
||||
|
||||
require (
|
||||
github.com/golang-jwt/jwt v3.2.2+incompatible // indirect
|
||||
github.com/mattn/go-runewidth v0.0.14 // indirect
|
||||
github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db // indirect
|
||||
github.com/rivo/uniseg v0.2.0 // indirect
|
||||
golang.org/x/term v0.10.0 // indirect
|
||||
golang.org/x/time v0.3.0 // indirect
|
||||
)
|
||||
|
||||
require (
|
||||
|
4
go.sum
4
go.sum
@ -1,6 +1,8 @@
|
||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY=
|
||||
github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I=
|
||||
github.com/k0kubun/go-ansi v0.0.0-20180517002512-3bf9e2903213/go.mod h1:vNUNkEQ1e29fT/6vq2aBdFsgNPmy8qMdSay1npru+Sw=
|
||||
github.com/labstack/echo/v4 v4.11.1 h1:dEpLU2FLg4UVmvCGPuk/APjlH6GDpbEPti61srUUUs4=
|
||||
github.com/labstack/echo/v4 v4.11.1/go.mod h1:YuYRTSM3CHs2ybfrL8Px48bO6BAnYIN4l8wSTMP6BDQ=
|
||||
@ -50,6 +52,8 @@ golang.org/x/term v0.10.0 h1:3R7pNqamzBraeqj/Tj8qt1aQ2HpmlC+Cx/qL/7hn4/c=
|
||||
golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o=
|
||||
golang.org/x/text v0.11.0 h1:LAntKIrcmeSKERyiOh0XMV39LXS8IE9UL2yP7+f5ij4=
|
||||
golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
|
||||
golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=
|
||||
golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
|
@ -22,9 +22,14 @@ func saveFormFile(name string, c echo.Context) (string, error) {
|
||||
}
|
||||
defer src.Close()
|
||||
|
||||
tmpDir, err := ensureDir("tmp")
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
ext := filepath.Ext(file.Filename)
|
||||
filename := time.Now().Format(time.RFC3339)
|
||||
filename = "./tmp/" + sanitizeFilename(filename) + ext
|
||||
filename = tmpDir + "/" + sanitizeFilename(filename) + ext
|
||||
|
||||
dst, err := os.Create(filename)
|
||||
if err != nil {
|
||||
@ -46,3 +51,14 @@ func sanitizeFilename(filename string) string {
|
||||
}
|
||||
return filename
|
||||
}
|
||||
|
||||
func ensureDir(dirPath string) (string, error) {
|
||||
if _, err := os.Stat(dirPath); os.IsNotExist(err) {
|
||||
err := os.MkdirAll(dirPath, 0700)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
}
|
||||
|
||||
return dirPath, nil
|
||||
}
|
||||
|
3
main.go
3
main.go
@ -2,6 +2,7 @@ package main
|
||||
|
||||
import (
|
||||
"github.com/labstack/echo/v4"
|
||||
"github.com/labstack/echo/v4/middleware"
|
||||
"github.com/labstack/gommon/log"
|
||||
"github.com/xzeldon/whisper-api-server/internal/api"
|
||||
"github.com/xzeldon/whisper-api-server/internal/resources"
|
||||
@ -11,6 +12,8 @@ func main() {
|
||||
e := echo.New()
|
||||
e.HideBanner = true
|
||||
|
||||
e.Use(middleware.CORS())
|
||||
|
||||
if l, ok := e.Logger.(*log.Logger); ok {
|
||||
l.SetHeader("${time_rfc3339} ${level}")
|
||||
}
|
||||
|
Reference in New Issue
Block a user