I'm using a rPi every day to `aplay *.wav` files which are derived from TextToSpeech. [as if I was blind].
By powering off during the particular , or during one of
2 prompts after it's played, I can select 1 of 3 effects on the latest played *.wav on the stack of *.wav files.
This primitive method controlled by only an on/off-switch, has worked hundred of times, but needs a re-boot-wait, after each power-down. Now I'd like to refine the control and remove the wait time, by having one more switch.
Presently the control is via a simple bash-script, which uses the idea 1. start playing the TTS or prompt; 2. rename/re-classify the TTS according to the prompt; 3. restore the TTS's name [IF power was not cut between 2 & 3].
What is a simple way to detect a switch during the prompt? Simple by hardware and by just extending the existing script.
My Raspberry Pi runs without display all the time. I use espeak to output audio instead of showing text.
I have not fully uderstood your question but I can tell you what implemented to control my Raspberry without display usage.
I use a single TACT switch, may be not so different from yours. A script loops every second which checks the status of the key. A simple state machine checks if the key has been pressed. If so the next possible action is outputted by espeak. If the key is not pressed after one second the next action is performed. If the key is kept pressed the next action is outputted by espeak and so on.
The actions are as simple as playing different internet radio stations or to shut down the Raspberry. If the last action is proposed everything starts from the beginning. Just the option to shut down is always the first proposed item.
I have dismounted the cinch connector to have space for the switch. May be this is useful as an idea. Of course more switches give more flexibility.
Can `espeak` synthesise text, or it it just a play-back? Do you know of any German text sythesizers for linux?
OK, it's not easy to understand other's explanation, so I'll paste my little script, and hope to see yours too.
That 'sounds' good. But if I want to have control WHILE `aplay a.wav` is running ....? Perhaps aplay can pause? IF KeyPressed THEN {pauseAplay; Cycle:PromptAccept} For selecting alternatives you need:
knowledge of which item is offered
ability of signal "yes I'll have that one".
Since the 'menu' is offered in time sequence, you need an audio prompt to know that item N is being offered. But probably `aplay` is not available to prompt, because it's been suspended/paused [assuming THAT is possible]. Or perhaps another invocation of `aplay` is available?
Isn't 'cinch' just a manufacture's name? Which connector? Can you paste your code, especially for detecting the switch? Here's mine:---- ##!/bin/bash
sPlaySkip saLaw1 sPlaySkip mythIraq sPlaySkip saLaw3 sPlaySkip QQssl sPlaySkip saLaw2 sPlaySkip grwthDivrt sPlaySkip saLaw4 sPlaySkip SpcTCmts splay Eskom sPlaySkip saLaw5 sPlaySkip QQNR3 ===================================== It was interesting to note that code for: 1. start playing prompt 2. rename file did NOT `rename file` while the prompt-playing, unless `sync` after `2. rename file`. Apparently because file updating is done when it suits linux.
I have no idea if aplay can pause. I use my Raspberry for listening internetradio with mplayer. If I want to change the station mplayer is stopped and re-started. I am not sure if this is possible with aplayer, or may be to re-start at some known position.
This is the job of espeak. BTW: If mplayer would kept running the audio of espeak would just be added on top of the mplayer output. It is a matter of volume balance which is better audible.
This is the connector next to the 3.5mm audio jack. It is round, has some metal outside and an inner connector.
This is the code to enable the gpios where the switch is connected to:
GPIO22 is an output but not used. It has been used for testing only.
This is the state machine which runs all the time. I have added some comments inline with ###.
status=0 radio=1 msg=`/usr/bin/cut -f 1 -d# radio.txt | /usr/bin/head -n $radio | /usr/bin/tail -n 1` addr=`/usr/bin/cut -f 2 -d# radio.txt | /usr/bin/head -n $radio | /usr/bin/tail -n 1` lnk=`/usr/bin/cut -f 3 -d# radio.txt | /usr/bin/head -n $radio | /usr/bin/tail -n 1` output=" 2> /dev/null | tr \"\\r\" \"\\n\" | grep --line-buffered -v -e \"^A:\" -e \"^Cache fill\" >> /run/shm/out.txt & " echo $msg | espeak --stdin 2> /dev/null ### some radio stations can be contacted directly and some offer a link. if test -z $lnk then player="/usr/bin/mplayer $addr" else id=`/usr/bin/wget -q -T 5 -O - --no-cookies $lnk| grep pls| head -n 1 | \ sed -e s/.*href=// | sed -e s/onclick.*$// | sed -e s/'//g | sed -e s/\ $//` player="/usr/bin/mplayer \"
formatting link
$id\"" fi ### Here is output to a file system in RAM. echo $player > /run/shm/out.txt eval $player$output
while true do ### k is the status of the key. k=`cat /sys/class/gpio/gpio17/value` case $status in 0) # Check input by hardware key if (($k==0)) then PID=`pgrep mplayer` kill $PID 2> /dev/null echo "shutdown" | espeak --stdin 2> /dev/null status=1 ### the gpio22 is not used. It could be an LED or so. echo '0' > /sys/class/gpio/gpio22/value fi # Check input from web server if test -r /run/shm/tuning.txt then PID=`pgrep mplayer` kill $PID 2> /dev/null radio=`cat /run/shm/tuning.txt` unlink /run/shm/tuning.txt msg=`/usr/bin/cut -f 1 -d# radio.txt | /usr/bin/head -n $radio | /usr/bin/tail -n 1` echo $msg | espeak --stdin 2> /dev/null status=3 fi ;; 1) if (($k==0)) then status=2 else echo "shutdown now" | espeak --stdin 2> /dev/null sudo halt fi ;; 2) if (($k==0)) then radio_max=`wc -l < radio.txt 2> /dev/null` radio=$((radio+1)) if (($radio==$radio_max+1)) then radio=1 fi msg=`/usr/bin/cut -f 1 -d# radio.txt | /usr/bin/head -n $radio | /usr/bin/tail -n 1` echo $msg | espeak --stdin 2> /dev/null else status=3 ### the gpio22 is not used. It could be an LED or so. echo '1' > /sys/class/gpio/gpio22/value fi ;; 3) msg=`/usr/bin/cut -f 1 -d# radio.txt | /usr/bin/head -n $radio | /usr/bin/tail -n 1` addr=`/usr/bin/cut -f 2 -d# radio.txt | /usr/bin/head -n $radio | /usr/bin/tail -n 1` lnk=`/usr/bin/cut -f 3 -d# radio.txt | /usr/bin/head -n $radio | /usr/bin/tail -n 1` if test -z $lnk then player="mplayer $addr" else id=`/usr/bin/wget -q -T 5 -O - --no-cookies $lnk| grep pls| head -n 1 | \ sed -e s/.*href=// | sed -e s/onclick.*$// | sed -e s/'//g | sed -e s/\ $//` player="mplayer \"
formatting link
$id\"" fi status=0 echo $player > /run/shm/out.txt eval $player$output ;; esac ### The script runs every 500ms. sleep 0.5 Done
OK. If espeak can read-the-newspaper-to-me while I'm lying-down; like Festival does, I'd try it. But investigating TextToSpeech is a non-trivial job.
OK, your code gave me the idea to try . bash is rather complex; so I'm puting some of the man & info to TTS, to listen to. "unix" is a spoof on the name of "Multics" which was so complex that it failed.
OK, I have difficulty in accepting the multiproc: several can talk .
We call it 'RCA'. It's gives me a good display on a 1970's b/w monitor.
Great! I think I've got a record of which physical pins those are.
ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here.
All logos and trade names are the property of their respective owners.