Traveling abroad? Need help learning the language? Wondering how hard it can be to write an app to help translate phrases? Wonder no more, because:
You will need:
Compile the Raku programming language on your Android. There are excellent instructions here, but when I did this I ran into a little issue. This step was easier to do by plugging a real keyboard into the device.
I like using the Raku programming language for this task for a variety of reasons. One is that the language is so concise I can actually write the program on the phone. Really. Another is that it has great built-in features for interacting with other programs, with functions like shell and the quoting construct qx.
Write a program like the one to the right. This program basically works like this:
termux-dialog radio
to
choose
the
direction
of
translation
(English
to
Italian
or
vice
versa).
This
determines
the
name
of
the
model. curl termux-dialog confirm
to
get
a
yes
or
no
as
to
whether
we
should
send
the
request
again.
This
is
because
the
first
request
might
load
the
model
into
a
cache,
in
which
case
you
will
have
to
retry
it
in
20
seconds.
You
can
see
this
in
action
by
trying
it
out
at
the
huggingface
online
interface
.
When your program is ready, run it with raku ciao.raku and verify that it works. Oh also note that your api token should go into a file called "hugging".
Make a shell script in ~/.shortcuts/tasks/ciao -- this is a wrapper that calls the above program and is used by termux-widget. This step allows you to add a button to your home screen to call the "app". This can also set up the environment and change to your working directory.
#!/bin/sh
exec 2>&1 >> $HOME/ciao.log
. /data/data/com.termux/files/home/.bashrc
cd /data/data/com.termux/files/home/ciao
raku ./ciao.raku
spoiler: here is the program, as seen from an editor on the phone
That's it! Enjoy your travels! And happy language hacking!
Below is the program in a wider format, and as text for your copy-paste convenience.
#!/usr/bin/env raku
use JSON::Fast;
my $HF_API_TOKEN="hugging".IO.slurp.trim;
sub j($txt) { from-json($txt) }
sub jt($txt) { j($txt)<text> }
my $model = jt qx/termux-dialog radio -v en-it,it-en/;
my $mode is default("") = "speech" if $model ~~ /en '-'/;
my $txt = jt q:w:s:x[termux-dialog $mode];
my $url = <<api-inference.huggingface.co models Helsinki-NLP "opus-mt-$model">>.join: "/";
loop {
my $proc = shell Q:s:to/SH/, :out;
curl -s https://$url \
-X POST \
-d '{"inputs": "$txt" }' \
-H "Authorization: Bearer $HF_API_TOKEN"
SH
my $o = j $proc.out.slurp(:close);
my $tr = $o[0]<translation_text> || ~$o;
my $out = "$txt -> $model -> $tr";
jt qqx[termux-dialog confirm -i "$out"] andthen do { last if $_ eq 'yes' }
}