Someone asked this a while ago, so I posted this script just to show that it is possible. Save the script, probably in ~/Library/Scripts. Set the alarm to a run script alarm, and select the saved script. It is not thoroughly tested; it certainly won't work for repeated events (except perhaps the first). It probably won't work for alarms which fire after their events. Feel free to mutilate it to suit your needs!
AK
click here to
open this script in your editor
<pre style="font-family: 'Monaco', 'Courier New', Courier, monospace; overflow:auto; color: #222; background: #DDD; padding: 0.2em; font-size: 10px; width:400px">(*
called from iCal as on alarm, will speak the title of the alarm event
won't work for repeating events
AK ITCarlow Nov 2004
*)
set Now to current date
-- Adjust FuzzSeconds to suit; if too big, close events will speak several times
set FuzzSeconds to 30
tell application "iCal"
set MyEvents to every event of every calendar where ((start date of it) ≥ (current date))
repeat with SubEvents in MyEvents --separate list for each calendar
repeat with ThisEvent in SubEvents --scan the list looking for events that have triggered us
if (count of open file alarm of ThisEvent) = 1 then
set MinutesBefore to (trigger interval of open file alarm of ThisEvent) as number
set TriggerInt to (Now - ((start date of ThisEvent) + 60 * MinutesBefore)) --notionally 0 for firing event
if (TriggerInt < FuzzSeconds) and (TriggerInt > (-FuzzSeconds)) then
say (summary of ThisEvent as text)
--could say other fields too eg location, description ...
end if
end if
end repeat
end repeat
end tell
</pre>