diff --git a/plugin/whispeakauth/Controller/AuthenticationController.php b/plugin/whispeakauth/Controller/AuthenticationController.php
index 831736ab88..0c8d670b76 100644
--- a/plugin/whispeakauth/Controller/AuthenticationController.php
+++ b/plugin/whispeakauth/Controller/AuthenticationController.php
@@ -156,9 +156,6 @@ class AuthenticationController extends BaseController
 
         $token = \ChamiloSession::read(\WhispeakAuthPlugin::SESSION_SENTENCE_TEXT);
 
-        $request = new ApiRequest();
-        $success = $request->performAuthentication($token, $user, $audioFilePath);
-
         \ChamiloSession::erase(\WhispeakAuthPlugin::SESSION_SENTENCE_TEXT);
 
         /** @var array $lpItemInfo */
@@ -166,7 +163,21 @@ class AuthenticationController extends BaseController
         /** @var array $quizQuestionInfo */
         $quizQuestionInfo = ChamiloSession::read(WhispeakAuthPlugin::SESSION_QUIZ_QUESTION, []);
 
-        $message = $this->plugin->get_lang('AuthentifySuccess');
+        $success = true;
+
+        $request = new ApiRequest();
+
+        try {
+            $request->performAuthentication($token, $user, $audioFilePath);
+
+            $message = $this->plugin->get_lang('AuthentifySuccess');
+        } catch (\Exception $exception) {
+            $message = $this->plugin->get_lang('AuthentifyFailed')
+                .PHP_EOL
+                .$exception->getMessage();
+
+            $success = false;
+        }
 
         if (!$success) {
             if (!empty($lpItemInfo)) {
@@ -191,8 +202,6 @@ class AuthenticationController extends BaseController
                 $this->plugin->addAuthenticationAttempt(LogEvent::STATUS_FAILED, $user->getId());
             }
 
-            $message = $this->plugin->get_lang('AuthentifyFailed');
-
             $authTokenRequest = new ApiRequest();
             $authTokenResponse = $authTokenRequest->createAuthenticationSessionToken($user);
 
@@ -210,8 +219,8 @@ class AuthenticationController extends BaseController
             if ($maxAttempts && $failedLogins >= $maxAttempts) {
                 $message .= PHP_EOL
                     .''.$this->plugin->get_lang('MaxAttemptsReached').''
-                    .PHP_EOL
-                    .'
'
+                    .PHP_EOL.PHP_EOL
+                    .''
                     .$this->plugin->get_lang('LoginWithUsernameAndPassword')
                     .'';
 
@@ -224,7 +233,7 @@ class AuthenticationController extends BaseController
                 $message .= PHP_EOL.$this->plugin->get_lang('TryAgain');
 
                 if ('true' === api_get_setting('allow_lostpassword')) {
-                    $message .= '
'
+                    $message .= PHP_EOL
                         .Display::url(
                             get_lang('LostPassword'),
                             api_get_path(WEB_CODE_PATH).'auth/lostPassword.php',
@@ -235,7 +244,7 @@ class AuthenticationController extends BaseController
         }
 
         $result['resultHtml'] = Display::return_message(
-            $message,
+            nl2br($message),
             $success ? 'success' : 'warning',
             false
         );
diff --git a/plugin/whispeakauth/Request/ApiRequest.php b/plugin/whispeakauth/Request/ApiRequest.php
index 9ce90be4ce..5295135527 100644
--- a/plugin/whispeakauth/Request/ApiRequest.php
+++ b/plugin/whispeakauth/Request/ApiRequest.php
@@ -116,29 +116,23 @@ class ApiRequest
 
         $langIso = api_get_language_isocode($user ? $user->getLanguage() : null);
 
-        try {
-            $this->sendRequest(
-                'post',
-                'auth',
-                $token,
-                $langIso,
+        $this->sendRequest(
+            'post',
+            'auth',
+            $token,
+            $langIso,
+            [
                 [
-                    [
-                        'name' => 'speaker',
-                        'contents' => $wsid->getValue(),
-                    ],
-                    [
-                        'name' => 'file',
-                        'contents' => fopen($audioFilePath, 'r'),
-                        'filename' => basename($audioFilePath),
-                    ],
-                ]
-            );
-
-            return true;
-        } catch (\Exception $e) {
-            return false;
-        }
+                    'name' => 'speaker',
+                    'contents' => $wsid->getValue(),
+                ],
+                [
+                    'name' => 'file',
+                    'contents' => fopen($audioFilePath, 'r'),
+                    'filename' => basename($audioFilePath),
+                ],
+            ]
+        );
     }
 
     /**
@@ -180,12 +174,20 @@ class ApiRequest
             $responseBody = $requestException->getResponse()->getBody()->getContents();
             $json = json_decode($responseBody, true);
 
-            if (empty($json['message'])) {
-                throw new \Exception($requestException->getMessage());
+            $message = '';
+
+            if (isset($json['asserts'])) {
+                foreach ($json['asserts'] as $assert) {
+                    if (in_array($assert['value'], ['valid_audio', 'invalid_audio'])) {
+                        $message .= $assert['message'].PHP_EOL;
+                    }
+                }
+            } elseif (empty($json['message'])) {
+                $message = $requestException->getMessage();
+            } else {
+                $message = is_array($json['message']) ? implode(PHP_EOL, $json['message']) : $json['message'];
             }
 
-            $message = is_array($json['message']) ? implode(PHP_EOL, $json['message']) : $json['message'];
-
             throw new \Exception($message);
         } catch (Exception $exception) {
             throw new \Exception($exception->getMessage());