Index: main/trunk/model-interfaces-dev/atea/korero-maori-asr/src/components/AudioUpload.vue
===================================================================
--- main/trunk/model-interfaces-dev/atea/korero-maori-asr/src/components/AudioUpload.vue	(revision 35432)
+++ main/trunk/model-interfaces-dev/atea/korero-maori-asr/src/components/AudioUpload.vue	(revision 35433)
@@ -158,26 +158,43 @@
          */
         async getTranscriptions(files) {
-            await Util.delay(1000); // TODO: Remove - UI testing purposes only
+            await Util.delay(200); // TODO: Remove - UI testing purposes only
+
+            const validFiles = [];
+
+            // Skip any files that have already been transcribed
+            for (const file of files) {
+                if (this.$store.getters.hasTranscriptionOfFile(file)) {
+                    this.createFailure(file.file_name, this.translations.get("AudioUpload_AlreadyTranscribed"));
+                }
+                else {
+                    validFiles.push(file);
+                }
+            }
+
+            if (validFiles.length === 0) {
+                return;
+            }
 
             try {
-                for await (const batch of transcribeService.batchTranscribeFiles(files)) {
+                for await (const batch of transcribeService.batchTranscribeFiles(validFiles)) {
                     for (const t of batch) {
                         if (!t.success) {
-                            createFailure(this, t);
-                        }
-                        else {
-                            const f = files.find(f => f.name === t.file_name);
-                            if (f === undefined) {
-                                createFailure(this, t, this.translations.get("ErrorTryAgain"));
-                            }
-
-                            const tvm = new TranscriptionViewModel(t, f);
-
-                            try {
-                                this.$store.commit("transcriptionAdd", tvm);
-                            }
-                            catch (TranscriptionExistsError) {
-                                createFailure(this, t, this.translations.get("AudioUpload_AlreadyTranscribed"));
-                            }
+                            this.createFailure(t.file_name, t.log);
+                            continue;
+                        }
+
+                        const f = files.find(f => f.name === t.file_name);
+                        if (f === undefined) {
+                            this.createFailure(t.file_name, this.translations.get("ErrorTryAgain"));
+                            continue;
+                        }
+
+                        const tvm = new TranscriptionViewModel(t, f);
+
+                        try {
+                            this.$store.commit("transcriptionAdd", tvm);
+                        }
+                        catch (TranscriptionExistsError) {
+                            this.createFailure(t.file_name, this.translations.get("AudioUpload_AlreadyTranscribed"));
                         }
                     }
@@ -188,12 +205,10 @@
                 console.error(e);
 
-                const failure = new TranscriptionViewFailure(e.fileName, e.message);
-                this.failures.set(failure.id, failure);
-            }
-
-            function createFailure(that, t, reason = null) {
-                const failure = new TranscriptionViewFailure(t.file_name, reason ?? t.log);
-                that.failures.set(failure.id, failure);
-            }
+                this.createFailure(e.fileName, e.message)
+            }
+        },
+        createFailure(fileName, reason) {
+            const failure = new TranscriptionViewFailure(fileName, reason);
+            this.failures.set(failure.id, failure);
         }
     }
Index: main/trunk/model-interfaces-dev/atea/korero-maori-asr/src/main.js
===================================================================
--- main/trunk/model-interfaces-dev/atea/korero-maori-asr/src/main.js	(revision 35432)
+++ main/trunk/model-interfaces-dev/atea/korero-maori-asr/src/main.js	(revision 35433)
@@ -13,5 +13,5 @@
     constructor(transcription, file) {
         /** @type {String} The UUID of this transcription. */
-        this.id = file.name + file.size + file.type; // Should be a fairly reliable indicator of uniqueness.
+        this.id = TranscriptionViewModel.getId(file); // Should be a fairly reliable indicator of uniqueness.
 
         /** @type {String} The transcription. */
@@ -26,4 +26,8 @@
         /** @type {File} The file from which the transcription was generated. */
         this.file = file;
+    }
+
+    static getId(file) {
+        return file.name + file.size + file.type;
     }
 }
@@ -110,4 +114,10 @@
             state.translations = translations;
         }
+    },
+    getters: {
+        hasTranscriptionOfFile: (state) => (file) => {
+            const id = TranscriptionViewModel.getId(file);
+            return state.rawTranscriptions.has(id);
+        }
     }
 });
