You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
81 lines
2.9 KiB
Python
81 lines
2.9 KiB
Python
#!/usr/bin/env python
|
|
|
|
# this script combines the content of guru and pirate (from json files) to play their messages
|
|
# it also integrates leds when the characters speak
|
|
|
|
import json, random, os, subprocess
|
|
from pprint import pprint
|
|
from time import sleep
|
|
from LEDfunctions import *
|
|
|
|
|
|
# when characters speak the LEDs light up and perform effects
|
|
def vu_2_leds(color):
|
|
while True:
|
|
data = play_process.stdout.readline()
|
|
if not data:
|
|
pixels.clear() # make LEDs dark
|
|
pixels.show()
|
|
break
|
|
data = data.rstrip()
|
|
if data.endswith("%"):
|
|
vu = float(data[:-1][-3:])/100 # 0-100
|
|
leds_color_intensity(color, vu)
|
|
|
|
def leds_start_stop(color):
|
|
while True:
|
|
data = play_process.stdout.readline()
|
|
data = data.rstrip()
|
|
print('data:',data)
|
|
print('process:', play_process.stdout.readline()) #_handle_exitstatus
|
|
leds_pirate_bounce(color_pirate)
|
|
|
|
|
|
# open json files, where are all the phrases
|
|
pwd = os.path.dirname( os.path.realpath(__file__) ) + "/"
|
|
oracle_f = open(pwd + "guru.json", "r").read()
|
|
oracle = json.loads(oracle_f)
|
|
rebel_f = open(pwd + "rebel.json", "r").read()
|
|
rebel = json.loads(rebel_f)
|
|
|
|
|
|
# guru part, using audio recordings
|
|
keys = list( oracle.keys())
|
|
part = random.choice(keys) # choose: Repeat OR Ask Yourself
|
|
print(part)
|
|
sound_dir = pwd + "Audio_recordings/" + oracle[part]['title'] + "/"
|
|
intro = random.choice(oracle[part]['introductions'])
|
|
intro_txt = intro[0]
|
|
intro_sound = sound_dir + intro[1]
|
|
print('Intro:', intro_txt, intro_sound)
|
|
play_process = subprocess.Popen(["aplay", intro_sound, "-f", "cd", "--vumeter=mono"], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True)
|
|
vu_2_leds(color_guru)
|
|
|
|
|
|
# pirate reply
|
|
rebel_run = random.choice([True, False]) # 50/50 chances of intervening
|
|
if rebel_run is True:
|
|
rebel_reply_snippet = intro[2] # comes from guru/oracle json file
|
|
rebel_reply = random.choice( rebel[part] )
|
|
rebel_sentence = rebel_reply.format(rebel_reply_snippet)
|
|
|
|
|
|
# guru part, using audio recordings
|
|
for i in range( random.randint(1,4) ):
|
|
sleep( random.randint(1,1) )
|
|
msg = random.choice(oracle[part]['messages'])
|
|
msg_txt = msg[0]
|
|
msg_sound = sound_dir + msg[1]
|
|
print('MSG:', msg_txt, msg_sound)
|
|
play_process = subprocess.Popen(["aplay", msg_sound, "-f", "cd", "--vumeter=mono"], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True)
|
|
vu_2_leds(color_guru) #LEDs guru
|
|
|
|
|
|
# pirate part, using espeak
|
|
if rebel_run is True:
|
|
print('rebel sentence:', rebel_sentence)
|
|
#rebel_cmd = 'echo "{}" | espeak -ven+whisper -s 150'.format(rebel_sentence)
|
|
#os.system(rebel_cmd)
|
|
play_process = subprocess.Popen(["espeak", rebel_sentence, "-ven+whisper", "-s", "150"], stdout=subprocess.PIPE, stderr=subprocess.STDOUT, universal_newlines=True) # text to speech using espeak
|
|
leds_pirate_bounce(color_pirate) # LEDs pirate
|