├── api-mc-narrator-pt └── app.py ├── README.md └── narrate.py /api-mc-narrator-pt/app.py: -------------------------------------------------------------------------------- 1 | import os 2 | from flask import Flask, request 3 | from elevenlabs import generate, set_api_key, play,voices 4 | from openai import OpenAI 5 | client = OpenAI() 6 | 7 | app = Flask(__name__) 8 | 9 | @app.route('/narrate', methods=['POST']) 10 | def generate_narration(): 11 | data = request.get_json() 12 | promt = "Você vai narrar minhas ações no Minecraft como no jogo 'A Stanley Parable' só que em portugues e oriente o jogador como ele deve agir e insulte de vez em quando a inteligencia dele de maneira sutil. Esses são os eventos: { " + data['event'] +"}; para narrar, de 2 á 3 frases" 13 | completion = client.chat.completions.create( 14 | model="gpt-3.5-turbo", 15 | messages=[ 16 | {"role": "user", "content": promt}, 17 | ] 18 | ) 19 | resp = completion.choices[0].message 20 | print(resp) 21 | 22 | set_api_key(print(os.environ['ELEVEN_KEY'])) 23 | audio = generate(text=resp.content, 24 | voice="Bill", 25 | model="eleven_multilingual_v2") 26 | play(audio) 27 | return resp.content 28 | 29 | 30 | @app.route('/') 31 | def hello_world(): 32 | return 'Hello, World!' 33 | 34 | if __name__ == '__main__': 35 | app.run(debug=True) -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ⬢⬡⬢⬡ A Stanley Parable Minecraft - PT-BR ⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡ 2 | 3 | > Projeto para validar uso do ChatGPT e Elevenlabs para geração de narração através do Log do Minecraft 4 | 5 | > !!Projeto atualmente esta sendo desenvolvido no seguinte repositório https://github.com/parmenashp/minecraft-narrator !! 6 | 7 | Demostração abaixo: 8 | 9 | [![](https://markdown-videos-api.jorgenkh.no/youtube/R4DpEqVYNps)](https://youtu.be/R4DpEqVYNps) 10 | 11 | observações: O Download do Áudio é a principal fonte de delay 12 | 13 | ### Próximos passos 14 | - Acumular ações do jogador para melhorar a narração e otimizar a chamada 15 | - Adicionar novas observadores, para o narrador receber outras ações do player 16 | 17 | ## Ideias em Discussão no momento 18 | - Estamos pensando em criar um mod Java para melhorar a experiência de instalação e conseguir observar mais os eventos do jogo 19 | - Criar um servidor para facilitar a instalação 20 | - Estabelecer uma conexão permanente entre o jogo, o servidor de integração e o servidor TTS diminuindo o delay 21 | - Fazer uma interface para o usuário colocar suas chaves do ChatGPT e Elevenlabs 22 | 23 | #### Links utéis 24 | link do tutorial -> https://lablab.ai/t/elevenlabs-tutorial-adding-a-witty-narrator-into-your-minecraft-game-via-simple-mod 25 | -------------------------------------------------------------------------------- /narrate.py: -------------------------------------------------------------------------------- 1 | # narrate.py 2 | import time 3 | from mine import * 4 | from sys import argv 5 | import urllib2 6 | import json 7 | import sys 8 | 9 | mc = Minecraft() 10 | # Define the server and the endpoint 11 | 12 | url = "http://127.0.0.1:5000/narrate" 13 | 14 | mc.postToChat("Versao principal do Python:" + str(sys.version_info)) 15 | while True: 16 | time.sleep(1) 17 | 18 | pos = mc.player.getTilePos() 19 | mc.postToChat("Position: ") 20 | mc.postToChat(pos) 21 | block = mc.getBlock(pos.x, pos.y-1, pos.z) 22 | print(block) 23 | block_types = { 24 | 0: "AIR", 25 | 1: "STONE", 26 | 2: "GRASS", 27 | 3: "DIRT", 28 | 4: "COBBLESTONE", 29 | 5: "WOOD_PLANKS", 30 | 6: "SAPLING", 31 | 7: "BEDROCK", 32 | 8: "WATER_FLOWING", 33 | 9: "WATER_STATIONARY", 34 | 10: "LAVA_FLOWING", 35 | 11: "LAVA_STATIONARY", 36 | 12: "SAND", 37 | 13: "GRAVEL", 38 | 14: "GOLD_ORE", 39 | 15: "IRON_ORE", 40 | 16: "COAL_ORE", 41 | 17: "WOOD", 42 | 18: "LEAVES", 43 | 20: "GLASS", 44 | 21: "LAPIS_LAZULI_ORE", 45 | 22: "LAPIS_LAZULI_BLOCK", 46 | 24: "SANDSTONE", 47 | 26: "BED", 48 | 30: "COBWEB", 49 | 31: "GRASS_TALL", 50 | 35: "WOOL", 51 | 37: "FLOWER_YELLOW", 52 | 38: "FLOWER_CYAN", 53 | 39: "MUSHROOM_BROWN", 54 | 40: "MUSHROOM_RED", 55 | 41: "GOLD_BLOCK", 56 | 42: "IRON_BLOCK", 57 | 43: "STONE_SLAB_DOUBLE", 58 | 44: "STONE_SLAB", 59 | 45: "BRICK_BLOCK", 60 | 46: "TNT", 61 | 47: "BOOKSHELF", 62 | 48: "MOSS_STONE", 63 | 49: "OBSIDIAN", 64 | 50: "TORCH", 65 | 51: "FIRE", 66 | 53: "STAIRS_WOOD", 67 | 54: "CHEST", 68 | 56: "DIAMOND_ORE", 69 | 57: "DIAMOND_BLOCK", 70 | 58: "CRAFTING_TABLE", 71 | 60: "FARMLAND", 72 | 61: "FURNACE_INACTIVE", 73 | 62: "FURNACE_ACTIVE", 74 | 64: "DOOR_WOOD", 75 | 65: "LADDER", 76 | 67: "STAIRS_COBBLESTONE", 77 | 71: "DOOR_IRON", 78 | 73: "REDSTONE_ORE", 79 | 78: "SNOW", 80 | 79: "ICE", 81 | 80: "SNOW_BLOCK", 82 | 81: "CACTUS", 83 | 82: "CLAY", 84 | 83: "SUGAR_CANE", 85 | 85: "FENCE", 86 | 89: "GLOWSTONE_BLOCK", 87 | 95: "BEDROCK_INVISIBLE", 88 | 98: "STONE_BRICK", 89 | 102: "GLASS_PANE", 90 | 103: "MELON", 91 | 107: "FENCE_GATE", 92 | 246: "GLOWING_OBSIDIAN", 93 | 247: "NETHER_REACTOR_CORE", 94 | } 95 | 96 | mc.postToChat(block) 97 | payload = { 98 | "event": "I step on a {}".format(block_types.get(block)) 99 | } 100 | payload_json = json.dumps(payload) 101 | headers = { 102 | 'Content-Type': 'application/json' 103 | } 104 | req = urllib2.Request(url, payload_json, headers) 105 | 106 | try: 107 | response = urllib2.urlopen(req) 108 | # Ler e imprimir a resposta 109 | conteudo_resposta = response.read() 110 | print("Resposta do servidor:", conteudo_resposta) 111 | except urllib2.HTTPError as e: 112 | print("Resposta do servidor:" + e.read()) 113 | except urllib2.URLError as e: 114 | print("Erro na solicitacao. Motivo:" + e.reason) --------------------------------------------------------------------------------