Paper · 2026-05-28 · cs.CV
Evaluation of Conversational Agents: Understanding Culture, Context and Environment in Emotion Detection
Emotion detector for face images and speech, aimed at Black African settings. Three-block CNNs classify facial expressions (FER-2013 plus about 1,000 local images) and speech features (MFCC, chroma, ZCR, RMS, mel spectrogram). An Audio-Frame Mean Expression (AFME) step compares top-3 emotions from both and flags sarcasm when none match. Author-reported 95.7% accuracy for CNN+AFME.
Convolutional neural networkMultimodal fusionMel-frequency cepstral coefficientsData augmentationemotion-recognitionsarcasm-detectionmultimodalconvolutional-neural-networkspeechfacial-expression
AI-compiled by claude-haiku-5-5 on 2026-10-19, not yet reviewed by a human. Every claim cites its source; check it when a detail matters.
In plain words
Chatbots and voice assistants need to notice how a person feels, but most emotion-recognition systems were built on data from a narrow set of people. This paper asks what goes wrong when the same tools meet faces and voices from Black African communities, and it builds a simple emotion detector that uses both the face and the voice.
The detector reads the face in each video frame and the sound in each short clip, and gives each a ranked list of likely emotions. A small extra step then checks whether the two lists agree. When the face says one thing and the voice says something very different, the system takes that as a sign of sarcasm.
The authors report high accuracy on their mixed test set, but the paper has several internal inconsistencies, so treat the headline numbers with care.
TL;DR
- Multimodal emotion classifier: a 3-block CNN for face images and a 3-block CNN for audio features, each trained on seven emotion classes §III.B §III.D.
- The added Audio-Frame Mean Expression (AFME) step compares the top-3 emotions from each modality on short sub-clips and reports sarcasm when no emotion matches §III.E alg. 1.
- Author-reported accuracy of the CNN+AFME model is 95.7% on a mix of FER-2013, RAVDESS, SAVEE, TESS and local data, against 70.14 to 95.6 for the compared models tab. 3.
- Per-class results are internally inconsistent between Table 1 and Table 2, and the sarcasm claim rests on one YouTube example §III.F fig. 10.
- No official code was found.
Problem
Emotion detectors built mostly on public image sets can fail on faces and voices they did not see, and the authors argue this matters for conversational AI used in African settings §I. Their stated gaps are diversity, micro expressions, and real-time detection §II.
Single-modality systems miss emotions that a face shows but a voice does not, or the reverse. Sarcasm is the case the authors single out, because the words, the tone and the face can disagree §III.G.
The method assumes that each modality yields a usable ranking of emotions for every short sub-clip. The paper does not test the other direction, where the two modalities agree on a wrong emotion §III.E.
Method
Overview §III. The model combines two CNN classifiers, one trained on image frames and one on audio features, then applies AFME on top of their outputs. Both channels predict the seven basic emotions: anger, disgust, fear, happy, sad, surprise and neutral §III.B tab. 1 tab. 2.
Image branch §III.B §III.C §III.D.
- Images are loaded from FER-2013 (48 x 48 grayscale) and from locally collected images, which are converted to grayscale with the weighted sum written in the paper §III.C.
- Face landmarks are found with the Dlib predictor (68 points); the paper keeps 5 points per brow, 8 per eye, 20 for the mouth and 17 for the jaw §III.C fig. 5.
- A 3-block CNN classifies the frames. Each block is a convolution, batch normalisation, ReLU, 2 x 2 max-pooling and dropout, in that order. Block width starts at 64 and grows by a factor of two in later blocks §III.D §IV.A.
# Image branch: one convolutional block, applied three times [§III.D]
# Input: frames (B, 1, 48, 48) grayscale; kernel size not stated
# Output: features (B, units, H', W')
def conv_block(frames, units):
# 2D convolution; kernel size and padding not stated [§III.D]
features = conv2d(frames, units)
# Batch normalisation on the convolution output [§III.D]
features = batch_norm(features)
# ReLU activation [§III.D]
features = relu(features)
# Max pooling with pool size 2 [§III.D]
features = max_pool(features, size=2)
# Dropout; rate not stated [§III.D]
features = dropout(features)
return features
# Stack: units = 64, then 128, then 256 (paper: "multiple of two";
# exact widths for blocks 2 and 3 are not stated) [§IV.A]Audio branch §III.B §III.E.
- Speech clips are converted to WAV, then transformed into a time-frequency representation and passed on for speech recognition and text classification §III.C fig. 6 fig. 7.
- Audio features are computed per clip: zero-crossing rate, a 12-bin chroma vector, chroma deviation, MFCCs, root-mean-square energy, and a mel spectrogram §III.E.
- A CNN classifies the audio features. The paper says LSTM and CNN were both trained with different hyperparameters, but no LSTM results are reported §III.A §III.D.
AFME §III.E alg. 1. Each video is cut into sub-videos of 5 to 8 seconds, so that micro-expressions are not missed §III.E. Each sub-video gets a top-3 emotion list from the audio and from the image frames. The algorithm then looks for one emotion that appears in both lists. If it finds one, it returns that emotion. If no emotion matches across all sub-videos, it reports that sarcasm is detected.
# Audio-Frame Mean Expression (AFME) [alg. 1]
# Input: speech_scores, image_scores: per sub-video, emotion -> percent
# Output: the first shared emotion, or None when sarcasm is flagged
def afme(speech_scores, image_scores):
# Top-3 emotions for every audio sub-video [alg. 1 lines 5-7]
speech_top = [top_three(scores) for scores in speech_scores]
# Top-3 emotions for every image sub-video [alg. 1 lines 8-10]
image_top = [top_three(scores) for scores in image_scores]
# Return the first emotion that both modalities share [alg. 1 lines 12-18]
for speech_set in speech_top:
for image_set in image_top:
for emotion in speech_set:
if emotion in image_set:
return emotion
# No shared emotion anywhere: flag sarcasm [alg. 1 lines 20-21]
print("sarcasm detected")
return NoneThe paper says the emotion spectrum of Plutchik [30] is used to assign weights, so that neighbouring emotions on the wheel count as partial matches. No weights are given, so the pseudocode above uses exact matches only §III.E alg. 1.
Training §III.D §IV.B. Adam is used with a learning rate of 0.001. The paper says the other optimiser settings are left at their defaults. The paper says it tested time-based and exponential decay and then moved to Adam §IV.B. Oversampling and re-weighting are used to balance classes §IV.B §III.B. Epochs: 50 in the curve of fig. 8 and 70 in fig. 9.
Hyperparameters
| Name | Value | Where | Notes |
|---|---|---|---|
| CNN blocks | 3 | §III.D | a single block gave 72% and overfit §III.D |
| Units, first block | 64 | §III.D | later blocks grow by a factor of 2; exact widths not stated |
| Pooling | max-pool, size 2 | §III.D | |
| Dropout rate | not stated | §III.D | dropout is the last layer of each block |
| Kernel size, stride, padding | not stated | §III.D | |
| Activation | ReLU | §III.D | |
| Batch normalisation | yes | §III.D | position stated: after convolution |
| Optimiser | Adam | §IV.B | |
| Learning rate | 0.001 | §IV.B | decay constant not stated |
| Other optimiser settings | defaults | §IV.B | |
| Batch size | not stated | - | |
| Loss function | not stated | - | |
| Epochs | 50 (fig. 8) and 70 (fig. 9) | §IV.A fig. 8 fig. 9 | caption of fig. 8 says 30 |
| Train/test split | not stated | - | |
| Share of localized data | 20% | §III.D | "mixed with 20% well-labelled localized datasets"; unclear whether of train or test |
| Image input size | 48 x 48 grayscale | §III.C | FER-2013 native size |
| Grayscale weights | 0.3 R + 0.59 G + 0.11 B | §III.C | used by the authors; the paper says this differs from averaging |
| Dlib landmarks | 68 points | §III.C | 5 per brow, 8 per eye, 20 mouth, 17 jaw |
| Sub-video length | 5 to 8 s | §III.E | sampling step and overlap not stated |
| Audio sample rate | not stated | - | |
| Audio frame length, hop | not stated | - | |
| Chroma vector bins | 12 | §III.E | |
| Local dataset size | 1000 images | §III.B | per-class counts listed in the text sum to 990 |
| Local class counts | disgust 320, fear 150, anger 150, surprise 145, happy 75, sad 75, neutral 75 | §III.B | |
| Speech dataset counts | 1875 per class, surprise 615, neutral 1750 | fig. 2 |
Results
Author-reported. Setup: CNN+AFME on mixed image and speech data; compared against published FER and JAFFE models in Table 3 tab. 3 §IV.B.
Headline accuracies stated in the paper:
| Setting | Metric | Value | Source |
|---|---|---|---|
| Abstract, range across models | accuracy | 85% to 96% | abstract |
| Single CNN block | accuracy | 72% (overfits test) | §III.D |
| Three-block CNN, late in training | accuracy | 82.59% | §IV.C |
| CNN after 15 epochs | accuracy | 65.23% | §IV.A |
| CNN+AFME (this paper) | accuracy | 95.7% | tab. 3 |
Per-class results of the CNN on the test data:
| Emotion | N (classified) | Accuracy % | Precision | Recall | F1 | Source |
|---|---|---|---|---|---|---|
| Anger | 1770 | 83.18 | 0.72 | 0.83 | 0.77 | tab. 1 |
| Disgust | 223 | 89.64 | 0.89 | 0.85 | 0.87 | tab. 1 |
| Fear | 1203 | 85.83 | 0.87 | 0.73 | 0.83 | tab. 1 |
| Happy | 2719 | 98.00 | 0.99 | 0.98 | 0.98 | tab. 1 |
| Sad | 1685 | 88.38 | 0.89 | 0.81 | 0.85 | tab. 1 |
| Surprise | 1538 | 87.34 | 0.81 | 0.90 | 0.89 | tab. 1 |
| Neutral | 1928 | 86.01 | 0.77 | 0.79 | 0.78 | tab. 1 |
Per-class results after AFME:
| Emotion | N (truth) | N (classified) | Accuracy % | Precision | Recall | F1 | Source |
|---|---|---|---|---|---|---|---|
| Anger | 1531 | 1770 | 93.18 | 0.72 | 0.83 | 0.77 | tab. 2 |
| Disgust | 283 | 243 | 94.64 | 0.96 | 0.85 | 0.92 | tab. 2 |
| Fear | 1581 | 1203 | 85.83 | 0.97 | 0.73 | 0.83 | tab. 2 |
| Happy | 2719 | 2868 | 100 | 1.0 | 0.94 | 0.96 | tab. 2 |
| Sad | 1846 | 1785 | 97.34 | 0.97 | 0.91 | 0.94 | tab. 2 |
| Surprise | 1244 | 1238 | 98.38 | 0.81 | 0.93 | 0.86 | tab. 2 |
| Neutral | 1882 | 1978 | 95.80 | 0.87 | 0.89 | 0.88 | tab. 2 |
Comparison with other models, as printed in the paper:
| Work | Model | Dataset | Accuracy % | Source |
|---|---|---|---|---|
| AFME (this paper) | CNN + AFME | FER 2013, RAVDESS, SAVEE, TESS, local data | 95.7 | tab. 3 |
| Syed | Mini-Xception | FER 2013 | 95.6 | tab. 3 |
| Giannopoulos | CNN | FER 2013 | 83 | tab. 3 |
| Dachapally | Autoencoder | JAFFE | 86.38 | tab. 3 |
| Jaiswal | CNN | FER 2013 | 70.14 | tab. 3 |
| Khaireddin | CNN | FER 2013 and JAFFE | "73.28 and 98" (as printed) | tab. 3 |
Training curves: loss falls and accuracy rises over the epochs. The text says that with more features and epochs, accuracy reached 82.59% and loss was "decreasing to 47.21%"; whether that is a relative reduction or a final value is not clear §IV.C fig. 9. The paper reports a 52% accuracy for an earlier NLP-based prosody model; this is not part of the present method §II.
Paper vs code
No official code.
Searched: the paper, abstract and reference list contain no repository or project URL. GitHub repository search for "AFME", "audio frame mean expression emotion", "Teye" and "Missah" returned no repository that belongs to the authors. Third-party projects with the same short names were ignored.
Pitfalls
- Accuracy is not consistent across the paper. The abstract gives 85% to 96%. Table 1 gives 83.18% to 98.00% for the CNN alone. The text gives 82.59% and 65.23%. Table 3 gives 95.7% for the same method. Which model produced each number is not always stated, so use these values only as ranges §III.D §IV.A §IV.C tab. 1 tab. 3.
- Table 1 and Table 2 disagree on the same emotions. The AFME results (Table 2) are higher than the CNN-only results (Table 1) for Anger (93.18 vs 83.18), Disgust (94.64 vs 89.64), Sad (97.34 vs 88.38), Surprise (98.38 vs 87.34) and Neutral (95.80 vs 86.01). The paper gives no reason for these gaps. Table 2's Happy row shows accuracy 100 with recall 0.94, which the paper does not explain tab. 1 tab. 2.
- Column meanings change between tables. Table 1 labels its count column "N(classified)". Table 2 has "N (truth)" and "N (classified)". The Happy row's count is 2719 in Table 1 and in Table 2's truth column. The paper does not say which meaning applies to which table tab. 1 tab. 2.
- Dataset sizes do not add up. The local set is stated as 1000 images, but its per-class counts sum to 990. The speech class counts in Figure 2 are not tied to a stated split §III.B fig. 2.
- Split and leakage are unstated. The train/test split is not described, and the 20% share of "localized" data is ambiguous. With the same people in train and test, the accuracy could be inflated; the paper does not rule this out §III.D.
- The AFME pseudocode in the paper has defects. Line 9 gives C = {p1, p3, p3}, probably a typo for p1, p2, p3. Line 4 loops over i while the body uses m and n. Line 14 compares k with b, which is never defined; it should be the current element of B. The paper says the weights come from Plutchik's wheel, but no weights are given. The output is an emotion in line 16 and a boolean in line 23, while the caption says it returns the emotion "of the audio and image process completion". The implementation above follows the intent and returns the matched emotion or flags sarcasm alg. 1 §III.E.
- Sarcasm is shown on one example. The sarcasm claim rests on a single public video (Figure 10), with no labelled sarcasm set and no sarcasm metric §III.F fig. 10.
- Epoch counts conflict. Figure 8's caption says 30 epochs, but its axis runs to 50 and the text refers to the 46th to 50th epochs. Figure 9 is 70 epochs. The paper does not say which run produced the final numbers §IV.B fig. 8 fig. 9.
- The learning-rate decay constant is missing. The paper says a decay constant was increased, but gives no value and no schedule §IV.B.
- Oversampling and augmentation are named but not specified. The section heading lists data augmentation, random oversampling and re-weighting, but no factor, method or class weight is stated §IV.B.
- Table 3 compares different datasets. The rows use different training and test sets, so the ranking is not like-for-like. The Khaireddin cell reads "73.28 and 98" as printed tab. 3.
- VGG16 is mentioned but not reported. The paper says a second model was trained for the speech case, but no VGG16 results appear §III.D.
- Dates differ. The PDF header shows IEEE Access, volume 10, 2022, and a 2022 DOI, while arXiv records v1 on 2026-05-28. This card uses the arXiv metadata.
- Grayscale weights differ from the common values. The paper uses 0.3, 0.59 and 0.11, and says averaging would not work in all cases. Implement the weights as written §III.C.
- Single run, no error bars. Results are reported without variance, seeds or repeated runs.
Lineage
- Builds on: Plutchik's emotion wheel [30] for the AFME weighting; Dlib landmarks and OpenCV face tools §III.C; VGG16 §III.D. None of these are arXiv papers in this wiki.
- Compared against: the models in tab. 3 (Syed, Giannopoulos, Dachapally, Jaiswal, Khaireddin). None of them have cards.
- Superseded by: not stated.
Source and license
Adapted from “Evaluation of Conversational Agents: Understanding Culture, Context and Environment in Emotion Detection” by Martha Teiko Teye, Yaw Marfo Missah, Emmanuel Ahene, Twum Frimpong, Auxane Boch (arXiv:2605.30099), used under CC BY 4.0. Changes: condensed and restructured for implementation, with tables, equations and algorithms taken from the paper and its code, each cited to its source. Not affiliated with or endorsed by the authors.