Vibe Camera: AI cria uma impressão

Parte de uma série sobre prototipagem com IA generativa
Este protótipo foi inspirado por uma ideia de Danny DeRuntz .
Algumas semanas atrás, Danny estava conversando comigo sobre seus pensamentos sobre imagens generativas de IA e como elas são realmente mais uma vibração do que uma representação específica de coisas reais. Não seria interessante se pudéssemos capturar o mundo ao nosso redor como uma vibração, em vez de uma captura precisa de fótons atingindo um sensor? As formas como usamos a fotografia estão ameaçadas por esses geradores de imagens. Mas e se toda a definição e prática de capturar um momento, talvez especialmente casuais ou pessoais, pudesse mudar de tentar a precisão para outra coisa?
Achei muito interessante, mesmo só como ideia. E se capturássemos nossas vidas de maneiras mais semelhantes ao funcionamento de nossas próprias memórias? E também me lembrei de percorrer os documentos da API OpenAI e perceber os pontos finais do DALL-E 2, incluindo uma opção para criar variações. E eu pensei, quão difícil seria realmente fazer uma dessas câmeras? E então eu tentei. E, de fato, é bem simples! Eu fiz um. Acho delicioso. Eu tenho usado esta câmera em minha vida. Já usei em conferências, no trabalho e em casa, quando ganhei uma árvore de aniversário. A câmera me dá sentimentos. Eu não esperava isso, embora achasse que era uma boa ideia. Protótipos como este são coisas que são fáceis de implementar rapidamente. Mas eu não esperava realmente achar a experiência de usá-lo tão comovente.



Como é feito
repositório Github
Obviamente, a parte mais importante da câmera é a tradução de uma imagem convencional para uma variação gerada. Isso é feito usando a função de variação OpenAI de sua biblioteca JavaScript. Isso é feito em uma função do Firebase que está por trás da autenticação. Há um pouco de infraestrutura necessária para configurá-lo para torná-lo seguro e estável, incluindo salvar a imagem codificada em base64 retornada em um depósito de armazenamento.
exports.getVariant = functions.https.onCall(async (data, context) => {
if (!context.auth) {
// check for authentication
throw new functions.https.HttpsError(
"failed-precondition",
"The function must be called while authenticated."
);
}
// grab the blob from the frontend
const base_blob = data;
// get the variation from OpenAI
const blob = await openai.getVariation(base_blob);
if (blob) {
// save the variation to a storage bucket and return a url
const url = await uploadImage(blob, crypto.randomUUID());
return url;
}
return null;
});
async getVariation(blob) {
// convert to buffer
const buff = Buffer.from(blob, "base64");
// add enough metadata to make openai happy
buff.name = "image.png";
// request a variation
const response = await openai.createImageVariation(
buff,
1,
"512x512",
"b64_json"
);
// pass back the new blob
const image_url = response.data.data[0].b64_json;
return image_url;
}
useEffect(() => {
navigator.mediaDevices.enumerateDevices().then((devices) => {
const videoDevices = devices.filter((device) => device.kind === 'videoinput');
setDeviceList(videoDevices);
});
});
.camera-feed {
filter: blur(calc($sz*0.05)) contrast(2.43) grayscale(0.72) hue-rotate(219deg);
}
Ou construa você mesmo:
https://github.com/jftesser/see-the-vibe