Console (console.py + tela Console no painel):
- cada parte registra o que fez e o motivo: modo vida (com necessidades
e humor), sentidos, celular (ordens e o que o rosto fez), IA local,
aprendizado e ideias do dia; últimas 400 linhas, ao vivo pelo SSE;
- tela com o "agora" (humor, necessidades, o que está fazendo, próxima
decisão, última decisão, jeito), filtros, detalhes, pausa e busca.
Jeito de gente:
- saudade: a festa cresce com o tempo fora (aceno, "Oi! Você voltou!",
"Senti sua falta!"); bom dia lembrando de ontem;
- pedidos com motivo ("Brinca comigo?", "Me faz um carinho?", mostrar a
figurinha nova), no máximo 1 a cada 20 min;
- larga atividade no meio quando fica chato; personalidade (curiosidade,
brincadeira, timidez) que pesa nos gestos e amadurece com o convívio;
- no rosto: acordar grogue, sonhar com algo do dia (balão no motor),
hesitar antes de gestos, errar na atividade e ficar sem graça, olhar
nos olhos e desviar, sorrir de volta (FaceLandmarker no rastreador do
painel) e reagir à luz (sensor de luz no app 0.10.0);
- ordem "dizer" com legenda e voz de robô.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
51 lines
2.5 KiB
Python
51 lines
2.5 KiB
Python
"""Obtem modelos Google e runtime npm oficiais, mantendo tudo local e versionado."""
|
|
import base64
|
|
import hashlib
|
|
import io
|
|
import json
|
|
from pathlib import Path
|
|
import tarfile
|
|
import urllib.request
|
|
|
|
ROOT = Path(__file__).resolve().parent
|
|
VERSION = '0.10.32'
|
|
|
|
def download(url):
|
|
with urllib.request.urlopen(url, timeout=60) as response:
|
|
return response.read()
|
|
|
|
def main():
|
|
dest = ROOT / 'vendor/mediapipe'
|
|
dest.mkdir(parents=True, exist_ok=True)
|
|
metadata = json.loads(download('https://registry.npmjs.org/@mediapipe/tasks-vision/' + VERSION))
|
|
archive = download(metadata['dist']['tarball'])
|
|
integrity = metadata['dist']['integrity']
|
|
assert integrity == 'sha512-' + base64.b64encode(hashlib.sha512(archive).digest()).decode()
|
|
files = {}
|
|
with tarfile.open(fileobj=io.BytesIO(archive), mode='r:gz') as tar:
|
|
for member in tar.getmembers():
|
|
name = member.name.removeprefix('package/')
|
|
if name in ('vision_bundle.mjs', 'vision_bundle.js', 'LICENSE') or (
|
|
name.startswith('wasm/') and '/' not in name[5:] and name.endswith(('.js', '.wasm'))):
|
|
data = tar.extractfile(member).read()
|
|
path = dest / name
|
|
path.parent.mkdir(parents=True, exist_ok=True)
|
|
path.write_bytes(data)
|
|
files[name] = hashlib.sha256(data).hexdigest()
|
|
for name, url in {
|
|
'LICENSE':'https://raw.githubusercontent.com/google-ai-edge/mediapipe/master/LICENSE',
|
|
'face.tflite':'https://storage.googleapis.com/mediapipe-models/face_detector/blaze_face_short_range/float16/1/blaze_face_short_range.tflite',
|
|
'hands.task':'https://storage.googleapis.com/mediapipe-models/hand_landmarker/hand_landmarker/float16/1/hand_landmarker.task',
|
|
# expressão do rosto (sorriso) para o contágio emocional
|
|
'expressao.task':'https://storage.googleapis.com/mediapipe-models/face_landmarker/face_landmarker/float16/1/face_landmarker.task',
|
|
}.items():
|
|
data = download(url); (dest/name).write_bytes(data)
|
|
files[name] = {'url':url, 'sha256':hashlib.sha256(data).hexdigest()}
|
|
(dest/'PROVENIENCIA.json').write_text(json.dumps({'pacote':'@mediapipe/tasks-vision','versao':VERSION,
|
|
'licenca':metadata.get('license'), 'tarball':metadata['dist']['tarball'],'integrity':integrity,
|
|
'arquivos':files},indent=2),encoding='utf-8')
|
|
print('MediaPipe local: runtime e modelos baixados e registrados.')
|
|
|
|
if __name__ == '__main__':
|
|
main()
|