Update 2: For the record, this is the finished program incorporating the advice from Mr.Wizard and kguler
DynamicModule[{x, t, status, h}, x[_] = 0; t[_] = 0; status[_] = False; h[_] = {}; Column[{Grid[ MapIndexed[{ #, Button["Start", Speak@#; status[#2] = True; t[#2] = Hold@AbsoluteTime[] -AbsoluteTime[], Enabled -> Dynamic[! status[#2]]], Button[Style["\[Checkmark]", Darker@Green], t[#2] = ReleaseHold[t[#2]]; x[#2]++; AppendTo[h[#2], t[#2]]; status[#2] = False, Enabled -> Dynamic[status[#2]]], Button[Style["\[Times]", Red], t[#2] = ReleaseHold[t[#2]]; x[#2]--; AppendTo[h[#2], -t[#2]]; status[#2] = False, Enabled -> Dynamic[status[#2]]], Button["spell", Speak@StringJoin[Riffle[Characters[#], ","]]], Dynamic[x[#2]], Dynamic[Clock[]; ReleaseHold[NumberForm[t[#2], 2]]], Dynamic@ If[Length@h[#2] > 0, Module[{z = Transpose[{Abs[#], Sign[#]} & /@ h[#2]]}, Graphics[ (Rectangle @@@ (Partition[{Accumulate[First@z],Last@z}\[Transpose],2,1,{2,2},{{0, 0}}] /. {{x1_, y1_Integer}, {x2_, y2_Integer}} -> {{x1 + 0.2, 0}, {x2, y2}})) /. {Rectangle[{x1_,0}, {x2_, 1}] -> {Darker@Green, Rectangle[{x1, 0}, {x2, 1}]}, Rectangle[{x1_,0}, {x2_,-1}] -> {Red, Rectangle[{x1,0}, {x2, -1}]}}, ImageSize -> {Automatic, 20}, PlotRange -> {-1, 1}]], "" ] } &, words], Alignment -> Left], Row[{Button[ "reset", (x[{#}] = 0; t[{#}] = 0; h[{#}] = {}) & /@ Range@Length@words], Spacer[10]}]}]] 

