Snippets

Furhat Robotics Extended listening examples

Created by Ludvig Linse last modified
<!-- 
    This is an example of two ways to do extended listening. 
    1. The first example, loop, simply loops listening until a certain stop word is said (hardcoded in this example, you probably want to use grammar in a real scenario).
    2. The second example, timer, gives the user 20 seconds to answer. The only scenario we recommend using this for is if you have a very noisy environment and you can't rely on speech recognition. In order to actually capture speech here, you need to record the audio aswell - which can be done with the audio logging tool. 

-->   
   
	<var name="feedback" type="String" value="''"/>	 
    
    <state id="Start">
        <onentry>
            <agent:say>Loop or timer?</agent:say>
            <agent:listen/>
            <reentry/>
        </onentry>
        
        <onevent name="sense.user.speak" cond="asString(event:text).equals('loop')"> 
            <goto state="FeedbackLoop"/>
		</onevent>
        
        <onevent name="sense.user.speak" cond="asString(event:text).equals('timer')"> 
            <goto state="TimedFeedback"/>
        </onevent>
    </state>
    
	<state id="FeedbackLoop">
		<onentry>
		    <agent:say>Please give your feedback. Say no if you want to abort</agent:say>
			<agent:listen/>
		</onentry>
		
		<onevent name="sense.user.speak" cond="asString(event:text).equals('no')"> 
	        <goto state="Done"/>
		</onevent>
		
		<onevent name="sense.user.speak" cond="!eq(event:text, iristk.speech.RecResult.NOMATCH)">
		    <exec>
		        feedback = feedback + " " + event:text;
		    </exec>
		    <random>
		        <agent:say>anything else?</agent:say>
		        <agent:say>ok, something more?</agent:say>
		        <agent:say>anything more?</agent:say>
		    </random>
		    <agent:listen/>
		</onevent>
		
		<onevent name="sense.user.speak">
		    <agent:say>sorry, can you repeat that?</agent:say>
		    <agent:listen/>
		</onevent>
		
		<onevent name="sense.user.silence">
		    <agent:say>I didn't hear anything</agent:say>    
		    <agent:listen/>
		</onevent>
	</state>
	
	<state id="TimedFeedback">
	    <onentry>
	        <agent:say>Please give your feedback, you have 20 seconds to go</agent:say>
	        <agent:listen/>
	    </onentry>
	    
	    <onevent name="sense.user.speak" cond="!eq(event:text, iristk.speech.RecResult.NOMATCH)">
		    <exec>
		        feedback = feedback + " " + event:text;
		    </exec>
		    <agent:listen/>
		</onevent>
		
		<onevent name="sense.user.speak">
		    <agent:say>sorry, can you repeat that?</agent:say>
		    <agent:listen/>
		</onevent>
		
		<onevent name="sense.user.silence">
		    <agent:listen/>
		</onevent>
		
		<ontime afterentry="20000">
		    <goto state="TimerEnded"/>
		</ontime>
	</state>
	
	<state id="TimerEnded">
	    <onentry>
	        <if cond="!system.getCurrentUser().isSpeaking()">
		        <send event="action.listen.stop"/>
		        <goto state="Done"/>
		    </if>
	    </onentry>
	    
	    <onevent name="sense.user.speak">
	        <exec>
		        feedback = feedback + " " + event:text;
		    </exec>
            <goto state="Done"/>
	    </onevent>
	    
	    <onevent name="sense.user.silence">
	        <goto state="Done"/>
	    </onevent>
	    
	</state>
	
	<state id="Done">
	    <onentry>
		    <agent:say>Ok, thank you. The feedback I got was <expr>feedback</expr></agent:say>
	    </onentry>
	</state>

Comments (0)

HTTPS SSH

You can clone a snippet to your computer for local editing. Learn more.