Gaza, perle de l’Orient objet de toutes les convoitises

/gaza-cette-perle-de-l-orient-objet-de-t

  • Je viens de développer une fonction pour #SPIP qui regarde si une image (tirée de spip_documents) a son champ alt renseigné, et si ce n’est pas le cas, demande à ChatGPT de la décrire. Et la réponse est alors stockée dans le champ alt du document. (Il faut donc deux recalculs pour afficher la description de l’image sur le site.) De fait, une fois que la description a été obtenue, ça n’interroge plus l’API de ChatGTP, et si on y tient on peut corriger dans l’interface de SPIP.

    L’intérêt, c’est que tout le monde réclame d’avoir un site accessible, mais si les gens ne décrivent pas les images, hé ben c’est mort. Et les gens ne renseignent pas les champs « alt », parce que c’est du contenu qui n’est pas visible. D’où l’idée de demander à un robot de le faire.

    Pour l’instant c’est très basique, parce que je suis en train de bidouiller. Idéalement, à la fin, ça deviendrait un plugin qui fait le café.

    Évidemment, il faut un compte pour l’API chez OpenAI. Ça n’implique pas un abonnement à ChatGPT, on ne paie que pour l’utilisation de l’API (et c’est vraiment pas cher : si j’ai bien compris, avec ce modèle, c’est $0.000425 par image décrite, c’est-à-dire 9 cents pour 200 images décrites).

    function openai_vision($id, $lang = "fr") {
       $api_key = "sk-.......";
       $model = "gpt-4o-mini";

       if ($lang == "en") $prompt = "Describe this image in english";
       else if ($lang == "es") $prompt = "Describe esta imagen en español";
       else if ($lang == "it") $prompt = "Descrivi questa immagine in italiano";
       else if ($lang == "ar") $prompt = "وصف هذه الصورة باللغة العربية";
       else if ($lang == "fa") $prompt = "این تصویر را به فارسی توصیف کنید";
       else $prompt = "Décris cette image en français";

       $query = sql_select(
                    "alt, fichier",
                    "spip_documents", "id_document=$id");
            if ($row = sql_fetch($query)) {
                    $alt = $row["alt"];
           $fichier = $row["fichier"];

           if (strlen($alt) > 0) {
               return $alt;
           } else {
               // Interroger OpenAI
               $fichier = url_absolue(_DIR_IMG.$fichier);
               

               $curl = curl_init();

               curl_setopt($curl, CURLOPT_URL, "https://api.openai.com/v1/chat/completions");
               curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
               curl_setopt($curl, CURLOPT_POST, true);
               
               $jsonData = json_encode(
                   [
                       'model'=> $model,
                       "messages"=>
                       [
                           [
                               "role"=> "user",
                               "content"=>
                               [
                                   [
                                       "type"=> "text",
                                       "text"=> $prompt
                                   ],
                                   [
                                       "type"=> "image_url",
                                       "image_url" => [
                                           "url"=> $fichier,
                                           "detail" => "low"
                                       ]
                                   ]
                               ]
                           ]
                       ],
                       "max_tokens"=> 300
                     ]                          
               );
               curl_setopt($curl, CURLOPT_POSTFIELDS, $jsonData);
               curl_setopt($curl, CURLOPT_HTTPHEADER, array(
                   'Content-Type: application/json',
                   'Authorization: Bearer ' . $api_key
               ));

               $response = curl_exec($curl);
               curl_close($curl);      
           
               $response = json_decode($response, true);
               $new_alt = $response["choices"][0]["message"]["content"];

               if (strlen($new_alt) > 0) {
                   sql_updateq(
                                            "spip_documents",
                                            array(
                                                    "alt" => $new_alt
                                            ),
                                            "id_document=$id"
                       );       
               } else {
                                    return json_encode($response) ;
                            }
               return "[OPENAI] $new_alt";
           }
       }
    }

    Que j’appelle actuellement avec une boucle dans la page article.html :

            <!--
                                                            <BOUCLE(DOCUMENTS){id_article}{mode=logoon}>
                                                                    [(#ID_DOCUMENT|openai_vision{#LANG})]
                                                             </BOUCLE>
                                                             -->