diff --git a/BitLit_decoder.py b/BitLit_decoder.py index 18b1e32..afce2e6 100644 --- a/BitLit_decoder.py +++ b/BitLit_decoder.py @@ -1,17 +1,20 @@ #### RUNNING THE MODEL -# Michels-MacBook-Pro:~ ShebMichel$ cd documents/pmlg/wake/decoder -# Michels-MacBook-Pro:decoder ShebMichel$ python demo.py resources/HiBitLit.pmdl +# cd documents/pmlg/wake/decoder +# python demo.py resources/HiBitLit.pmdl +from __future__ import print_function import os import sys import snowboydecoder +from snowboydecoder import play_ding, play_dong import signal -import numpy as np import time +import numpy as np import BitLit_main + t0 = time.time() ## Time counter interrupted = False @@ -36,10 +39,9 @@ model = sys.argv[1] # capture SIGINT signal, e.g., Ctrl+C signal.signal(signal.SIGINT, signal_handler) - -detector = snowboydecoder.HotwordDetector(model, sensitivity=0.75) -print("Listening for hotword (Hi BitLit)... Press Ctrl+C to exit") -snowboydecoder.play_audio_file() +play_ding() +detector = snowboydecoder.HotwordDetector(model, sensitivity=0.5) +print("Listening... Press Ctrl+C to exit") detector.start( diff --git a/BitLit_main.py b/BitLit_main.py index 09f475b..796e9c6 100644 --- a/BitLit_main.py +++ b/BitLit_main.py @@ -23,7 +23,7 @@ import hashlib import tempfile from logger import logger -from snowboydecoder import play_audio_file +from snowboydecoder import play_ding, play_dong import speech_recognition as sr ## Packages for voice recognizer for index, name in enumerate(sr.Microphone.list_microphone_names()): @@ -42,11 +42,11 @@ except: def play_mp3(mp3_file): """Play mp3 file with pyglet.""" - # FIXME (wassname) It currently plays in background but we want to wait untill it's finished source = pyglet.media.load(filename=mp3_file, streaming=False) source.play() - time.sleep(source.duration*2 + 2) # TODO must be a better way to wait untill the media has played - + print(mp3_file, source.duration) + time.sleep(source.duration + 4) # must be a better way to wait untill the media has played + print(mp3_file, source.duration) def cache_gtts(text, lang="en-nz", cache_file=None): """ @@ -71,7 +71,7 @@ def cache_gtts(text, lang="en-nz", cache_file=None): en: English """ - print('say:', text) + logger.debug('say: %s', text) if not cache_file: hash_filename = hashlib.md5(text.encode()).hexdigest() + '.mp3' cache_file = os.path.join(tempfile.gettempdir(), hash_filename) @@ -85,49 +85,61 @@ def generate_poem(): ############ AUDIO CONVERSION TO TEST - play_audio_file() + play_dong() t0 = time.time() r = sr.Recognizer() with sr.Microphone() as source: - outfile1 = cache_gtts(text="Hi! My Name is BIT-LIT. PLEASE SPEAK SOME IDEAS FOR A POEM between the beeps.") + + # print(r.energy_threshold) + # r.adjust_for_ambient_noise(source) + # print('energy_threshold', r.energy_threshold) + r.energy_threshold=50 + + + print('mic', source) + outfile1 = cache_gtts(text="Hi! My Name is BIT-LIT. PLEASE SPEAK SOME IDEAS FOR A POEM AFTER THE BEEP.") play_mp3(outfile1) + play_ding() - play_audio_file() + print('speak now', time.time()) + audio = r.listen(source) + logger.debug('done recording %s', time.time()) + logger.info('recorded %s s', len(audio.frame_data)/audio.sample_rate) - audio = r.listen(source, phrase_time_limit=20) - play_audio_file() - - outfile2 = cache_gtts(text="BEEP. THANK YOU! GIVE ME A MINUTE TO GENERATE AND READ YOUR POEM. BEEP") + play_dong() + outfile2 = cache_gtts(text="BEEP. THANK YOU! GIVE ME A MINUTE TO GENERATE AND READ YOUR POEM") play_mp3(outfile2) t1 = time.time() - print('listen took', t1 - t0) + logger.debug('listen took %s', t1 - t0) try: - print("using google speech to text...") + logger.debug("using google speech to text...") USER_INPUT = r.recognize_google_cloud(audio, credentials_json=GOOGLE_CLOUD_SPEECH_CREDENTIALS) - print("Google thinks you said: " + USER_INPUT) + logger.info("Google thinks you said: " + USER_INPUT) except sr.UnknownValueError as e: - print("Could not understand audio. {}".format(e)) + logger.error("Could not understand audio. {}".format(e)) return except sr.RequestError as e: - print("Could not request results; {0}".format(e)) + logger.error("Could not request results; {0}".format(e)) return t1b = time.time() - print('transcribe took', t1b - t1) + logger.debug('transcribe took %s', t1b - t1) + + return # Generate poem from user seed text_generated = poem(USER_INPUT) t2 = time.time() logger.info("ML POEM is: %s", text_generated) - logger.info('poem and rhyme generation took %s', t2 - t1) + logger.debug('poem and rhyme generation took %s', t2 - t1) # TEXT CONVERSION IN AUDIO # FEED POEM TO TRANSCRIBER tts = gTTS(text=text_generated) - # ts = datetime.datetime.utcnow().strftime('%Y%m%d_%H-%M-%S') - poem_mp3 = "outputs/BitLit_poem.mp3"#.format(ts) + ts = datetime.datetime.utcnow().strftime('%Y%m%d_%H-%M-%S') + poem_mp3 = "outputs/BitLit_{}.mp3".format(ts) tts.save(poem_mp3) play_mp3(poem_mp3) @@ -136,8 +148,8 @@ def generate_poem(): ###### t3 = time.time() - logger.info('Poem to speech took %s', t3 - t2) - logger.info("Time spent is about: %s seconds") + logger.debug('Poem to speech took %s', t3 - t2) + logger.debug("Total time spent is about: %s seconds", np.round(t3 - t0)) if __name__ == "__main__": diff --git a/README.md b/README.md index 4a35f04..d49ea86 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ - +Forked from https://github.com/ShebMichel/BitLit_test1 # Run To run the program once installed @@ -42,43 +42,35 @@ API Keys: When setup the layout should look something like -``` - ├── BitLit_decoder.py - ├── BitLit_main.py - ├── BitLit_main.pyc - ├── BitLit_model_param.py - ├── BitLit_model_param.pyc - ├── HiBitLit.pmdl - ├── README.md - ├── logger.py - ├── logger.pyc - ├── outputs - ├── poem_generator.py - ├── poem_generator.pyc - ├── requirements.txt - ├── secrets - │ ├── google_cloud_credentials.json - │ └── google_cloud_credentials.template.json - ├── snowboy - │ ├── _snowboydetect.so - │ ├── resources - │ │ ├── alexa.umdl - │ │ ├── alexa_02092017.umdl - │ │ ├── common.res - │ │ ├── ding.wav - │ │ ├── dong.wav - │ │ └── snowboy.umdl - │ ├── snowboydetect.py - │ └── snowboydetect.pyc - ├── snowboydecoder.py - ├── snowboydecoder.pyc - └── weights - ├── model_poems.npy - └── model_rhymes.npy -``` - -# TODO - -- [ ] make sure text logging works -- [ ] improve before and after text -- [ ] it start recording while prompt is playing? \ No newline at end of file + ├── BitLit_decoder.py + ├── BitLit_main.py + ├── BitLit_main.pyc + ├── BitLit_model_param.py + ├── BitLit_model_param.pyc + ├── HiBitLit.pmdl + ├── README.md + ├── logger.py + ├── logger.pyc + ├── outputs + ├── poem_generator.py + ├── poem_generator.pyc + ├── requirements.txt + ├── secrets + │ ├── google_cloud_credentials.json + │ └── google_cloud_credentials.template.json + ├── snowboy + │ ├── _snowboydetect.so + │ ├── resources + │ │ ├── alexa.umdl + │ │ ├── alexa_02092017.umdl + │ │ ├── common.res + │ │ ├── ding.wav + │ │ ├── dong.wav + │ │ └── snowboy.umdl + │ ├── snowboydetect.py + │ └── snowboydetect.pyc + ├── snowboydecoder.py + ├── snowboydecoder.pyc + └── weights + ├── model_poems.npy + └── model_rhymes.npy diff --git a/poem_generator.py b/poem_generator.py index 943b88a..09d8ace 100644 --- a/poem_generator.py +++ b/poem_generator.py @@ -2,9 +2,11 @@ Voice to text to poem to speech Credits: Michel, Lauren, Thomas """ +from __future__ import print_function import os import numpy as np +from logger import logger import re from textblob import TextBlob import random @@ -120,7 +122,7 @@ def poem(USER_INPUT): start_string = [first_rhyme] else: start_string = [random.choice(list(word2idx_rhymes.keys()))] - print("The word {} is not in our corpus of rhymes yet.".format(first_rhyme)) + logger.error("The word {} is not in our corpus of rhymes yet.".format(first_rhyme)) input_eval = [ word2idx_rhymes[s] for s in start_string ] # converts start_string to numbers the model understands @@ -143,7 +145,7 @@ def poem(USER_INPUT): input_eval = tf.expand_dims([predicted_id], 0) rhymes += [idx2word_rhymes[predicted_id]] - print("rhymes:", rhymes) + logger.info("rhymes:", rhymes) #################### # POEM GENERATION # diff --git a/snowboydecoder.py b/snowboydecoder.py index 9d8d3c8..17e3d23 100644 --- a/snowboydecoder.py +++ b/snowboydecoder.py @@ -60,6 +60,13 @@ def play_audio_file(fname=DETECT_DING): audio.terminate() +def play_ding(): + play_audio_file(fname=DETECT_DING) + +def play_dong(): + play_audio_file(fname=DETECT_DONG) + + class HotwordDetector(object): """ Snowboy decoder to detect whether a keyword specified by `decoder_model`