diff -ur ScummVM-cvs20020908/scummvm/scumm/sound.cpp ScummVM-cvs20020908+hack/scummvm/scumm/sound.cpp
--- ScummVM-cvs20020908/scummvm/scumm/sound.cpp	2002-09-02 10:38:46.000000000 +0200
+++ ScummVM-cvs20020908+hack/scummvm/scumm/sound.cpp	2002-09-09 00:48:49.000000000 +0200
@@ -371,7 +371,11 @@
 					b = isMouthSyncOff(_curSoundPos);
 				if (_mouthSyncMode != b) {
 					_mouthSyncMode = b;
-					a->startAnimActor(b ? a->talkFrame2 : a->talkFrame1);
+					if (_talk_sound_frame != -1) {
+						a->startAnimActor(_talk_sound_frame);
+						_talk_sound_frame = -1;
+					} else
+						a->startAnimActor(b ? a->talkFrame2 : a->talkFrame1);
 				}
 			}
 		}
@@ -582,10 +586,11 @@
 		error("Sound que buffer overflow");
 }
 
-void Sound::talkSound(uint32 a, uint32 b, int mode) {
+void Sound::talkSound(uint32 a, uint32 b, int mode, int frame) {
 	_talk_sound_a = a;
 	_talk_sound_b = b;
 	_talk_sound_mode = mode;
+	_talk_sound_frame = frame;
 }
 
 /* The sound code currently only supports General Midi.
diff -ur ScummVM-cvs20020908/scummvm/scumm/sound.h ScummVM-cvs20020908+hack/scummvm/scumm/sound.h
--- ScummVM-cvs20020908/scummvm/scumm/sound.h	2002-09-02 10:38:46.000000000 +0200
+++ ScummVM-cvs20020908+hack/scummvm/scumm/sound.h	2002-09-09 00:49:09.000000000 +0200
@@ -56,6 +56,7 @@
 	File *_sfxFile;
 	uint32 _talk_sound_a, _talk_sound_b;
 	byte _talk_sound_mode;
+	int _talk_sound_frame;
 	bool _mouthSyncMode;
 	bool _endOfMouthSync;
 	uint16 _mouthSyncTimes[52];
@@ -107,7 +108,7 @@
 	void stopAllSounds();
 	void clearSoundQue();
 	void soundKludge(int16 * list);
-	void talkSound(uint32 a, uint32 b, int mode);
+	void talkSound(uint32 a, uint32 b, int mode, int frame);
 	void setupSound();
 	void pauseSounds(bool pause);
 	int startSfxSound(File *file, int file_size);
diff -ur ScummVM-cvs20020908/scummvm/scumm/string.cpp ScummVM-cvs20020908+hack/scummvm/scumm/string.cpp
--- ScummVM-cvs20020908/scummvm/scumm/string.cpp	2002-08-31 21:24:57.000000000 +0200
+++ ScummVM-cvs20020908+hack/scummvm/scumm/string.cpp	2002-09-09 01:09:49.000000000 +0200
@@ -174,7 +174,7 @@
 		a = buffer[2] | (buffer[3] << 8) | (buffer[6] << 16) | (buffer[7] << 24);
 		b = buffer[10] | (buffer[11] << 8) | (buffer[14] << 16) | (buffer[15] << 24);
 //    if (_saveSound != 1)
-		_sound->talkSound(a, b, 1);
+		_sound->talkSound(a, b, 1, -1);
 	}
 //  warning("unkMessage1(\"%s\")", buffer);
 }
@@ -196,10 +196,14 @@
 
 void Scumm::CHARSET_1()
 {
+	uint32 talk_sound_a = 0;
+	uint32 talk_sound_b = 0;
 	int s, i, t, c;
-	int frme;
+	int frme = -1;
 	Actor *a;
 	byte *buffer;
+	bool has_talk_sound = false;
+	bool has_anim = false;
 
 	if (!_haveMsg)
 		return;
@@ -290,7 +294,8 @@
 	}
 
 	if (a && !string[0].no_talk_anim) {
-		a->startAnimActor(a->talkFrame1);
+//		a->startAnimActor(a->talkFrame1);
+		has_anim = true;
 		_useTalkAnims = true;
 	}
 
@@ -397,14 +402,11 @@
 		} else if (c == 9) {
 			frme = *buffer++;
 			frme |= *buffer++ << 8;
-			if (a)
-				a->startAnimActor(frme);
+			has_anim = true;
 		} else if (c == 10) {
-			uint32 tmpA, tmpB;
-
-			tmpA = buffer[0] | (buffer[1] << 8) | (buffer[4] << 16) | (buffer[5] << 24);
-			tmpB = buffer[8] | (buffer[9] << 8) | (buffer[12] << 16) | (buffer[13] << 24);
-			_sound->talkSound(tmpA, tmpB, 2);
+			talk_sound_a = buffer[0] | (buffer[1] << 8) | (buffer[4] << 16) | (buffer[5] << 24);
+			talk_sound_b = buffer[8] | (buffer[9] << 8) | (buffer[12] << 16) | (buffer[13] << 24);
+			has_talk_sound = true;
 			buffer += 14;
 
 			// Set flag that speech variant exist of this msg
@@ -436,6 +438,16 @@
 		}
 	} while (1);
 
+	// Even if talkSound() is called, we may still have to call
+	// startAnimActor() since actorTalk() may already have caused the
+	// wrong animation frame to be drawn, and the talkSound() won't be
+	// processed until after the next screen update. Bleah.
+
+	if (has_talk_sound)
+		_sound->talkSound(talk_sound_a, talk_sound_b, 2, frme);
+	if (a && has_anim)
+		a->startAnimActor(frme != -1 ? frme : a->talkFrame1);
+
 	charset._bufPos = buffer - charset._buffer;
 
 	gdi._mask_left = charset._strLeft;
