refactor install-numen.sh: dependancy check moved to ./depcheck.sh
and reused by Makefile
additional changes to install-numen.sh:
- annotated input argument default values
- notes on where files go
---
.gitignore | 1 +
Makefile | 61 ++++++++++++++++++++++++++++++++++++++++++++++++
README.md | 17 ++++++++++++++
depcheck.sh | 24 +++++++++++++++++++
install-numen.sh | 26 +++++++++------------
5 files changed, 114 insertions(+), 15 deletions(-)
create mode 100644 Makefile
create mode 100755 depcheck.sh
diff --git a/.gitignore b/.gitignore
index 84bbfa1..296cb0b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,4 @@
/tmp/
/speech
/model/
+rewrite-libexec.sed
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..b69c313
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,61 @@
+.PHONY: local-install dirs run check-depends
+
+# final output directory used to sed replace hardcoded /usr/libexec/numen
+PWD := $(abspath $(shell pwd))
+
+# groups of files into bin bin/etc,bin/phrases, bin/etc/{phrases,handlers}
+handlers := $(addprefix bin/etc/,$(wildcard handlers/*))
+phrases := $(addprefix bin/,$(wildcard phrases/*.phrases))
+phrasescripts := $(subst phrasescripts/,bin/etc/phrases/,$(wildcard phrasescripts/*))
+etc := $(addprefix bin/etc/,speech awk instructor record scribe)
+bin := $(addprefix bin/,numen numenc)
+
+# how to run after installing
+run: check-depends local-install
+ # might need to update: --mic=sysdefault:CARD=PCH
+ cd bin && ./numen --verbose phrases/*.phrases
+
+check-depends:
+ ./depcheck.sh
+
+# all the files we need to exist
+local-install: $(bin) $(etc) $(handlers) $(phrasescripts) $(phrases) bin/numen.1 bin/model
+
+# install eg. vosk-api-bin
+# also see ./install-vosk.sh
+# 'wrapper' will check this location by default. don't need to symlink it
+bin/model: /usr/local/share/vosk-models/small-en-us/
+ ln -s $< $@
+
+dirs:
+ @mkdir -p bin/etc/handlers/
+ @mkdir -p bin/etc/phrases/
+ @mkdir -p bin/phrases/
+
+rewrite-libexec.sed: | dirs
+ echo 's:/usr/libexec/numen:$(PWD)/bin/etc:g' > $@
+
+bin/etc/%: % | rewrite-libexec.sed
+ sed -f rewrite-libexec.sed $< > $@
+ chmod +x $@
+
+bin/numen.1: doc/numen.1.scd | dirs
+ scdoc < $< > $@
+
+bin/speech: speech.go | dirs
+ go build $< -o $@
+
+bin/etc/handlers/%: handlers/% | rewrite-libexec.sed
+ sed -f rewrite-libexec.sed $< > $@
+ chmod +x $@
+
+bin/phrases/%.phrases: phrases/%.phrases | rewrite-libexec.sed
+ sed -f rewrite-libexec.sed $< > $@
+
+bin/etc/phrases/%: phrasescripts/% | rewrite-libexec.sed
+ sed -f rewrite-libexec.sed $< > $@
+ chmod +x $@
+
+bin/%: % | rewrite-libexec.sed
+ sed -f rewrite-libexec.sed $< > $@
+ chmod +x $@
diff --git a/README.md b/README.md
index 138bbd6..10bc14e 100644
--- a/README.md
+++ b/README.md
@@ -24,6 +24,12 @@ Finally, `numen` itself can be installed with:
sudo ./install-numen.sh
+### Without root
+Use `make run` to try without modifying system files.
+
+Instead, make will create `./bin` and organize files within after checking for dependencies.
+See [`Makefile`](Makefile).
+
## Permission
`dotool` requires permission to `/dev/uinput` to create the virtual input
@@ -39,6 +45,17 @@ If need be, you can run:
and re-login and trigger the udev rule or just reboot.
+## Mic Check
+
+Confirm the `arecord` captures audio
+
+```
+mic=default # as set by `bin/etc/record` without `numen --mic=...`
+arecord -q -D "$mic" -f S16_LE -c 1 -r 16000 -d 5 test.wav # recs for 5 secs
+aplay test.wav
+```
+(on an integrated Intel HDA: `mic=sysdefault:CARD=PCH`)
+
## Getting Started
Once you've got a microphone, you can run it with:
diff --git a/depcheck.sh b/depcheck.sh
new file mode 100755
index 0000000..518c516
--- /dev/null
+++ b/depcheck.sh
@@ -0,0 +1,24 @@
+#!/bin/sh
+# 20230218WF - adapted from install-numen.sh. reused in Makefile
+RET=0
+have() { command -v "$1" > /dev/null;}
+nohave_msg() { ! have "$1" && echo "$2" && RET=$((RET+1)); }
+nohave_msg arecord 'Need the "alsa-utils" package to record audio'
+nohave_msg dotool 'Need "dotool" to simulate keypresses'
+nohave_msg gcc 'Need "gcc"' # Why?
+nohave_msg go 'Need "go" (aka "golang") to build speech.go'
+nohave_msg scdoc 'Need "scdoc" to compile documentation'
+
+if have dotool && ! dotool --version >/dev/null 2>&1; then
+ echo 'You need a newer version of dotool (version 1.1 or later),'
+ echo 'use your package manager or run: sudo ./install-dotool.sh'
+ RET=$((RET+1))
+fi
+
+! [ -r /lib/libvosk.so ] &&
+ echo 'Need /lib/libvosk.so for speach to text. see ./install-vosk.sh' && RET=$((RET+1))
+
+! [ -d /usr/local/share/vosk-models/ ] &&
+ echo 'Need model for vosk. see ./install-model.sh' && RET=$((RET+1))
+
+exit $RET
diff --git a/install-numen.sh b/install-numen.sh
index 399d685..a8d65ae 100755
--- a/install-numen.sh
+++ b/install-numen.sh
@@ -1,26 +1,22 @@
#!/bin/sh
-# ./install-numen.sh [DESTDIR] [BINDIR]
+# ./install-numen.sh [DESTDIR=""] [BINDIR=/usr/local/bin/]
+# installs
+# - numen,numenc to $DESTDIR/$BINDIR
+# - etc to $DESTDIR/usr/libexec/numen
+# where etc is handlers/ phrasescripts/ record awk ...etc
+# you do not want these on PATH
+# e.g. includes a awk wrapper called 'awk'
#
# If the environment variable PACKAGING is set, compiling speech.go is left
# to you to do beforehand. It is meant for build systems packaging numen.
# Example: PACKAGING=true ./install-numen.sh "$DESTDIR" /usr/bin
+#
+# NB: /usr/libexec/numen/ is hard coded in e.g. numen, scribe, phrase, ...
+# see Makefile's rewrite-libexec.sed if this is a problem
version="$(git describe --long --abbrev=12 --tags --dirty 2>/dev/null || echo 0.6)"
if ! [ "$PACKAGING" ]; then
- ok=1
- ! command -v arecord > /dev/null && echo 'you need the alsa-utils package' && unset ok
- ! command -v dotool > /dev/null && echo 'you need dotool' && unset ok
- ! command -v gcc > /dev/null && echo 'you need gcc' && unset ok
- ! command -v go > /dev/null && echo 'you need go (sometimes packaged as golang)' && unset ok
- ! command -v scdoc > /dev/null && echo 'you need scdoc' && unset ok
- [ "$ok" ] || exit
-
- if ! dotool --version >/dev/null 2>&1; then
- echo 'You need a newer version of dotool (version 1.1 or later),'
- echo 'use your package manager or run: sudo ./install-dotool.sh'
- exit 1
- fi
-
+ ./depcheck.sh || exit
go build speech.go || exit
fi
--
2.39.0
Glad there's anything useful in it! I'm happy to see requests
ruthlessly rejected [0].
Two is one too many install methods.
I hadn't seen libexec conventions before and didn't understand how the
pieces fit together.
In retrospect, I should have started exploring with PKGBUILD instead of Makefile
And "packaging" into ./bin with your suggested NUMEN_LIBEXEC tweaks
is an elegant solution to the try-before-you-by local install I was going for.
The mic note should have been a separate patch. Sorry.
`--audiolog ` was super useful. I used it to find that the alsa
default was just static for me.
I thought I had to dig into `record` to see if there were settings
that my card didn't like.
In the end, I just needed to specify the mic ... which was well
documented save for an example.
My first working arecord test was with -D hw:0,0 but I couldn't pass
that on as --mic=hw:0,0
Thanks for sharing numen!
I spent a good amount of time yesterday speaking ridiculous
incantations to a vim buffer.
It feels like magic. (except that the computer cannot understand
however I'm saying 'eve'. I switched to 'egg')
[0]: https://www.jeffgeerling.com/blog/2016/why-i-close-prs-oss-project-maintainer-notes
Thanks Will, it's cool to get a patch! I don't think I'll merge it directly
but you've raised some good ideas like the ./bin install and mic checking help.
Honestly I don't think there should be two ways to install numen and I
don't see the benefit of a makefile here. Perhaps wrapper could export an
environment variable of the libexec dir that everything should use and then
you could install numen locally like:
mkdir bin || exit
./install-numen.sh bin || exit
sed -i 's:^export NUMEN_LIBEXEC=:export NUMEN_LIBEXEC=bin:' || exit
ln -sf /usr/local/share/vosk-models bin/usr/local/share || exit
I recently added --audiolog for checking the mic but I should add something
to the readme.
I decided to do a big rewrite so now numen's just one binary instead of the
weird libexec dream. Now you should be able to just do:
go run . phrases/*.phrases
for your try-before-you-buying.
--mic=hw:0,0 should work now too :)