Sitelet https://github.com/aichaos/rivescript-python/issues/124
Skip to content

pause macro during speech #124

Description

@elpimous

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)

?

Activity

kirsle commented on Jun 20, 2018

@kirsle
Member

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 on Jun 21, 2018

@elpimous
Author

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 on Jun 25, 2018

@elpimous
Author

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

kirsle commented on Jun 25, 2018

@kirsle
Member

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

parts = re.split(r'(<pause \d+?>)', reply)

elpimous commented on Jun 25, 2018

@elpimous
Author

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)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions