Utilisateur:Thomas : Différence entre versions

De Design numérique
Aller à : navigation, rechercher
m (Philippe ?)
m (Philippe ?)
Ligne 777 : Ligne 777 :
 
* Candide
 
* Candide
 
* Charlie (apparemment le mieux réparti au niveau de la parité [https://www.parents.fr/prenoms/nos-selections-de-prenoms/les-prenoms-mixtes-80014])
 
* Charlie (apparemment le mieux réparti au niveau de la parité [https://www.parents.fr/prenoms/nos-selections-de-prenoms/les-prenoms-mixtes-80014])
 +
* Yaël (bien réparti aussi)
 
* Céleste
 
* Céleste
 
* Andrea
 
* Andrea
* Louison
+
* Louison (lui aussi)
 
* Mahé
 
* Mahé
 
* Gwen
 
* Gwen
 
* Loan
 
* Loan
 
* Philippe (apparemment très rarement féminin)
 
* Philippe (apparemment très rarement féminin)

Version du 3 avril 2020 à 15:24

Scan to OCR

Comment une machine peut-elle reconnaître du texte ?

Trouver le pourcentage de pixels noir pour détecter les blocs de texte ? Traiter chaque bloc séparément pour trouver quel alphabet il faut essayer de détecter dans quel bloc ?

Comment une machine peut-elle "lire" une page ?

Si elle reconnaît les caractères, elle ne reconnaît pas les mots. Elle lirait donc les caractères un par un dans un bloc donné, puis passerait au suivant sans interruption. Il y aurait une sorte de condensation de tous les caractères dans une sorte de ligne infinie sans pause (comme le résultat de base que donne Tesseract : un fichier texte avec la chaîne de caractères reconnus sans interruption). C'est ce que la machine "peut" lire. Puisque la machine ne comprendrait pas non plus le sens des lettres (bien qu'un logiciel de text-to-speech reconnaît les mots et peut les lire) , (elle les connaît sous forme d'Unicode), elle pourrait aussi lire chaque "code" Unicode de chaque caractère à la suite. Dans le document que j'ai passé dans Tesseract il y a beaucoup de langues et d'alphabets différents, donc la variante Unicode serait plus "logique" (je ne sais pas si le text-to-speech peut gérer plusieurs langues en même temps. Ceci dit, cela fait partie de la façon dont une machine fonctionne, une fois qu'elle est lancée elle ne peut pas s'arrêter pour remarquer un changement, sauf si on le lui indique. Graphiquement cela pourrait se traduire par une grille de caractères dans une fonte monospace, chacun caractère étant dans un carré de mêmes dimensions. on aurait alors du texte "matriciel", fonctionnant case par case et compliqué à lire pour un humain, qui ne saurait plus où commencer et où arrêter les mots.


c o m p l i q u é à l i r e p o u r u n h u m a i n

Pour faire lire le texte par la machine avec un programme en python, on utilise le module pypiwin32 qui permet d'importer win32com (une bibliothèque de Windows ?). Il faut l'installer avec pip (Python Install Packages je crois) (attention aux histoires de windows 32 ou 64 bits et python 32 ou 64 bits, je crois que tout marche avec les versions 32 bits python).

import win32com.client as wincl
speak = wincl.Dispatch("SAPI.SpVoice")
speak.Speak(lecture)

Ce bout de script permet de lire le contenu de la variable lecture, qui est un chaîne de caractère tirée d'un fichier texte. On peut aussi écrire entre guillemets doubles les mots que l'on souhaite faire lire par le text-to-speech de Windows (je n'ai pas encore trouvé comment lire dans une langue différente ou avec une voix différente que la voix par défaut)


Je cherche le moyen de convertir chaque caractère en son code unicode (u220B par exemple) [1] -> lien vers les commandes unicode et encode en Python.

Je n'ai pas trouvé, donc j'ai simplement pu trouver une façon de convertir chaque caractère en hexadécimal, ce qui permet aussi aux text-to-speech de lire toutes les langues.

hex(ord('le caractère souhaité'))

Le code pour l'instant qui lit un fichier texte en hexadécimal :

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from time import sleep

f = open("multi.txt", "r")

file = f.read()

lecture = ""

#transforme chaque caractère en
for i in range(0, len(file)):
    u = hex(ord(file[i]))
    print(u)
    #sleep(0.5)
    lecture = lecture + u + " "

#pour faire lire le texte par la voix de l'ordi (on peut sûrement la changer)
import win32com.client as wincl
speak = wincl.Dispatch("SAPI.SpVoice")
speak.Speak(lecture)

f.close()

Il manque maintenant un moyen de visualiser les caractères dans le terminal, en même temps qu'ils sont lus par le programme. Affaire à suivre sous Linux ?

Problème résolu : sous Linux le module pyttsx3 pour python 3 permet plein de réglages de paramètres de la voix (vitesse, volume, genre, langue...) et on peut lui dire d'attendre la fin de sa lecture pour continuer le programme. J'ai donc fait un script python qui affiche le contenu d'un fichier texte lettre par lettre (fonctionne en utf-8) et lit chaque caractère selon son code hexadécimal (ici en français mais on peut changer la voix).

Résultat sous Linux :

#!/usr/bin/env python
# -*- coding: utf-8 -*-

f = open("multi.txt", "r")

file = f.read()

import pyttsx3
engine = pyttsx3.init()
voices = engine.getProperty('voices')
french_id = 'french'
engine.setProperty('voice', french_id)
engine.setProperty('rate', 150)

#transforme chaque caractère en hexadécimal
# + fait lire le texte par la voix de l'ordi (on peut sûrement la changer) mais affiche le caractère d'origine
for i in range(0, len(file)):
    u = hex(ord(file[i]))
    print(file[i])
    engine.say(u)
    engine.runAndWait()

f.close()

Traiter des fichiers avec Tesseract

Test du jour : utiliser Tesseract pour détecter toutes les langues en même temps Utiliser Google traduction pour trouver quel bloc (quel alphabet) appartient à quelle langue, pour pouvoir utiliser le bon code dans Tesseract [2] : le Github de Tesseract avec tous les codes de langues prises en charge par Tesseract.

La page que j'ai scannée est un mode d'emploi/conseils d'utilisation d'un matelas IKEA, avec beaucoup d'alphabets différents en simultané :

Test1.jpg
Test2.jpg


résultat de tesseract :

<!doctype html>
<html>
  <head>
  </head>
  <body>

Madraci od pjene i lateksa

Prije prve upotrebe

Možda se isprva madrac može učiniti

malo pretvrdim. Bit će potrebno mjesec
dana da se tijelo navikne na madrac i da
se madrac prilagodi tijelu. Za najveću
udobnost potreban je odgovarajući jastuk.
Zato je dobro imati jastuk koji odgovara
načinu spavanja i novom madracu. Neki
od madraca su rolo pakirani. Iako se mogu
odmah koristiti, svoj će pravi oblik, duljinu
i debljinu vratiti nakon 3 — 4 dana. Svi novi
materijali imaju poseban miris, ali on će
nakon nekog vremena nestati. To se može
i ubrzati prozračivanjem i usisavanjem
madraca.

Njega i čišćenje

Uz madrac je dobro koristiti zaštitu za
madrac. Ona je više higijenska jer se

lako skida i čisti. Puno naših madraca

ima navlaku koja se može prati. Za više
informacija potrebno je pročitati etiketu s
unutarnje strane navlake. Prilikom pranja
navlake za madrac potrebno je zatvoriti
patent-zatvarač. Usisavanjem madraca
uklanjaju se prašina i grinje. Madrac se

ne smije preklapati jer se tako može
oštetiti njegova unutrašnjost. Cak i oni
najbolji madraci s vremenom postaju
manje udobnima i svi madraci s vremenom
nakupljaju prašinu i grinje. Zato predlažemo
promjenu madraca svakih 8 - 10 godina.

中 文
泡沫 和 乳胶 床 垫

首次 使 用 前

起 初 , 您 的 新 床 墊 可 能 感覺 有 點 硬 。 要 有 一 個 月 的

时 间 ,让 您 的 身体 习惯 您 的 新 床 垫 ,您 的 新 床 垫 也

习惯 您 的 身体 . 为 了 获得 最 佳 的 舒适 度 , 您 需要 一
款 合 适 的 枕头 。 请 确保 您 拥有 一 款 适 合 您 和 您 床 垫
的 枕头 。 包装 成 卷 的 床 垫 在 使 用 3、4 天 后 会 恢复 原
状 。 所 有 新 才 有 都 有 各 自 的 特殊 气味 , 但 是 该 气味

จ 了 晾晒 床 垫 ,使 其 保持 通风 ,有 助 于 消

保养 和 清洁

将 床 垫 与 床 垫 保护 垫 并 用 . 这 样 ,更 清洁 卫生 , 因
为 床 垫 保护 垫 易 于 取 下 清洗 .。 我 们 的 许多 床 垫 都 有
可 拆洗 床 垫 套 . 可 阅读 床 垫 套 内 的 标签 了 解 更 多 详
情 . 洗涤 床 垫 套 时 ,请 确保 拉链 已 拉 合 . 对 床 垫 吸 尘
有 助 于 清楚 灰尘 和 螨虫 。 请 不 要 折 赤 床 垫 。 这 可 能
损坏 内 部 材料 。 即使 最 好 的 床 垫 也 会 随 着 岁月 的 流
逝 舒 适度 逐渐 降低 ,多 年 之 后 ,所 有 的 床 垫 都 会 积
聚 灰 和 侍 和 螨虫 . 因此 ,我 们 还 是 建议 您 在 8-10 年 后
更 换 您 的 床 垫 。

ไท ย
ท ี ่ น อ น โฟ ม แล ะ ท ี ่ น อ น ย า ง ал ІЙ пої

ข้ อ แน ะ น ํ า ก ่ อ น ก า ร ใช ้ ง า น ค ร ั ้ ง แร ก

โด ย ท ั ่ ว ไป แล ้ ว ท ี ่ น อ น ให ม ่ จ ะ แน ่ น เป ็ น พ ิ เศ ษ จ ึ ง ต ้ อ ง ใช ้
เว ล า ป ร ะ ม า ณ ห น ึ ่ ง เด ื อ น เพ ื ่ อ ให ้ ร ่ า ง ก า ย เค ย ชิ น ก ั บ ท ี ่ น อ น
ให ม ่ แล ะ ท ี ่ น อ น ป ร ั บ เข ้ า ก ั บ ร ่ า ง ก า ย ค ุ ณ น อ ก จ า ก ท ี ่ น อ น
ด ี ๆ แล ้ ว ห ม อ น เป ็ น อ ี ก ป ั จ จ ั ย ท ี ่ ท ํ า ให ้ ค ุ ณ น อ น ห ล ั บ ส บ า ย
ย ิ ง ขึ ้ น เล ื อ ก ห ม อ น ท ี ่ เห ม า ะ ก ั บ ค ุ ณ แ ล ะ ท ี ่ น อ น ให ม ่ ท ี ่ น อ น
บ า ง ร ุ ่ น ม ้ ว น บ ร ร จ ุ ใน ห ุ ่ อ พ ล า ส ต ิ ก แม ้ ส า ม า ร ถ แ ก ะ ใช ้ ได ้
ท ั น ท ี แต ่ ต ้ อ ง ใช ้ เว ล า 3-4 ว ั น ใน ก า ร ค ื น ร ู ป ท ร ง . ท ี ่ น อ น
ให ม ่ ม ั ก ม ี ก ล ิ น เฉ พ า ะ ขอ ง ว ั ส ด ุ ก า ร น ํ า ท ี ่ น อ น ไป ผึ่ง แล ะ ด ู ด
ฝุ ่ น ส า ม า ร ถ ข จ ั ด ก ล ิ น ได ้ เร ็ ว ขึ น

ข้ อ แน ะ น ํ า ใน ก า ร ด ู แล ร ั ก ษา แล ะ ท ํ า ค ว า ม ส ะ อ า ด

เล ื อ ก ใช ้ ผ้า ร อ ง ก ั น เป ื ้ อ น ท ี ่ น อ น เพ ื ่ อ ให ้ ท ี ่ น อ น ส ะ อ า ด แล ะ

ถู ก ส ุ ขอ น า ม ั ย ย ิ ง ขึ ้ น เพ ร า ะ ถอด ซั ก ท ํ า ค ว า ม ส ะ อ า ด ได ้ ง ่ า ย
ท ิ น อ น บ า ง ร ุ ่ น ถอด ผ้า ห ุ ้ ม อ อ ก ซั ก ได ้ ก ร ุ ณา อ ่ า น ข้ อ แน ะ น ํ า

ใน ก า ร ด ู แล ร ั ก ษา ท ี ่ น อ น จ า ก ป ้ า ย ส ิ น ค ้ า แล ะ ก ่ อ น ซั ก ผ้า ห ุ ้ ม
ท ี ่ น อ น ค ว ร ร ู ด ซิ ป ป ิ ด ผ้า ห ุ ้ ม ท ุ ก ค ร ั ้ ง ค ว ร ด ู ด ฝุ ่ น ท ี ่ น อ น เพ ื ่ อ

ก ํ า จ ั ด ไร ฝุ ่ น แล ะ ใช ้ น ํ า ย า ท ํ า ค ว า ม ส ะ อ า ด เบ า ะ เช ็ ด ค ร า บ

ส ก ป ร ก ไม ่ ค ว ร พ ั บ ท ี ่ น อ น เพ ร า ะ อ า จ ท ํ า ให ้ ส ป ร ิ ง แล ะ ว ั ส ด ุ

ภา ย ใน เส ี ย ห า ย ได ้ แต ่ ไม ่ ว ่ า ท ี ่ น อ น จ ะ ด ี เพ ี ย ง ใด เม ื ่ อ เว ล า

ผ่ า น ไป ก ็ อ า จ เส ื ่ อ ม ค ุ ณ ภ า พ ล ง ได ้ ต า ม อ า ย ุ ก า ร ใช ้ ง า น ท ั ้ ง
ย ั ง เป ็ น แห ล ่ ง ส ะ ส ม ไร ฝุ ่ น อ ี ก ด ้ ว ย จ ึ ง ค ว ร เป ล ี ่ ย น ท ี ่ น อ น ให ม ่
ท ุ ก ๆ 8-10 ป ี

Στρώματα Αφροῦΐῦ και Λάτεξ

Πριν απὸ την πρώτη χρήση

Στὴν арх! το καινούργιο σας ชา อ อ น ส

μπορεὶ να σας φαίνεται λίγο σκληρό. Δῶστε
περιθώριο περίπου ἑνα μήνα στο σὧμα σας

να συνηθίσει το στρώμα Και στο στρώμα να
προσαρμοστεὶ στο σώμα σας. Για να ἐχετε

τη μεγαλύτερη δυνατόν ἀνεση, Χρειάζεστε

το σωστὸ μαξιλάρι. Βεβαιωθείτε OTI ἐχετε

ἐνα μαξιλάρι που ταιριάζει σε εσάς ка! то
καινούργιο σας στρώμα. Μερικὰ απὸ τα
στρώματὰ μας εἶναι συσκευασμένα σε ρολό.
Μποροὺν να χρησιμοποιηθοὺν αμέσως, αλλά
θα ἐεπανακτήσουν το πλήρες σχήμα, μήκος Καὶ
πάχος μετά απὸ 3-4 ημέρες. Ὁλα τα καινούργια
и№Мка ἐχουν τη δική τους Ιδιαίτερη μυρωδιά,
η οποία σταδιακἀ εξαφανίζεται. Αερίζοντας
και καθαρίζοντας το στρώμα με την ηλεκτρικὴ
σκούπα, βοηθὰ στην εξάλειψη της μυρωδιάς.

Φροντίδα και καθάρισμα

Συμπληρώνοντας Το στρώμα σας με ἕνα
προστατευτικὸ στρώματος ἡ ανώστρωμα θα

το διατηρείτε πιο υγιεινό, καθὼς εἶναι εὐκολο
να το αφαιρέσετε και να το πλύνετε. Πολλά
από τα στρὡματά μας διαθέτουν κάλυμμα που
πλένεται. Διαβάστε το ταμπελάκι στο εσωτερικό
του καλύμματος για οδηγίες πλυσίματος.
Βεβαιωθείτε ὁτι το φερμουάρ εἶναι κλειστό
προτοὺ πλύνετε το κάλυμμα. Το σκούπισμα με
την ηλεκτρικὴ σκούπα βοηθά να αφαιρέσετε

τη σκόνη και Τα ακάρεα. Μη διπλώνετε Το
στρώμα, καθὼς μπορεὶ να φθείρει τα υλικά στο
εσωτερικό. Акора ка! та καλύτερα στρώματα
γίνονται λιγότερο ἀνετα με το πέρασμα του
χρόνου και συσσωρεύουν σκόνη και ακάρεα. ΓΙ’
ауто OQGC OUVIOTOUHUE VQ AAQCETE OTDQOUQ KaBE
8-10 xpovia.

每 中
泡 棉 / 乳 膠 床 墊

第 一 次 使用 前

新 床 墊 剛 使 用 時 感覺 可 能 偏 硬 ' 建議 至 少 給 你 的 身體
2 到 4 週 的 時 間 去 適應 新 床 墊 , 同 時 也 讓 新 床 墊 能 逐
漸 貼 合 你 的 身體 曲線 。 要 擁有 最 佳 舒 適 感 , 你 還 需要
選擇 對 的 枕頭 , 別 忘 了 確認 你 的 枕頭 適合 你 及 你 的 新
床 墊 ‧ 部 份 床 墊 採 捆 捲 式 包裝 , 使用 3-4 天 後 即 可 恢
复 既 有 长 度 及 厚度 。 初 次 打开 包装 可 能 会 闻 到 特殊 气
味 , 此 味道 將 隨時 間 逐 漸 消散 。 請 放心 使用 ! 這些 氣
味 經 實驗 證明 對 人 體 無 害 。 只 要 置 於 通風 良好 之 環
境 ' 並 使用 吸塵 器 即 可 有 效 降低 此 氣味 。

保養 與 清潔

在 床 墊 上 添加 保潔 墊 , 能 保持 床 墊 衛生 且 方便 清洗 。
多 款 床 墊 含 可 拆洗 式 布 套 ' 在 清洗 前 別 忘 了 參閱 布 套
內 側 的 清洗 標籤 ‧ 清 洗 時 請 記得 拉 上 拉鍊 。 建 議 使用
吸塵 器 清潔 床 墊 , 可 有 效 清 除 灰 塵 與 塵 虹 ‧ 請 勿 曲折
床 墊 , 這 麼 做 會 導致 床 墊 的 內 部 結構 受 損 。 經 過 長 時
間 的 使用 . 再 好 的 床 墊 舒適 度 也 會 遞減 , 灰 塵 與 塵 蝶
也 會 逐漸 累積 因此 ,. 基於 舒適 與 衛生 考量 , 我 们 建
議 每 隔 8 到 10 年 更 換 新 的 床 墊 。

Матрасы из пенополиуретана и
латекса

Перед началом использования
Первое время матрас может показаться
вам слишком жестким. Чтобы
привыкнуть к новому матрасу, вам
может потребоваться около месяца.

Оптимальный комфорт обеспечит

правильно подобранная подушка.
Некоторые матрасы из нашего
ассортимента упакованы в рулон. Такой
матрас можно использовать сразу после
покупки, но полностью он восстановит
свою форму, длину и толщину через
3-4 дня использования. Материал
обладает характерным запахом, который
постепенно исчезнет. Проветривайте и
пылесосьте матрас, чтобы запах исчез
полностью.

Уход

Дополните матрас наматрасником,
который легко снять и постирать. Многие
матрасы из ассортимента ИКЕА продаются
со съемными чехлами, которые можно
стирать. Подробная информация по
уходу представлена на этикетке внутри
чехла. Во время стирки молния на чехле
должна быть закрыта. Чистка пылесосом
удаляет пыль и пылевых клещей. Не
складывайте матрас, это может повредить
его. Даже самый хороший матрас со
временем становится менее удобным, в
нем скапливается пыль и пылевые клещи.
Поэтому мы рекомендуем менять матрас
каждые 8-10 лет.

한국어
폼 매 트 리 스 와 라텍스 매트리스

사용 전

처 음 에는 다소 딱 딱 하게 여 겨 질 수도 있으나 한 달
정도 사 용 하 면 내 몸 에 맞는 편안한 매 트 리 스 가
됩니다. 더 안락한 잠 자 리 를 위해 나 에게 꼭 맞는
베 개 도 준비해 보세요. 일부 매 트 리 스 는 말아서
포 장 되어 구입 직후 사용할 수 는 있으나 제품

원 형 으로 복 원 되 는데 3~4 일 정 도 의 시 간 이

소 요 됩니다. 제 품 에 배 어 있 는 냄 새 는 시 간 이 지나면
자연스럽게 사 라 집니다. 진 공 정 소 기로 흡 입 하 고
바 람 이 잘 통하는 곳에 두면 냄새 제 거 에 도 움 이
됩니다.

관 리 와 세척

매트리스 보 호 커 버 를 사 용 하면 세 탁 이 가 능 하 므로
침 대 를 더 깨끗이 사용할 수 있습니다. 대 부 분 의
커 버 는 물 세 탁 이 가 능 합니다. 더 자세한 내 용 은
커버 안 쪽 의 표 를 참 고 하세요. 매트리스 커버

세 탁 시 지 퍼 는 반드시 채 워 주 세요. 진 공 정 소 기로
매 트 리 스 의 먼 지 와 진 드 기 를 제 거 할 수 있습니다.
제 품 에 손 상 이 갈 수 있으니 접어서 보 관 하지
마세요. 최고 품 질 의 매 트 리 스 도 사 용 할 수록

안 락 함 이 줄어들고 먼 지 와 진 드 기 가 생기게 됩니다.
68~10 년 에 한 번 정도 매 트 리 스 를 교 체 하 는 것이

좋습니다.

Матраци із пінополіуретану та
латексу

Перед використанням вперше
Спочатку новий матрац може здаватися
надто твердим. Потрібен хоча б один
місяць, щоб ваше тіло звикло до

матраца, а матрац набув форми тіла.

Для найбільшого комфорту вам потрібна
правильна подушка. Підберіть подушку,
яка підходить для вашого нового матраца.
Деякі матраци постачаються у згорнутому
вигляді. Їх можна використовувати
відразу, але вони відновлять свою форму,
довжину та товщину лише через 3-4

дні. Усім новим матеріалам властивий
особливий запах, який поступово зникає.
Можна провітрити та пропилососити
матрац, щоб позбутися запаху.

Догляд та очищення

Доповніть матрац спеціальним захисним
чохлом, який легко знімати та чистити.
Багато матраців постачаються з

чохлом, який можна прати. Додаткову
інформацію наведено на ярлику всередині
чохла. Перед пранням чохла матраца
переконайтеся, що блискавка застібнута.
Можна пропилососити матрац, щоб
видалити пил і кліщів. Не згинайте
матрац. Це може пошкодити матеріал
наповнювача. Із часом навіть найкращі
матраци втрачають зручність, і в усіх
матрацах збираються пил та кліщі. Саме
тому ми рекомендуємо міняти матрац
кожні 8-10 років.

日 本 語
フォ ー ム マッ トレ ス & ラ テッ クス マッ トレ ス

初め て ご 使用 に な る 前 に

初め は 少し 硬め に 感じ られ る か も し れ ま せん が 、1
力 月 ほど で マッ トレ ス が 体 に な じん で きま す 。 A
適 に 眠る た め に は 、 自 分 に 合っ た 枕 選 び が 大 切 で
す 。 マ ッ ト レ ス を 替え た と き は 、 枕 も 見 直し まし
よう 。 イ ケア の マッ トレス の な か に は ロー ル パ ッ
ク に な っ た も の も あり ます 。 開封 後 す ぐに 使用 で
きま す が 、 本 来 の 形 ・ 厚 さ に 戻る まで に 3、4 日
ほど か か り ま す 。 最初 は 新品 特有 の (におい が し ま
す が 、 し だ い に 消 えて いき ます 。 マ ッ ト レ ス を 風
に あて れ ば 、 ご の に お い を 早く 消す こと が で きま
3.

お 手入れ 方 法

マッ トレ ス の 上 に マッ トレ スプ ロ テ ク ター を 敷く
こと を お すす めし ます 。 マ ッ トレス プロ テク ター
は 手軽 に 取り 外し て 洗え る の で 、 マ ッ トレ ス を い
つも 清潔 に 保 て こま す 。 イ ケア の マッ トレ ス の 多く
は 、 カ バー を 取り 外し て 洗え ます 。 洗濯 方 法 は 、
カバ ー に 付い て いる タグ を ご 覧 くだ さい 。 カ バー
を 洗濯 する と き は 、 必 ず フ ァ ス ナー を 閉じ て くだ
さい 。 ホ コリ や ダニ の 除去 に は 、 掃 除 機 を か ける
の が 効果 的 で す 。 マ ッ ト レ ス を 曲げ な いで くだ さ
い 。 マットレス を 曲げ る と 、 内 部 の 素材 に 損傷 を
与え る お それ が あり ます 。 高 品質 の マッ トレ ス

で も 、 長 年 使用 する と 快適 さ が 損 な われ 、 ホ コリ
や ダニ が た まり や すく な り ま す 。 快 適 で 衛生 的 に
お 使い いた だ く た め に 、 イ ケア で は 8 ぐ <  10   
 マッ トレ   交換 する こと   すす めし  いま

o


cat 1.txt 2.txt  3.txt 4.txt > final.txt

Combine tous les textes en un seul.

cat final.txt | shuf > final_mélangé.txt

Mélange toutes les lignes.

Ensuite on peut garder les 20 premières lignes seulement, ce qui permettrait d'avoir , avec un peu de chance, au moins une ligne de chaque texte. Créer un script python qui compte le nombre de syllabes pour faire des haikus ? (ou faire des alexandrins ?) -> [3]

Balisage des pages : Print Party

Session balisage des fichiers textes sortis par Tesseract (en HTML5). J'ai balisé en séparant les différentes langues en sections, et dans chaque section on a le même schéma : le nom de la langue en capitales en h1, les sous-titres en gras en h2 et les paragraphes de textes. J'essaie de trouver un moyen de baliser les plis qui ont disparu au scan, afin de pouvoir m'en servir plus tard (peut être pour créer un truc interactif avec javascript, pour pouvoir superposer les différents textes dans la même langue, puisque mes 2 scans se chevauchent).

J'ai découvert que, dans Tesseract, les textes dans d'autres langues à proximité d'un texte donné modifient la reconnaissance de ce texte. Plus il y a d'alphabets cohabitant en jeu, plus il y a de risque de modification de la reconnaissance optique du texte donné. La documentation de Tesseract explique également que la même image donnera deux résultats différents selon l'ordre dans lequel on inscrit les langues (-l eng+deu =/= -l deu+eng)

J'aimerais créer une page html qui permet de sélectionner une langue pour comparer les résultats d'OCR avec toutes les autres, ou 4 par 4 ou 2 par 2 etc. Pour cela j'enregistre chaque bloc de texte dans un fichier de taille et de résolution fixe, en le nommant avec le nom de la langue qu'il contient. Le programme utiliserait PHP pour appeler Image Magick pour coller les images ensembles, enregistrer le fichier, appliquer une reconnaissance de Tesseract en fonction des langues sélectionnées. Il stockerait le résultat dans des variables pour pouvoir l'afficher mis en page au côté des autres versions du même texte d'origine.

Avec php on peut lancer des commandes shell (c'est un peu lent mais ça va) :

  • shell_exec lance une commande shell
  • magick correspond à une commande ImageMagick (une bibliothèque shell ? existe un moyen d'en faire une bibliothèque php je crois)
  • montage assemble des images
  • -background #FFFFFF met la couleur de fond en blanc
  • -geometry rajoute une petite marge
shell_exec("magick montage -background #FFFFFF -geometry +4+4 ".$img_base." ".$img2." img/montages/".$i.".jpg");

Ensuite il faut utiliser shell_exec pour appliquer tesseract à ces images. J'ai enregistré toutes les combinaisons possibles et j'ai supprimé dans chaque fichier texte la moitié du texte qui ne correspondait pas à la langue voulue.

Le programme permet de choisir la langue que l'on veut comparer, et affiche dans un programme le résultat sous forme de poster imprimable.

Tur.jpg

(exemple de poster imprimable pour l'instant)

Le programme est assez lent et ce n'est pas pratique de générer à chaque fois tout le bazar, alors j'ai juste généré ça en off et le programme va chercher les infos sur mon ordi.

J'ai utilisé la règle css

writing-mode: vertical-rl;
text-orientation: upright;

pour que le texte s'affiche en vertical, afin de pouvoir comparer ligne par ligne la différence entre les différentes itérations de l'OCR. Pour cela j'ai du régler l'interlignage (qui est en fait l'interlettrage en vertical avec

 letter-spacing: -2rem;

.

Je voulais donc une police monospaced, pour avoir cet effet de "grille" pour que l'on puise comparer les lignes. J'ai eu un problème pour trouver une police qui comprenne le plus d'alphabets possibles, pour garder une cohérence dans le poster. La police IBM Plex est celle que j'ai trouvée avec le plus de caractères, et avec une version thai et arabe. Les seuls alphabets non-pris en compte sont les alphabets grecs et chinois.

Apparemment il existe une Nimbus Mono Global qui inclut tous les alphabets dont j'ai besoin mais (mais elle coûte 1950€).

Maintenant j'essaie d'améliorer la clarté du poster en indiquant au-dessus de chaque colonne la langue avec laquelle la langue sélectionnée a été scannée pour donner ce résultat. Problèmes de CSS.

J'ai réussi à faire ce que je voulais mais c'est pas très clair. On ne se rend pas vraiment compte de la découverte que j'ai faite sur tesseract : le fait qu'une même langue, scannée à côté de différentes autres langues, ne donne pas le même résultat. Un texte en chinois scanné près d'un texte en arabe n'aura pas le même résultat que ce même texte en chinois scanné près de texte en russe par exemple.

Il faut désormais qu'il faut que je trouve une mise en page plus simple qui permette de se rendre compte de ça. Peut-être juste des extraits scannés deux par deux ? Choisir une langue de référence (le français peut-être, qu'on puisse lire), pour générer un certain nombre de posters. que l'on puisse comparer le même texte chamboulé par son scan près d'autres langues.

J'ai trouvé la police Noto (qui est par défaut sur Debian 10 en fait) de Google, une linéale qui possède tous les alphabets du monde paraît-il. Elle est disponible dans plein de styles différents donc c'est bien pratique.

PROJET Q2

Intention

Mon objectif est d'utiliser mon Raspberry Pi comme d'une personne qui utiliserait divers réseaux sociaux en suivant uniquement ce que les algorithmes de recommandation lui conseillent. Je veux créer principalement un compte Facebook qui me permettrait de créer les autres comptes en les liant à celui-là. Mon programme tournerait en continu sur le Raspberry et regarderait en boucle des vidéos sur Youtube, écouterait une playlist sur-mesure sur Spotify, suivrait les comptes recommandés par Twitter, etc. Je veux voir ce que les différents algorithmes vont créer comme personnalité à ce faux compte. C'est une boucle de rétroaction crée par l'usage : l'utilisation même détermine cette utilisation.

Scénarios

Pour l'instant le scénario de mon "utilisateur qui ne choisit pas" (appelons-le Philippe) est de se connecter sur un réseau social, cliquer sur le premier lien disponible et de suivre sans interruption ce que lui propose les algorithmes de recommandation pendant une durée indéfinie. C'est un comportement protocolaire qui n'est pas très réaliste, mais il évoque bien la "zone de la machine" [4]

Sur Youtube, il clique sur le premier lien de la première ligne et continue à regarder ce qui se trouve dans la case "up-next". S'il s'arrête (quand je le débranche), la fois d'après il reprend à partir de la dernière vidéo dans le log (un fichier texte qui s'agrandit de liens au fur et à mesure).

Sur Spotify même principe, sauf que le bot enregistre le titre/le nom de l'artiste pour chaque morceau.

Sur Twitter, il clique sur la première personne recommandée dans "Who follow ?" et prend une capture d'écran et enregistre le nom de la personne en question. Il s'abonne/aime le profil pour que l'algorithme de Twitter affine ses préférences. Philippe saute de personne en personne indéfiniment.

Sur Facebook même principe que Twitter.

L'objectif maintenant c'est de trouver une narration, de fictionnaliser le comportement de Philippe pour le rendre plus plausible en tant que personne, pour être plus raccord avec mon propos.

Quel autre comportement Philippe peut-il avoir ?

  • Cliquer sur une vidéo/un article/un post au hasard parmi la première page ? Parmi la première ligne ?
  • Cliquer sur la vidéo la plus "visible", attirante à l'oeil (avec un titre uniquement en CAPITALE ? Le thumbnail avec le plus de contraste ?)
  • Regarder des vidéos/articles/posts en boucle à l'infini ?
  • Seulement pendant des horaires de bureau, comme si c'était un bullshit job ? Est-ce que son "emploi du temps" est séparé avec 2h de Facebook/2h de YouTube/2h d'Instagram/2h de Twitter ?
  • Regarder du contenu seulement pendant la nuit, pendant l'inverse des horaires de bureau -> comme pour une passion, un seul divertissement en dehors du cadre du travail ?
  • Le faire se comporter comme un alter ego qui est actif quand je ne suis pas actif ? (Quand je dors globalement)
  • Est-ce que Philippe reste une longue période sur la même plateforme avant de changer ? Quelle durée ? 1 semaine ? 1 mois ?
  • Est-ce que Philippe se déplace (migrations pendulaires ?) ? Est-ce qu'il peut voyager entre les pays en prenant le bus VPN ou rentrer en France pendant les vacances ?
  • Est-ce que Philippe change d'ordi de temps en temps et s'active sur le mien ou celui de mes colocs ?
  • Est-ce que Philippe passe les pubs ou bien est-ce que'il les regarde toutes assidûment (voire même clique dessus) ?

Réfléchir à la relation entre "l'agentivité" de l'usager, sa capacité à prendre des décisions et à agir, et la construction d'une figure abstraite complètement déterminée par l'algorithme ?

Apparemment malgré ces dispositifs de facilitation/suppression du choix et de l'autonomie, les utilisateurs réels sont la plupart du temps quand même en autonomie. Ils n'ont recourt que ponctuellement aux algorithmes de recommandation, parfois dans des contextes bien particuliers (quand ils écoutent de la musique en arrière-plan en faisant autre chose par exemple. (cf. article LES ALGORITHMES DE RECOMMANDATION MUSICALE ET L’AUTONOMIE DE L’AUDITEUR, Jean-Samuel Beuscart, Samuel Coavoux et Sisley Maillard)

L'article soulève aussi la question du goût : est-ce que ces algorithmes créent des utilisateurs dépassionnés, sans jugement de goût et sans réelles préférences ?

Questionner l'objectif dans l'utilisation de certains réseaux : Twitter plus politique que Youtube ou Spotify ?
Quel partie de la personnalité je veux construire à travers ce projet, dans quel domaine je veux que Philippe ait une opinion ?

Références

(À compléter)

Collecte

J'ai d'abord essayé de faire une extension de navigateur pour Firefox, qui enregistre l'URL à chaque fois que la lecture automatique change de vidéo (j'ai commencé par YouTube) et qui m'envoie la liste par mail tous les 10 vidéos (les extensions n'ont pas d'accès à la possibilité d'écrire ou de lire sur un fichier local). Pour ça j'ai utilisé les Mutation Observer de javascript, qui permettent de lancer des instructions quand certaines mutations apparaissent dans le DOM, ainsi que la librairie smtp.js, qui grâce au serveur smtp de Gmail, me permet de m'envoyer des mails. Le problème est que la version de Firefox sur Raspbian n'est pas optimisée pour le Raspberry Pi, et Firefox plante assez rapidement. En essayant avec Chromium (qui est apparemment optimisé au maximum), ça marche beaucoup mieux mais ça plante aussi quand le mail s'envoie.

J'ai quand même réussi a choper le lien de 22 vidéos à la suite avant que ça plante, en bidouillant un peu. Avec le paquet youtube-dl [5] (sur Linux, je sais pas s'il existe ailleurs) on peut en une commande télécharger toutes les vidéos si elles sont dans un fichier texte correctement formaté.


Je vais essayer avec Selenium, qui est un navigateur utilisable par ligne de commande, qui peut aussi s'utiliser 'headless', c'est-à-dire sans interface graphique. On peut l'utiliser avec Python et donc le lancer automatiquement dès que je branche le Raspberry Pi.

Pour l'instant j'arrive à me connecter à YouTube, à lancer une vidéo, à passer les pubs et détecter quand la vidéo change. Pour ça j'ai dû utiliser une astuce pour ne pas que Chromium me détecte comme un robot (il ne me laissait pas me connecter à YouTube car il trouvait ça dangereux). Il faut lancer une commande dans selenium qui change la propriété webdriver du navigateur en "undefined". Ensuite il faut bidouiller avec le user-agent pour pouvoir avoir le Youtube qui tourne sur un navigateur récent.

Cette étape est sûrement différente sur le RPi parce que la technique utilisée fonctionne pour Chrome/Chromium au-dessus de la version 79, et la version de Raspbian doit être 76 ou 77 je crois.

Le début de mon script ressemble à ça (je ne l'ai pas encore essayé sur le RPi) :

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from time import sleep
from datetime import datetime

USERNAME = 'adresse.mail@gmail.com'
PASSWORD = 'mot_de_passe'

options = webdriver.ChromeOptions()
# options.add_argument('--profile-directory=Default')
# options.add_argument("--disable-plugins-discovery");
options.add_argument('--disable-extensions')
options.add_argument("--disable-blink-features=AutomationControlled");
options.add_argument("--start-maximized")
options.add_argument("--mute-audio")

options.add_experimental_option("excludeSwitches", ['enable-automation'])
options.add_experimental_option('useAutomationExtension', False)
browser = webdriver.Chrome(options=options)
browser.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
  "source": """
    Object.defineProperty(navigator, 'webdriver', {
      get: () => undefined
    })
  """
})
browser.execute_cdp_cmd("Network.enable", {})
browser.execute_cdp_cmd("Network.setExtraHTTPHeaders", {"headers": {"User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0"}})

wait = WebDriverWait(browser, 4)

###vieux user-agent
# browser.execute_cdp_cmd("Network.setExtraHTTPHeaders", {"headers": {"User-Agent": "browserClientA"}})

#-------CONNECTION À YOUTUBE---------------

# browser.get('https://accounts.google.com/signin/v2/identifier?service=youtube&uilel=3&passive=true&continue=https%3A%2F%2Fwww.youtube.com%2Fsignin%3Faction_handle_signin%3Dtrue%26app%3Ddesktop%26hl%3Den%26next%3Dhttps%253A%252F%252Fwww.youtube.com%252F&hl=en&ec=65620&flowName=GlifWebSignIn&flowEntry=ServiceLogin')
#
# emailElem = browser.find_element_by_id('identifierId')
# ###vieux user-agent
# # emailElem = browser.find_element_by_id('Email')
# emailElem.send_keys(USERNAME)
#
# elem=browser.find_element_by_xpath('//*[@id="identifierNext"]/span/span')
# ###vieux user-agent
# # elem=browser.find_element_by_id('next')

# elem.click()
#
# browser.implicitly_wait(4)
#
# passElem=browser.find_element_by_name('password')
# ###vieux user-agent
# # passElem=browser.find_element_by_id('Passwd')
# passElem.send_keys(PASSWORD)
# elem=browser.find_element_by_xpath('//*[@id="passwordNext"]/span/span')
# ###vieux user-agent
# # elem=browser.find_element_by_id('signIn')
# elem.click()

# sleep(4)

#-----------------LANCER LA DERNIÈRE VIDÉO ENREGISTRÉE DANS LE LOG----------------------
###choper la dernière url enregistrée dans le log pour recommencer depuis l'arrêt du programme
# browser.get('https://www.youtube.com/watch?v=HWxXeoHndgY')
browser.get('https://www.youtube.com/watch?v=Wlyq22ybsRw')

###cliquer sur le bouton pour lancer la vidéo
elem=browser.find_element_by_css_selector('#movie_player > div.ytp-cued-thumbnail-overlay > button')
# elem=browser.find_element_by_xpath('//*[@id="movie_player"]/div[5]/button')
elem.click()


#----------------PASSER LA PUB----------------------
def passe_pub(temps):
    try:
        elem= WebDriverWait(browser, temps).until(EC.presence_of_element_located((By.CSS_SELECTOR, "#skip-button\:17 > span > button > span")))
        elem.click()
    except:
        print('pas de pub :)')

    titre = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#container > h1 > yt-formatted-string")))
    print(titre.get_attribute("textContent"))

#----------------RÉCUPÉRER LA DURÉE DE LA VIDÉO---------------
def duree_vid():
    durée = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "span.ytp-time-duration")))
    dur = durée.get_attribute("textContent")

    if len(dur) <= 5:
        pt = datetime.strptime(dur,'%M:%S')
        total_seconds = pt.second + pt.minute*60
    else:
        pt = datetime.strptime(dur,'%H:%M:%S')
        total_seconds = pt.second + pt.minute*60 + pt.hour*3600

    ###commande pour choper et afficher l'url actuelle
    print(browser.current_url)
    return total_seconds

#---------------REPÉRER LE CHANGEMENT DE PAGE (CLIQUER SUR LE BOUTON UP-NEXT)------------------------

# def chgmt_page(time):
    # up_next = '#movie_player > div.ytp-upnext.ytp-player-content.ytp-suggestion-set > a'
    # WebDriverWait(browser, timeout=time+1).until(EC.element_to_be_clickable((By.CSS_SELECTOR, up_next)))
    # elem=browser.find_element_by_css_selector(up_next)
    # print(elem.text)
    # elem.click()


def vid():
    # passe_pub(6)
    time = duree_vid()
    print(time)
    # passe_pub(time)
    # chgmt_page(time)
    upnext = browser.find_element_by_css_selector('#dismissable > div > div.metadata.style-scope.ytd-compact-video-renderer > a')
    upnext = upnext.get_attribute("href")
    WebDriverWait(browser, time+10).until(EC.url_to_be(upnext))
    print('nouvelle vidéo !')
   
try:
    while True:
        vid()
except KeyboardInterrupt:
    raise
except:
    print('Le programme a planté :/')

Peut être que pour des plateformes comme Facebook ou Twitter je peux utiliser un système de bot (pouvant être hébergé sur le RPi quand il est en fonctionnement) plutôt qu'un protocole complexe sur Selenium ? Naviguer entre les utilisateurs en les taggant ou en retweetant leurs posts ? -> La page Twitter en soi est un témoin de son passage et de la construction d'une personnalité, d'un avis.

Pour l'instant les pubs YouTube font tout planter, j'essaie de voir comment importer une extension dans Selenium (au moins temporairement) pour pouvoir mettre au point le truc sans les pubs.

Mise en forme

Vidéo

Avec les 22 premières vidéos que j'ai récupérées, je voulais faire une sorte de méga mashup en fusionnant 1 seconde de chaque vidéo, pour faire une sorte de parcours condensé du parcours du bot. Pour cela j'ai utilisé ffmpeg, qui permet de faire des manipulations vidéo sur plein de fichiers en même temps (comme ImageMagick pour les images par exemple) en ligne de commande. J'ai essayé de faire un script bash qui permet de couper chaque vidéo pour garder 1 seconde, et ensuite de fusionner toutes ces vidéos entre elles. Je pense que j'ai des problèmes de codecs puisque l'audio est décalé et qu'à un moment l'écran devient complètement vert. Toutes les vidéos YouTube ne sont pas dans le même format étonnamment, je pense que c'est une question de réglages. Avec ffmpeg on peut aussi faire des filtres pour convertir d'un coup plusieurs vidéos dans le même codec mais ça m'a l'air compliqué, je vais creuser.

J'ai réussi à faire une version test avec Premiere Pro, mais dans l'idée il faudrait que je puisse le faire automatiquement avec ffmpeg sur le RPi. Peut-être que le traitement (téléchargement/coupe/fusion des contenu) peut se faire pendant que Philippe est "off" (qu'il ne parcourt pas de contenu) ?

Interface

L'idée serait peut-être aussi de faire une interface, comme un journal de bord de ce parcours à travers les algorithmes (en modifiant l'interface de la Pibliothèque ?). Avec les logs récupérés (URLs…), je peux mettre en page dynamiquement comme un blog, un agrégat qui serait le reflet de la personnalité de Philippe. Comment montrer cette personnalité, ce "portrait-robot" ? Comment rendre des logs narratifs ?

Je pourrais éventuellement intégrer une partie d'étude statistique (à partir des tags par exemple) pour essayer de trouver des tendances dans le comportement de Philippe, un peu comme une étude sociologique de son profil. Ça peut renvoyer à la surveillance et au côté analytique des algorithmes, qui construisent ce genre de profil statistique pour construire des recommandations personnalisées, et en même temps être un moyen différent de montrer une personnalité.

Peut-être qu'une façon de rendre compte du parcours est d'enregistrer sous forme de phrases les différentes actions effectuées par le bot (Je clique à tel endroit, j'attends que la vidéo se termine, la page se recharge). Lecture par un text-to-speech pour évoquer l'aide pour les non-voyants (le narrateur vocal ?) ? Voix qui décrit à l'oral le comportement de l'utilisateur ?

Mise en espace/installation

Pour l'instant quand je lance Selenium il y a une interface graphique qui se lance, donc je peux voir sans toucher à rien le bot qui s'active et "fait sa vie". Cette étape est assez fascinante et flippante, c'est un peu comme si Philippe prenait le contrôle et lançait des vidéos comme ça sur mon ordi pendant que je travaille dessus. Alors sur Youtube une fois le premier clic sur une vidéo passé c'est pas très intéressant, mais sur un autre réseau avec plus d'interactivité (scroll par exemple ?) cette vidéo peut-être parlante, et agir presque comme un test de Turing si on la voit sans le contexte.

Problème : comment faire pour ne pas que ça ait l'air d'une simple vidéo en accéléré de quelqu'un sur un ordi ? Une possibilité serait de le montrer en live, et donc de donner un côté performatif à l'expérience.

  • Peut-être que le programme peut être lancé sur un ordi (avec crontab ?) qui l'active/l'arrête à des heures fixes (et donc on verrait les prints dans un terminal de cron et du programme, quand selenium n'est pas actif ?
  • Il faudrait pouvoir visualiser d'une façon ou d'une autre le clic ou le mouvement de souris, pour retrouver ce côté automatique qu'il y a dans le remplissage du formulaire.
  • Peut-être qu'il peut-être streamé en direct depuis cet ordi ? Philippe aurait une chaîne Twitch pour partager sa passion de la recommandation ?

Voir le déroulement en live accentue le côté voyeur, comme si on espionnait quelqu'un devant son ordi pendant qu'il se détend, drôle de sensation. L'objectif est de nous mettre dans une position de voyeur alors qu'on a affaire a un robot.

Matériellement, quel dispositif pour montrer cette vidéo ?

  • Il faudrait un environnement de bureau, un fauteuil avec du café/thé ?), personnalisé (peut-être par rapport aux passions que Philippe a acquis pendant l'expérience). Ambiance casual et intime (le voyeurisme tout ça).
  • Quel type d'ordi ? Philippe est un "monsieur tout le monde"

Peut-être que toutes mes expérimentations d'AP peuvent se retrouver sur ce bureau (éditions, sites/interfaces dans d'autres fenêtres…), et alors on fouillerait dans ses tiroirs et sur son bureau pour enquêter sur lui ? PORTRAIT-ROBOT INTENSIFIES

La question mon alter-ego revient, puisque les intérêts de Philippe seraient alors confondus avec les miens (mon sujet de la recherche de cette année). Il pourrait alors y avoir deux bureaux, un bureau qui est celui de Philippe étant le résultat et fonctionnant indépendamment, et mon bureau, avec les dessous, les projets parallèles et connexes qui viennent nourrir le projet et apporter de l'interactivité (expériencer des sites sans recommandation, aller sur le "blog" de Philippe ou voir les logs du RPi).

Philippe ?

Est-ce que Philippe est le bon nom ? Est-ce que genrer Philippe est une bonne idée, ou bien un prénom mixte (comme Dominique) correspondrait mieux vu que l'on parle d'un bot/programme ? Liste de prénoms mixtes (qui s'écrivent pareil) d'après Wikipédia (j'ai enlevé les moins ambigüs :

  • Dominique
  • Camille
  • Alex
  • Alix
  • Sacha
  • Ange
  • Claude
  • Lou
  • Candide
  • Charlie (apparemment le mieux réparti au niveau de la parité [6])
  • Yaël (bien réparti aussi)
  • Céleste
  • Andrea
  • Louison (lui aussi)
  • Mahé
  • Gwen
  • Loan
  • Philippe (apparemment très rarement féminin)