summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChloe Brown <chloe.brown.00@outlook.com>2022-05-05 19:40:56 +0100
committerChloe Brown <chloe.brown.00@outlook.com>2022-05-05 20:21:42 +0100
commitb22a33cf0ca8896de37f8636f02d8a84111d2465 (patch)
treeceeb86ed49e7e881c9a1c3e3573636171ba10deb
parentb88521d8bdc562b042e6f932957571014a6837ec (diff)
Add vosk and nerd-dictation for text-to-speech.
-rw-r--r--yellowsquid/packages/patches/nerd-dictation-setup.patch52
-rw-r--r--yellowsquid/packages/patches/vosk-makefile.patch102
-rw-r--r--yellowsquid/packages/vosk.scm136
3 files changed, 290 insertions, 0 deletions
diff --git a/yellowsquid/packages/patches/nerd-dictation-setup.patch b/yellowsquid/packages/patches/nerd-dictation-setup.patch
new file mode 100644
index 0000000..9693d02
--- /dev/null
+++ b/yellowsquid/packages/patches/nerd-dictation-setup.patch
@@ -0,0 +1,52 @@
+diff --git a/pyproject.toml b/pyproject.toml
+index c228223..62cbcb4 100644
+--- a/pyproject.toml
++++ b/pyproject.toml
+@@ -1,2 +1,17 @@
++[project]
++name = "nerd-dictation"
++version = "0.0.1"
++description = "Offline text to speech"
++readme = "readme.rst"
++license = { text = "GPL-3.0-only" }
++dependencies = ["vosk>=0.3.32"]
++
++[project.scripts]
++nerd-dictation = "nerd_dictation:main"
++
+ [tool.black]
+ line-length = 119
++
++[build-system]
++requires = ["setuptools>=61"]
++build-backend = "setuptools.build_meta"
+diff --git a/setup.cfg b/setup.cfg
+new file mode 100644
+index 0000000..ba8d818
+--- /dev/null
++++ b/setup.cfg
+@@ -0,0 +1,15 @@
++[metadata]
++name = nerd-dictation
++version = 0.0.1
++description = Offline text to speech
++long_description = file: readme.rst
++license = GPL-3.0-only
++
++[options]
++py_modules = nerd_dictation
++install_requires =
++ vosk>="0.3.32"
++
++[options.entry_points]
++console_scripts =
++ nerd-dictation = nerd_dictation:main
+diff --git a/setup.py b/setup.py
+new file mode 100644
+index 0000000..6068493
+--- /dev/null
++++ b/setup.py
+@@ -0,0 +1,3 @@
++from setuptools import setup
++
++setup()
diff --git a/yellowsquid/packages/patches/vosk-makefile.patch b/yellowsquid/packages/patches/vosk-makefile.patch
new file mode 100644
index 0000000..d590e89
--- /dev/null
+++ b/yellowsquid/packages/patches/vosk-makefile.patch
@@ -0,0 +1,102 @@
+diff --git a/src/Makefile b/src/Makefile
+index bcadf09..4fd1ade 100644
+--- a/src/Makefile
++++ b/src/Makefile
+@@ -1,20 +1,11 @@
+-# Locations of the dependencies
+-KALDI_ROOT?=$(HOME)/travis/kaldi
+-OPENFST_ROOT?=$(KALDI_ROOT)/tools/openfst
+-OPENBLAS_ROOT?=$(KALDI_ROOT)/tools/OpenBLAS/install
+-MKL_ROOT?=/opt/intel/mkl
+-CUDA_ROOT?=/usr/local/cuda
+-# Math libraries
+-HAVE_OPENBLAS_CLAPACK?=1
+-HAVE_MKL?=0
+-HAVE_ACCELERATE=0
+-HAVE_CUDA?=0
+ # Compiler
+ CXX?=g++
+ EXT?=so
++
+ # Extra
+ EXTRA_CFLAGS?=
+ EXTRA_LDFLAGS?=
++OUTDIR?=.
+
+ VOSK_SOURCES= \
+ kaldi_recognizer.cc \
+@@ -30,60 +21,26 @@ VOSK_HEADERS= \
+ spk_model.h \
+ vosk_api.h
+
+-CFLAGS=-g -O3 -std=c++17 -fPIC -DFST_NO_DYNAMIC_LINKING \
+- -I. -I$(KALDI_ROOT)/src -I$(OPENFST_ROOT)/include $(EXTRA_CFLAGS)
+-
+-LIBS= \
+- $(KALDI_ROOT)/src/online2/kaldi-online2.a \
+- $(KALDI_ROOT)/src/decoder/kaldi-decoder.a \
+- $(KALDI_ROOT)/src/ivector/kaldi-ivector.a \
+- $(KALDI_ROOT)/src/gmm/kaldi-gmm.a \
+- $(KALDI_ROOT)/src/nnet3/kaldi-nnet3.a \
+- $(KALDI_ROOT)/src/tree/kaldi-tree.a \
+- $(KALDI_ROOT)/src/feat/kaldi-feat.a \
+- $(KALDI_ROOT)/src/lat/kaldi-lat.a \
+- $(KALDI_ROOT)/src/lm/kaldi-lm.a \
+- $(KALDI_ROOT)/src/rnnlm/kaldi-rnnlm.a \
+- $(KALDI_ROOT)/src/hmm/kaldi-hmm.a \
+- $(KALDI_ROOT)/src/transform/kaldi-transform.a \
+- $(KALDI_ROOT)/src/cudamatrix/kaldi-cudamatrix.a \
+- $(KALDI_ROOT)/src/matrix/kaldi-matrix.a \
+- $(KALDI_ROOT)/src/fstext/kaldi-fstext.a \
+- $(KALDI_ROOT)/src/util/kaldi-util.a \
+- $(KALDI_ROOT)/src/base/kaldi-base.a \
+- $(OPENFST_ROOT)/lib/libfst.a \
+- $(OPENFST_ROOT)/lib/libfstngram.a
+-
+-
+-ifeq ($(HAVE_OPENBLAS_CLAPACK), 1)
+- CFLAGS += -I$(OPENBLAS_ROOT)/include
+- LIBS += \
+- $(OPENBLAS_ROOT)/lib/libopenblas.a \
+- $(OPENBLAS_ROOT)/lib/liblapack.a \
+- $(OPENBLAS_ROOT)/lib/libblas.a \
+- $(OPENBLAS_ROOT)/lib/libf2c.a
+-endif
++CFLAGS=-g -O3 -std=c++17 -Wno-deprecated-declarations -fPIC -DFST_NO_DYNAMIC_LINKING \
++ -I. $(EXTRA_CFLAGS)
+
+-ifeq ($(HAVE_MKL), 1)
+- CFLAGS += -I$(MKL_ROOT)/include
+- LIBS += -L$(MKL_ROOT)/lib/intel64 -Wl,-rpath=$(MKL_ROOT)/lib/intel64 -lmkl_rt -lmkl_intel_lp64 -lmkl_core -lmkl_sequential
+-endif
++LDFLAGS=
+
+-ifeq ($(HAVE_ACCELERATE), 1)
+- LIBS += -framework Accelerate
+-endif
++LDFLAGS += \
++ -lkaldi-online2 -lkaldi-decoder -lkaldi-ivector -lkaldi-gmm -lkaldi-tree \
++ -lkaldi-feat -lkaldi-lat -lkaldi-lm -lkaldi-rnnlm -lkaldi-hmm -lkaldi-nnet3 \
++ -lkaldi-transform -lkaldi-cudamatrix -lkaldi-matrix -lkaldi-fstext \
++ -lkaldi-util -lkaldi-base -lfst -lfstngram
+
+-ifeq ($(HAVE_CUDA), 1)
+- CFLAGS+=-DHAVE_CUDA=1 -I$(CUDA_ROOT)/include
+- LIBS+=-L$(CUDA_ROOT)/lib64 -lcublas -lcusparse -lcudart -lcurand -lcufft -lcusolver -lnvToolsExt
+-endif
++# HAVE_OPENBLAS_CLAPACK
++LDFLAGS += -lopenblas -llapack -lblas -lf2c
+
+-all: libvosk.$(EXT)
++all: $(OUTDIR)/libvosk.$(EXT)
+
+-libvosk.$(EXT): $(VOSK_SOURCES:.cc=.o)
+- $(CXX) --shared -s -o $@ $^ $(LIBS) -lm -latomic $(EXTRA_LDFLAGS)
++$(OUTDIR)/libvosk.$(EXT): $(VOSK_SOURCES:%.cc=$(OUTDIR)/%.o) $(LIBS)
++ $(CXX) --shared -s -o $@ $^ $(LDFLAGS) $(EXTRA_LDFLAGS)
+
+-%.o: %.cc $(VOSK_HEADERS)
++$(OUTDIR)/%.o: %.cc $(VOSK_HEADERS)
+ $(CXX) $(CFLAGS) -c -o $@ $<
+
+ clean:
diff --git a/yellowsquid/packages/vosk.scm b/yellowsquid/packages/vosk.scm
new file mode 100644
index 0000000..80a224e
--- /dev/null
+++ b/yellowsquid/packages/vosk.scm
@@ -0,0 +1,136 @@
+(define-module (yellowsquid packages vosk)
+ #:use-module (gnu packages)
+ #:use-module (gnu packages audio)
+ #:use-module (gnu packages libffi)
+ #:use-module (gnu packages machine-learning)
+ #:use-module (gnu packages maths)
+ #:use-module (gnu packages python)
+ #:use-module (gnu packages python-build)
+ #:use-module (gnu packages xdisorg)
+ #:use-module (guix build-system python)
+ #:use-module (guix download)
+ #:use-module (guix gexp)
+ #:use-module (guix git-download)
+ #:use-module ((guix licenses) #:prefix license:)
+ #:use-module (guix packages)
+ #:use-module (srfi srfi-26))
+
+(define-public openfst-1.7.2
+ (package
+ (inherit openfst)
+ (version "1.7.2")
+ (source (origin
+ (method url-fetch)
+ (uri (string-append "http://www.openfst.org/twiki/pub/FST/"
+ "FstDownload/openfst-" version ".tar.gz"))
+ (sha256
+ (base32
+ "0fqgk8195kz21is09gwzwnrg7fr9526bi9mh4apyskapz27pbhr1"))))))
+
+(define-public openfst-1.7.2+far+lookahead+ngram
+ (package
+ (inherit openfst-1.7.2)
+ (version "1.7.2+far+lookahead+ngram")
+ (arguments
+ (cons* #:configure-flags
+ ''("--enable-far"
+ "--enable-ngram-fsts"
+ "--enable-lookahead-fsts")
+ (package-arguments openfst-1.7.2)))))
+
+(define-public kaldi-501de70
+ (let ((commit "501de7066f24375fce5f9558a931381886a294e1")
+ (revision "3"))
+ (package
+ (inherit kaldi)
+ (version (git-version "0" revision commit))
+ (source (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/kaldi-asr/kaldi")
+ (commit commit)))
+ (file-name (git-file-name "kaldi" version))
+ (sha256
+ (base32
+ "055znh22c0ppvnpb3av8b3brqff6rcbnyx9l414zn989c8a6h55k"))))
+ (inputs (modify-inputs (package-inputs kaldi)
+ (replace "openfst" openfst-1.7.2))))))
+
+(define-public python-vosk
+ (package
+ (name "python-vosk")
+ (version "0.3.32")
+ (source (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/alphacep/vosk-api")
+ (commit (string-append "v" version))))
+ (file-name (git-file-name name version))
+ (sha256
+ (base32
+ "1inmw0wd0zvbz83cwk6x8svwycgxzzd9vd0n12xgjc4ypqlk8fk9"))
+ (patches
+ (parameterize ((%patch-path (map (cut string-append <> "/yellowsquid/packages/patches") %load-path)))
+ (search-patches "vosk-makefile.patch")))))
+ (build-system python-build-system)
+ (inputs (list openfst-1.7.2+far+lookahead+ngram
+ kaldi-501de70
+ openblas
+ clapack
+ python-cffi))
+ (native-inputs (list python-wheel))
+ (arguments
+ `(#:phases
+ (modify-phases %standard-phases
+ (add-before 'build 'build-shared-library
+ (lambda* (#:key (make-flags '()) (parallel-build? #t) #:allow-other-keys)
+ (with-directory-excursion "src"
+ (apply invoke "make"
+ `(,@(if parallel-build?
+ `("-j" ,(number->string (parallel-job-count)))
+ '())
+ ,@make-flags)))))
+ (add-after 'build-shared-library 'goto-python-dir
+ (lambda _ (chdir "python"))))))
+ (home-page "https://alphacephei.com/vosk/install")
+ (synopsis "Speech recognition toolkit")
+ (description "Vosk is a speech recognition toolkit with bindings in various
+programming languages.")
+ (license license:asl2.0)))
+
+(define-public nerd-dictation
+ (let ((commit "a574dddb422010389c2f3a5cd84ed685738b7a4c")
+ (revision "1"))
+ (package
+ (name "nerd-dictation")
+ (version (git-version "0" revision commit))
+ (source (origin
+ (method git-fetch)
+ (uri (git-reference
+ (url "https://github.com/ideasman42/nerd-dictation")
+ (commit commit)))
+ (file-name (git-file-name name version))
+ (sha256
+ (base32
+ "1lx8lgsqgs8qrss583wcyk7n0hv3xyr7wrwnvxhfjvpjx6jflmmx"))
+ (patches (parameterize ((%patch-path (map (cut string-append <> "/yellowsquid/packages/patches") %load-path)))
+ (search-patches "nerd-dictation-setup.patch")) )
+ (snippet #~(rename-file "nerd-dictation" "nerd_dictation.py"))))
+ (build-system python-build-system)
+ (arguments
+ (list
+ #:phases
+ #~(begin
+ (use-modules (ice-9 format))
+ (modify-phases %standard-phases
+ (add-before 'build 'patch-xdotool
+ (lambda _
+ (substitute* "nerd_dictation.py"
+ (("cmd_base = \"xdotool\"")
+ (format #f "cmd_base = \"~a/bin/xdotool\"" #$(this-package-input "xdotool"))))))))))
+ (inputs (list python-cffi python-vosk xdotool))
+ (home-page "https://github.com/ideasman42/nerd-dictation")
+ (synopsis "Offline text to speech")
+ (description "This is a utility that provides simple access speech to text
+for using in Linux without being tied to a desktop environment.")
+ (license license:gpl3))))