Hmm, I was already using "copy" so presumably there's something else I'm messing up. Here's the code for my test passage:
<<nobr>>
<<cacheaudio "singleKeyStroke0" "singleKeyStroke1.mp3">>
<<cacheaudio "singleKeyStroke1" "singleKeyStroke2.mp3">>
<<cacheaudio "singleKeyStroke2" "singleKeyStroke3.mp3">>
<<cacheaudio "spaceKeyStroke" "spaceKeyStroke.mp3">>
<<set _message to "Magna enim beef ribs, ham sed beef deserunt commodo picanha pastrami venison swine meatloaf. Nulla consectetur non sausage ham esse corned beef velit exercitation aute enim picanha pork belly ham hock. Burgdoggen dolore mollit tongue. Strip steak in ipsum in et est in do jowl consectetur. Ham hock drumstick reprehenderit alcatra, consequat shoulder porchetta enim pork loin occaecat turducken pork venison esse. Ea bacon irure t-bone pig consectetur, ham tongue ipsum in.">>
<<createplaylist "SMStyping">>
<<for _i to 0; _i lt _message.length; _i++>>
<<if _message[_i] eq " ">>
<<track "spaceKeyStroke" copy>>
<<else>>
<<switch random(0,2)>>
<<case 0>>
<<track "singleKeyStroke0" copy>>
<<case 1>>
<<track "singleKeyStroke1" copy>>
<<case 2>>
<<track "singleKeyStroke2" copy>>
<</switch>>
<</if>>
<</for>>
<</createplaylist>>
<<playlist "SMStyping" play>>
<</nobr>>
Each clip plays once, as far as I can tell, then the playlist ends.
The four audio files can be found here (less than 3kb total).