Rapport
Rapport
UNIVERSITE DE SOUSSE
Réalisé par :
Hertelli Dhia Eddine
Société d’accueil
ALAVOIP
Année universitaire : 2023/2024
Institut Supérieur d'Informatique et des Technologies de Communication ISITCOM
Réalisé par :
Hertelli Dhia Eddine
Société d’accueil
ALAVOIP
Année universitaire : 2023/2024
Institut Supérieur d'Informatique et des Technologies de Communication ISITCOM
J’adresse mes remerciements les plus sincères à ma famille pour leur amour incondi-
tionnel, leur patience et leur soutien indéfectible tout au long de mes études. Je tiens tout
particulièrement à remercier mon père, Najeh, et ma mère, Faiza, qui m’ont énormément
aidé et soutenu tout au long de ce parcours. Leur dévouement et leurs encouragements ont
été une source constante de motivation. De plus, je souhaite à ma sœur, Siwar, beaucoup
de succès dans ses études et la réussite dans son baccalauréat. Sa détermination et son
engagement sont exemplaires, et je suis convaincu qu’elle atteindra tous ses objectifs.
Je tiens à exprimer ma profonde gratitude à toutes les personnes qui ont contribué
à la réalisation de ce projet de fin d’études. Tout d’abord, je remercie chaleureusement
mon superviseur, M. Ala Eddine Hertelli, pour ses conseils avisés, son soutien constant
et ses encouragements tout au long de cette aventure. Son expertise et ses commentaires
constructifs ont été inestimables pour l’aboutissement de ce travail.
Je souhaite également remercier les membres du jury pour leur temps et leur considé-
ration.
Un grand merci à mes collègues et amis pour leur aide, leurs idées et leur soutien
moral. Leurs discussions stimulantes et leur collaboration ont grandement enrichi ce
travail.
Enfin, je voudrais exprimer une pensée spéciale pour ma grand-mère "Chadlia", qui nous
a quittés la semaine dernière. J’espère que vous aurez une pensée pour elle dans vos
prières. Son absence est douloureusement ressentie, et elle restera à jamais dans nos
cœurs.
DhiaEddine Hertelli
.
LISTE DES ABRÉVIATIONS
Introduction Generale 10
1 ETUDE PRÉALABLE 12
Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.1 Organisme d’accueil . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.1.1 Présentation de la société . . . . . . . . . . . . . . . . . . . . . 12
1.2 Présentation du projet . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.2.1 Contexte Général . . . . . . . . . . . . . . . . . . . . . . . . 12
1.2.2 Objectifs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.3 Etude de l’existant . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
1.3.1 Analyse de l’existant . . . . . . . . . . . . . . . . . . . . . . . 13
1.3.2 Critiques de l’existant . . . . . . . . . . . . . . . . . . . . . . 13
1.3.3 Solution proposée . . . . . . . . . . . . . . . . . . . . . . . . 14
1.4 Capture des besoins . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.4.1 Identifications des acteurs . . . . . . . . . . . . . . . . . . . . 14
1.4.2 Identifications des Besoins fonctionnels . . . . . . . . . . . . . 14
1.4.3 Identifications des Besoins non fonctionnels . . . . . . . . . . 15
1.5 Méthodologie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
1.5.1 Présentation de la méthode SCRUM . . . . . . . . . . . . . . 15
1.5.2 Les différents rôles dans Scrum . . . . . . . . . . . . . . . . . 17
1.5.3 Les artéfacts de la méthode Scrum Agile . . . . . . . . . . . . 17
1.6 Gestion de projet selon la méthodologie Scrum . . . . . . . . . . . . . 18
1.6.1 Le Backlog de produit . . . . . . . . . . . . . . . . . . . . . . 18
1.6.2 Planification des sprints . . . . . . . . . . . . . . . . . . . . . 18
1.6.3 Planning du déroulement du projet . . . . . . . . . . . . . . . . 19
1.7 Diagramme de cas d’utilisation général . . . . . . . . . . . . . . . . . 20
1.8 Environnement de travail . . . . . . . . . . . . . . . . . . . . . . . . . 21
5
1.8.1 Technologies et frameworks utilisés . . . . . . . . . . . . . . . 21
1.8.2 Les outils et les logiciels utilisés . . . . . . . . . . . . . . . . . 23
1.9 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
Bibliographie 46
Table des figures
2.1 VoIP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
2.2 diagramme de cas d’utilisation d’authentification . . . . . . . . . . . . 27
2.3 Diagramme de cas d’utilisation de gestion des appels . . . . . . . . . . 28
2.4 diagramme de séquence de gestion d’un appel . . . . . . . . . . . . . . 30
2.5 install Asterisk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
2.6 Fichiers Asterisk . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
2.7 [Link] 1000 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
2.8 [Link] appel . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
2.9 procédure d’un appel dans Asterisk . . . . . . . . . . . . . . . . . . . . 33
7
3.9 Speech API key . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
3.10 python_asterisk_chatgpt.py . . . . . . . . . . . . . . . . . . . 43
3.11 bibliothèque asterisk_chatgpt.py . . . . . . . . . . . . . . . . 43
3.12 key openAI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
3.13 voicebot [Link] . . . . . . . . . . . . . . . . . . . . . . . . . 44
Liste des tableaux
9
Introduction Generale
10
Résumé
Ce projet, entrepris au sein de l’entreprise ALAVOIP, représente le travail de fin
d’études dans le cadre de l’obtention du diplôme de licence en télécommunication. Son
objectif est de mettre en place, de configurer et de développer un serveur VoIP (Voice
over IP) pour réaliser un voicebot intégrant des fonctionnalités d’intelligence artificielle.
Pour atteindre cet objectif, diverses technologies sont employées. Nous incluons
notamment Python,Perl, PuTTY, ainsi que la méthodologie Scrum pour la gestion de
projet.
11
Chapitre 1
ETUDE PRÉALABLE
Introduction
Avant d’attaquer pleinement le volet technique du projet, il est fondamental de
dégager le contexte général du travail ainsi que de spécifier la problématique et les
objectifs visés. Les détails y afférents font l’objet de la présentation de ce chapitre.
12
peut rendre la recherche difficile et chronophage. Développer un serveur intelligent
utilisant l’intelligence artificielle pour répondre aux demandes des utilisateurs de manière
précise et personnalisée permet de relever ces défis et d’améliorer l’expérience utilisateur.
1.2.2 Objectifs
L’objectif de ce projet est de développer un outil permettant de :
— Trouver une solution digitale qui s’intègre aux appels téléphoniques. En d’autres
termes, il s’agit de formuler des demandes vocales et de recevoir des réponses de
manière automatique, sans nécessiter d’interaction humaine.
— Configurer et Développer un serveur pour réaliser un voicebot qui utilise l’intelli-
gence artificielle pour répondre verbalement aux questions des clients
— Lancer des appels et des communications vocales entre deux utilisateurs.
— Mettre en œuvre un système capable de comprendre les requêtes des clients lors
d’appels téléphoniques.
— Organiser les appels entrants et sortants pour assurer une réponse efficace aux
clients.
— Réduire les temps d’attente des clients en leur fournissant des réponses rapides et
efficaces à leurs interrogations.
— Assurer la confidentialité et la sécurité des données des clients tout au long de leurs
interactions avec le système.
13
plus, Amelia n’opère pas toujours en temps réel, ce qui peut entraîner des retards dans
ses réponses et frustrer les utilisateurs. Enfin, la précision de la reconnaissance vocale
peut parfois être insuffisante, affectant la qualité de l’interaction et la fiabilité de l’outil.
14
1.4.3 Identifications des Besoins non fonctionnels
— Le système doit être sécurisé pour protéger les données des utilisateurs.
— Le système doit être capable de répondre rapidement aux requêtes des utilisateurs
et de gérer un grand nombre d’interactions simultanées avec efficacité.
— Le système doit être facile à maintenir.
1.5 Méthodologie
Afin d’assurer le succès de tout projet et promouvoir une collaboration harmonieuse,
il est crucial de choisir la méthodologie appropriée. La méthodologie de travail organise
la planification et le contrôle du processus de développement, ce qui améliore l’efficacité
et la rentabilité du projet. Dans notre projet en partenariat avec ALAVOIP, nous avons
décidé d’adopter la méthodologie agile Scrum.
15
F IGURE 1.1 – Le process de Scrum
16
1.5.2 Les différents rôles dans Scrum
La méthodologie agile Scrum assigne des rôles spécifiques à chaque participant du
processus de développement logiciel. Dans la présentation du projet, l’attribution des
rôles SCRUM est exposée ci-jointe.
17
1.6 Gestion de projet selon la méthodologie Scrum
1.6.1 Le Backlog de produit
18
F IGURE 1.2 – Planification des sprints
19
1.7 Diagramme de cas d’utilisation général
En utilisant le Langage de Modélisation Unifié (UML), un diagramme de cas d’utili-
sation résume les interactions entre les utilisateurs (appelés acteurs) et le système. Ces
cas d’utilisation décrivent les besoins fondamentaux du système du point de vue de
l’utilisateur, en mettant en avant les actions qu’ils peuvent entreprendre pour atteindre
leurs objectifs. Ce type de diagrammes est facile à comprendre pour les utilisateurs et les
développeurs car il se concentre sur les actions principales sans entrer dans les détails. Il
récapitule simplement certaines des relations entre les cas d’utilisation, les acteurs et les
systèmes. Il n’illustre pas l’ordre dans lequel les étapes sont exécutées pour atteindre les
objectifs de chaque cas d’utilisation
Dans notre cas, l’acteur qui est l’utilisateur a le droit de gérer les appels, communiquer
et gérer les demandes à voicebot. La figure suivante illustre notre diagramme de cas
d’utilisation général.
20
1.8 Environnement de travail
1.8.1 Technologies et frameworks utilisés
SIP
Firewall
21
Python
Python [3] est un langage de programmation, de haut niveau interprété par la plupart.
Conçu pour être simple et lisible, il est largement utilisé dans divers domaines, allant du
développement web à l’analyse de données.
Perl
Perl [4] est un langage de programmation polyvalent et puissant, créé par Larry Wall
en 1987. Conçu initialement pour la manipulation de texte. Perl a évolué pour inclure une
large gamme de fonctionnalités, allant de l’administration système au développement
web en passant par la gestion de bases de données.
L’AGI [5] ou "Asterisk Gateway Interface", est une interface permettant à Asterisk,
un logiciel de téléphonie, d’interagir avec des scripts ou des programmes externes
pendant la gestion des appels. En utilisant l’AGI, les développeurs peuvent écrire des
22
scripts dans des langages comme Perl, Python ou PHP pour étendre les fonctionnalités
d’Asterisk. Ces scripts peuvent effectuer diverses tâches telles que la lecture de bases de
données, l’envoi de messages, ou l’interaction avec d’autres systèmes, permettant ainsi
une personnalisation et une automatisation des processus de téléphonie.
Putty
Putty [7] est un logiciel open-source qui permet aux utilisateurs de se connecter à
distance à des serveurs via des protocoles tels que SSH, Telnet et RDP. Il offre une
interface utilisateur simple et intuitive, permettant aux utilisateurs de saisir l’adresse IP
et le nom d’hôte du serveur auquel ils souhaitent se connecter, ainsi que le port et le
protocole appropriés.
23
linphone
Linphone [8] est une application open source de VoIP (Voice over Internet Protocol)
qui permet aux utilisateurs de passer des appels audio et vidéo, ainsi que d’envoyer des
messages texte via Internet. Compatible avec divers systèmes d’exploitation, y compris
Windows, macOS, Linux, Android et iOS,
1.9 Conclusion
Dans ce chapitre, nous avons d’abord présenté l’objectif de notre travail et nous avons
fait l’analyse des solutions existantes. Ensuite, nous avons discuté des fonctionnalités
et des exigences techniques, ainsi que de notre plan de travail. Enfin, nous avons expli-
qué notre approche de conception et de développement du système, en détaillant son
architecture et en présentant notre environnement de travail.
24
Chapitre 2
Introduction
Dans ce chapitre, les détails relatifs au travail réalisé lors du premier Sprint sont
rapportés. On rappelle à cet effet que ce dernier est consacré à configurer des utilisateurs,
au niveau du serveur dédié aux appels téléphoniques, ainsi que la gestion des appels.
Avant de commencer, nous allons définir ce qu’est un serveur Asterisk.
25
VOIP (Voice Over Internet Protocole [9]), c’est une technologie qui permet de
transmettre des appels téléphoniques via internet ou tout autre réseau utilisant le protocole
IP. (internet protocole)
Lorsqu’un utilisateur passe un appel téléphonique en utilisant la VoIP, son appareil
compatible VoIP collecte le contenu audio (et éventuellement vidéo) de l’appel et l’envoie
au téléphone du destinataire via Internet. Au lieu d’utiliser les lignes téléphoniques
traditionnelles, la VOIP convertit la voix en paquets de données numérique qui sont
ensuite envoyer sur un réseau IP .
ID Thème Estimation
1 s’authentifier (1)
2 lancer des appels (3)
3 communiquer (1)
4 terminer des appels (2)
5 voir l’historique des appels (2)
26
Cas d’utilisation d’authentification
27
Cas d’utilisation de gestion des appels
Le tableau 2.3 décrit la description textuelle du cas d’utilisation « Gestion des appels
»
28
Cas d’utilisation Gestion des appels
Acteur L’utilisateur
Description Ce diagramme décrit la gestion des appels
Précondition Le client doit s’authentifier au serveur asterisk à travers linephone
Scénario 1-Une fois authentifié, le client sélectionne l’option pour passer un appel.
2-Le client compose le numéro configuré dans le serveur Asterisk en
utilisant le clavier numérique de Linephone.
3-Après avoir composé le numéro, le client appuie sur le bouton d’appel
pour initier l’appel.
4-Le serveur Asterisk traite l’appel et recherche l’utilisateur correspon-
dant au numéro composé.
5-L’utilisateur destinataire de l’appel reçoit une notification et décide de
répondre à l’appel.
6-Une fois que l’utilisateur destinataire a répondu, le client et l’utilisateur
se communiquent vocalement.
7-Après la communication, le client appuie sur le bouton pour terminer
la session d’appel.
8-L’appel se termine et le client revient à l’interface principale de Line-
phone.
9-Ensuite, si le client le souhaite, il peut accéder à l’historique des appels
dans l’application Linephone pour consulter les appels passés.
Scénario exceptionnelle Si les informations saisies par le client sont incorrectes, l’appel ne sera
pas établi.
TABLE 2.3 – Description textuelle de diagramme de cas d’utlisation "Gestion des appels
29
F IGURE 2.4 – diagramme de séquence de gestion d’un appel
30
2.1.4 Étapes de mise en œuvre
Installation du serveur Asterisk
On a utilisé cette commande dans notre terminal pour installer Asterisk.
Parmi tous ces fichiers, nous accorderons une attention particulière à la configuration
des fichiers "[Link]" et "[Link]". Ce sont ces deux fichiers qui seront configurés
pour mettre en place les appels sur le serveur Asterisk.
Configuration [Link]
Dans le fichier [Link], nous allons configurer les utilisateurs Asterisk, notamment
les utilisateurs 1000, 2000 et 5000. Ces paramètres représente les id des utilisateurs,
ils sont interprétés analogiquement a des numéros téléphoniques. Cette configuration
comprendra des paramètres tels que le type d’utilisateur, le contexte, l’hôte, le mot de
passe.
31
F IGURE 2.7 – [Link] 1000
Configuration [Link]
Dans le fichier [Link], nous allons définir les règles de composition pour
gérer les appels téléphoniques. Pour le premier scénario entre les utilisateurs 1000 et
5000, nous allons créer une extension dans le contexte approprié. Cette extension définira
comment Asterisk doit acheminer les appels entre ces utilisateurs. Par exemple, nous
pouvons utiliser l’instruction Dial pour appeler le numéro de l’utilisateur 5000 lorsque
l’utilisateur 1000 compose son numéro.
Ce scénario réduit est dédié pour lancer des appels téléphoniques entre deux utilisateurs.
32
2.1.5 Procédure d’un appel dans Asterisk
— L’utilisateur 1000 lance un appel, et le protocole SIP envoie une requête SIP au
serveur pour initier l’appel.
— Asterisk vérifie le fichier [Link] pour s’assurer que l’utilisateur 1000 est configuré
et authentifié dans [Link].
— Une fois l’utilisateur 1000 authentifié, Asterisk utilise le contexte défini (dans ce
cas, "internal") pour déterminer comment traiter l’appel. Le contexte "internal"
indique à Asterisk de regarder dans la section [internal] du fichier [Link].
— Asterisk trouve l’entrée exten => 5000,1,Dial(SIP/5000) qui indique comment
traiter l’appel. Asterisk exécute la commande Dial(SIP/5000), ce qui tente de
connecter l’appel à l’utilisateur SIP 5000.
33
Conclusion
Dans ce chapitre, nous avons exploré le premier sprint, couvrant les phases d’analyse,
de conception et de réalisation de la gestion des appels. Dans le chapitre suivant, nous
nous pencherons sur le deuxième sprint.
34
Chapitre 3
Introduction
Dans ce chapitre, les détails relatifs au travail réalisé lors du deuxième Sprint sont
rapportés. On rappelle à cet effet que ce dernier est consacré à configurer le voicebot au
niveau du serveur. Nous débuterons par une définition détaillée de "Asterisk Gateway
Interface" (AGI).
35
une organisation optimales. agi-bin dans Asterisk signifie "Asterisk Gateway Interface
binaries".
ID Thème Estimation
1 lancer un appel vers voicebot (3)
2 demander une question (4)
3 recevoir une information (4)
Spécification fonctionnelle
Dans cette partie de ce deuxième sprint, on commence avec les diagrammes de cas
d’utilisation de gestion des demandes au niveau voicebot.
36
F IGURE 3.2 – diagramme de cas d’utilisation gérer une demande de voicebot
37
Cas d’utilisation Gestion des demandes Voicebot
Acteur L’utilisateur
Description Ce diagramme décrit la gestion des demandes Voicebot
Précondition Le client doit lancer un appel vers le numéro du voicebot
Scénario 1. L’utilisateur compose le numéro du voicebot configuré dans le
serveur Asterisk.
2. Le serveur Asterisk répond à l’appel et diffuse un message de
bienvenue, invitant l’utilisateur à poser sa question.
3. L’utilisateur demande un service en posant une question vocale-
ment.
4. Le message vocal est transformé en texte à l’aide d’un service
de reconnaissance vocale (Speech-to-Text).
5. Le texte de la question est transmis à un moteur d’IA tel que
ChatGPT pour traitement.
6. Le moteur d’IA analyse la question et génère une réponse ap-
propriée.
7. La réponse textuelle est renvoyée au serveur.
8. La réponse est transformée en message vocal à l’aide d’un ser-
vice de synthèse vocale (Text-to-Speech).
9. Le voicebot diffuse la réponse vocale à l’utilisateur.
Postcondition L’utilisateur pourra poser des questions vocalement et recevoir des
informations en temps quasi-réel.
TABLE 3.2 – Description textuelle du cas d’utilisation "Gestion des demandes Voicebot"
38
F IGURE 3.3 – diagramme de séquence gestion demande voicebot
39
F IGURE 3.4 – scénario d’une interaction avec voicebot dans le serveur
Parmi les fichiers placés dans le répertoire /var/lib/asterisk/agi-bin, nous avons parti-
culièrement détaillé [Link] et [Link] pour la réalisation de notre
projet. Ces deux scripts jouent un rôle crucial dans la création du voicebot. Le script goo-
[Link] est utilisé pour la conversion de texte en parole (Text-to-Speech), tandis que
[Link] est dédié à la reconnaissance vocale et à la conversion de parole en
texte (Speech-to-Text). Ensemble, ces scripts permettent d’intégrer des fonctionnalités
avancées de traitement vocal, essentielles pour le fonctionnement efficace et interactif du
voicebot.
40
3.2.1 [Link]
Le script [Link] est une composante essentielle de notre voicebot, jouant un
rôle clé dans la conversion de texte en parole (Text-to-Speech). Écrit en Perl, ce script
utilise l’Asterisk Gateway Interface (AGI) pour interagir directement avec le système
téléphonique Asterisk
Il permet de lire des textes écrits en anglais, offrant ainsi une interaction vocale fluide
et naturelle. Perl est choisi pour sa flexibilité et ses capacités robustes de manipulation de
texte. [Link] utilise des bibliothèques bien connues telles que LWP : :UserAgent
pour effectuer des requêtes HTTP vers les services Google Text-to-Speech, permettant
de transmettre efficacement le texte et de recevoir l’audio en réponse.
3.2.2 [Link]
Le script [Link] représente une pièce maîtresse de notre système de voice-
bot, axé sur la reconnaissance vocale (Speech-to-Text). Écrit en Perl, ce script permet de
convertir la parole en texte, facilitant ainsi une interaction utilisateur intuitive et efficace.
Perl a été sélectionné pour sa souplesse et sa capacité à manipuler efficacement les
données textuelles.
le service utilisé par le script pour réaliser la conversion de la parole en texte est Goo-
gle’s Speech API (Speech-to-Text). Ce service, également connu sous le nom de Google
41
Cloud Speech-to-Text API, fournit des fonctionnalités avancées de reconnaissance vocale,
permettant de transcrire de l’audio en texte avec précision et fiabilité
42
3.2.3 asterisk_chatgpt.py
Ce script est écrit en python et utilise lAPI d Open AI pour obtenir des réponses de
ChatGpt . Python a été utilisé pour ce script en raison de sa simplicité et de sa lisibilité,
ce qui le rend idéal pour des tâches de traitement de texte et d’interaction avec des API.
Python dispose de bibliothèques robustes, telles que requests pour les requêtes HTTP et
des SDK comme openai, qui facilitent l’intégration avec des services web comme l’API
d’OpenAI
Ce code utilise une clé API OpenAI pour s’authentifier et accéder à l’API ChatGPT
d’OpenAI, permettant ainsi d’envoyer des requêtes et d’obtenir des réponses de l’IA. La
clé API est une chaîne de caractères unique qui identifie le compte et l’application, et
est nécessaire pour que l’API accepte les requêtes et fournisse des réponses. l’image ci
dessous représente la clé API
43
F IGURE 3.12 – key openAI
Conclusion
Dans ce chapitre, nous nous sommes concentrés sur le deuxième sprint. Nous avons
effectué une analyse approfondie des phases d’analyse, de conception et de réalisation,
indispensables pour atteindre les objectifs fixés.
44
Conclusion
Dans le cadre de notre projet de fin d’études, nous avons configuré un serveur Asterisk
afin de réaliser un voicebot avec intelligence artificielle. L’importance de mon projet
réside dans sa capacité à rendre l’information plus accessible et plus facilement disponible
pour les utilisateurs, contribuant ainsi à améliorer leur expérience et leur [Link]
utilisateurs peuvent obtenir les informations dont ils ont besoin rapidement et facilement,
sans avoir à parcourir de multiples sources ou à effectuer des recherches fastidieuses en
ligne. Cette facilité d’accès à l’information permet d’économiser du temps et des efforts
pour les utilisateurs.
Bien que le voicebot que nous avons développé soit capable de répondre efficacement
aux questions des utilisateurs en anglais, sa capacité à comprendre et à répondre dans une
seule langue reste un domaine d’amélioration significatif. Nous sommes conscients de
l’importance croissante de la multilinguisme dans notre société-Monde, et nous sommes
déterminés à poursuivre le développement du projet pour le rendre capable de comprendre
et de répondre dans plusieurs langues.
45
Bibliographie
[5]agi :[Link]
01/[Link] [En ligne consulté le 27-04-2024]
46
[9] VoIP : [Link]
08/[Link] [En ligne consulté le 23-05-2024]
47