aichaos / rivescript-python

A RiveScript interpreter for Python. RiveScript is a scripting language for chatterbots.
https://www.rivescript.com
MIT License
157 stars 71 forks source link

pause macro during speech #124

Open elpimous opened 6 years ago

elpimous commented 6 years ago

Hi all.

Need to see Alfred pause into a retry, to simulate brain search activity...

here is my simple macro :

> object pause python
    from time import sleep
    a = (args)
    a = "".join(a)
    sleep(int(a))
< object

here is my try (failed) :

...
- a moment,  searching for best AI response <call>pause 2</call> Ok, I have it now {weight=50}

It should speak, make a 2s pause, and speak again, but it just starts with pause, and after, speak all sentence (a moment, searching for best AI response Ok, I have it now)

?

kirsle commented 6 years ago

Hi

It's because rs.reply() is a synchronous method and can't return the reply until everything has finished. When it's processing the tags in the reply and sees the <call> tag, it runs the Python pause function you defined, which makes it wait a couple seconds before returning a string. Then it can finally substitute that string in place of the <call> tag and start returning the reply.

So you'll call rs.reply() and it will hang for 2 seconds before returning the final reply all at once.

You're probably best off handling the delay outside the RiveScript module, like,

# (rivescript)
# make up a `<pause #>` tag and use it instead of `<call>`:
- a moment,  searching for best AI response <pause 2> Ok, I have it now {weight=50}
reply = bot.reply(user, message)
parts = re.split(r'<pause \d+?>', reply)  # split at a `<pause>` tag but include the tag:
# ["a moment,  searching for best AI response ", "<pause 2>", "Ok, I have it now"]
for part in parts:
    m = re.search(r'^<pause (\d+?)>$', part)
    if m:  # this is the `<pause>` tag
        time.sleep( int(m.group(1) )  # sleep the 2 seconds
    else:
        print(part)  # or whatever
elpimous commented 6 years ago

Thanks for explanations !! and (félicitations pour la demande en mariage !) (I wish you the best, Noah) Vincent

ps : parts = re.split(r'<pause \d+?>', reply) doesn't keep pause part in parts ! searching...

elpimous commented 6 years ago

another re command ? Didn't find correct one ! thanks

kirsle commented 6 years ago

Ah sorry, I meant to include parenthesis around the regexp:

parts = re.split(r'(<pause \d+?>)', reply)
elpimous commented 6 years ago

Very good ! works very nicely !!

reply = rs.reply(user, message)

# added pause tag  ex : <pause 2> (2 seconds)
parts = re.split(r'(<pause \d+?>)', reply)  # split at a `<pause>` tag but include the tag:
# ["a moment,  searching for best AI response ", "<pause 2>", "Ok, I have it now"]
for part in parts:
    m = re.search(r'^<pause (\d+?)>$', part)
    if m:  # this is the `<pause>` tag
        time.sleep( int(m.group(1) ))  # sleep x seconds
    else:
        print(part)