JSPM

  • Created
  • Published
  • Downloads 727
  • Score
    100M100P100Q81493F
  • License MIT

Ai with Canvas and Database library. Supports typescript and javascript

Package Exports

  • apexify.js
  • apexify.js/index.js

This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (apexify.js) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.

Readme

Jedi-Studio Introduce

Greetings everyone! 🌟 This marks the release of a beta version for our package. If you encounter any issues or need assistance, feel free to reach out. Direct message me on Discord at jedi.79 (ID: 1130583393176920095).

Added new 🆕

Check our server for the code and usage for leveling system

  • New chat models has been added (starChat, zephyr-beta, gemma-v and v4)

  • Leveling system (customizable with new features and themes using canvas)

  • Our Server Support

🚀 Getting Started

  • If you're new and facing issues or unable to register and execute commands (slash / prefix).
  • Use the code snippet below (Note: This may slightly increase bot latency by approximately 50ms).
const { Client, GatewayIntentBits, Partials } = require("discord.js");
const { starter } = require('apexify.js'); 
const path = require('path');

const client = new Client({
  intents: Object.keys(GatewayIntentBits).map((a)=>{
    return GatewayIntentBits[a]
  }),
 partials: Object.values(Partials),
});

const token = process.env.token;
const eventsPath = path.join(__dirname, 'src', 'events');
const prefixCommandPath = path.join(__dirname, 'src', 'prefix');

const options = {
  token: toekn,
  status: 'online', // idle, online, dnd
  name: 'Playing with commands',
  type: 0, // type is for activity (Playing, Watching, Custom , Listening, etc.)
  botName: 'tools', // bot name
  botAvatar: './pfp.jpeg', // set your bot avatar as a URL or local file (GIF also works) 
  botBanner: 'url or path', // set your bot banner
  eventsPath,

  // Note: Don't provide guildId or put it in the options if you set global as true
  slashCommandPath: {
    baseDir: __dirname, // need to be provided to read your commands path
    path: './src/slash',
    global: true, // true for making slash commands global
    guildId: '', // guild if global is false
    logsId: '', // channel ID for commands log
  },
  prefixCommandPath: {
    path: prefixCommandPath, // your prefix commands path
    logsId: '', // channel ID for commands log
    prefix: '!', // prefix of the bot
  },
  lavalink: {
    // Lavalink configuration for music
    nodes: [],
    search: 'ytmsearch', // (ytmsearch) => YouTube musics || (spsearch) => Spotify musics
    version: 'v4', // your Lavalink version
  },
  mongo: {
    mongoURI: '', // Your MongoDB URI for connecting to MongoDB
    dataName: '', // Your Database name to create in MongoDB
  },
  webView: {///creating  aport using express
    port: 3000,
    hostname: 'jedi-studio.com',
    middleware: ,
    routs:
  },
  anticrash: {
    enabled: true,
    webhookURL: '', /// Your discord webhook url
    userToMention: '', /// userId to notify him by the errors
    autoFix: false, /// # WARNING: Don't enable this option it is broke.. soon updates it will fix anticrash error automatically
  }
};

starter(client, options);

🚀 Usage Guidelines

🤖 Ai Chat & Imagine

  • Added new chat models

For a standard reply without AI images or voice messages, set both draw and voice to false. Activate voice replies and AI images by setting them to true. Trigger the bot to draw AI images with specific words or phrases using drawTrigger.

Usage as prefix

  • The code below si how to use it in prefix command or set it into specific channel
// Use this for js files (cjs modules)
const { apexAI } = require('apexify.js');

// For es module (.mjs/(.js if "type": "module" in package.json) or ts
import { apexAI } from 'apexify.js';

const allowedChannelId = 'Channel_ID';  // Whether to set a channel id or no
client.on('messageCreate', async (message) => {
  if (message.author.bot || message.channel.id !== allowedChannelId) return;

/////Note: voice message for premium is beta but way better than google in voice speechs

const options = {
  //  voice: false,              // Whether to generate voice response (true/false)
  //  voiceModel: "google",      // Voice model to use ("google", (premium:"apexAI", "zenithAi") )
  //  voice_code: "en-US-3",     // Voice code (applicable only if voiceModel is "zenithAi")
 //   apiKey: "",                // API key (applicable only if voiceModel is "zenithAi" or "apexAI")
 //   type: "b",                 // Type of voice model (applicable only if voiceModel is "apexAI")
                               // Available types: "a", "b", "c", "d", "e", "f", "g", "h"
    draw: false,               // Whether to draw image (true/false)
    drawTrigger: ["create", "رسم"],  // Triggers to initiate image drawing
    imageModel: "prodia",      // Image model to use ("prodia" or any other supported model)
    numOfImages: 2,            // Number of images to draw (applicable only if draw is true)
    chatModel: "v3",           // Chat model to use ("v3" or "apexChat")
    keywords: [],              // Keywords to trigger specific responses
    keywordResponses: {},      // Responses corresponding to keywords
    loader: {                  // Loader settings (null to disable)
        loadingMessage: 'loading...',  // Message to show while loading
        loadingTimer: 3000,            // Loading timer (in milliseconds)
    },
    readFiles: false,          // Whether to read attached files (true/false)
    enhancer: false,           // Whether to enhance text before processing (true/false)
    nsfw: false,               // Whether to prevent nsfw generated images (true/false)
};

  await apexAI(message, options)
});

Usage in slashcommand or outside discord.

//// Inside discord for Ai images
const { SlashCommandBuilder, AttachmentBuilder } = require('discord.js');
const { ApexImagine } = require('apexify.js');

module.exports = {
  data: new SlashCommandBuilder()
    .setName('apeximagine')
    .setDescription('Generate images using ApexImagine')
    .addStringOption(option =>
      option.setName('modal')
        .setDescription('The modal to use')
        .setRequired(true))
    .addStringOption(option =>
      option.setName('prompt')
        .setDescription('The prompt for image generation')
        .setRequired(true))
    .addIntegerOption(option =>
      option.setName('count')
        .setDescription('Number of images to generate')
        .setRequired(true))
    .addStringOption(option =>
      option.setName('negative')
        .setDescription('Negative prompt (if needed)')),
  async execute(interaction) {

    await interaction.deferReply()
    const modal = interaction.options.getString('modal');
    const prompt = interaction.options.getString('prompt');
    const count = interaction.options.getInteger('count');
    const negativePrompt = interaction.options.getString('negative') || '';

    try {
      const imageUrls = await ApexImagine(modal, prompt, { number: count, negative: negativePrompt });
      const attachments = [];

      for (const url of imageUrls) {
        if (!attachments.some(attachment => attachment.url === url)) {
          const attachment = new AttachmentBuilder(url);
          attachments.push(attachment);
        }
      }

      await interaction.editReply({ files: attachments });
    } catch (error) {
      console.error(error);
      await interaction.editReply('An error occurred while generating images.');
    }
  },
};

/////////////////////////////////////////////////////


/////////////////////////////////////////////////////

///Inside discord for Ai chat
const { SlashCommandBuilder } = require('discord.js');
const { ApexChat } = require('apexify.js');

module.exports = {
  data: new SlashCommandBuilder()
    .setName('apex-chat')
    .setDescription('Generate Ai chat response')
    .addStringOption(option =>
      option.setName('modal')
        .setDescription('The modal to use')
        .setRequired(true))
    .addStringOption(option =>
      option.setName('prompt')
        .setDescription('The prompt for gpt')
        .setRequired(true)),
  async execute(interaction) {

   await interaction.deferReply()
    const modal = interaction.options.getString('modal');
    const prompt = interaction.options.getString('prompt');


    try {
      const response = await ApexChat(modal, prompt);

      await interaction.editReply({ content: `${response}` });
    } catch (error) {
      console.error(error);
      await interaction.editReply('An error occurred while generating images.');
    }
  },
};

Usage outside discord

 /// Generating ai images
 const imageUrls = await ApexImagine(modal, prompt, { number: count, negative: negativePrompt });/// returns imageUrls as array

 ///Generating Ai chat
 const response = await ApexChat(model, prompt);/// returns a direct prompt

📈 Leveling-System 🌠

  • Note: ** This system uses mongoDb as database you need to ensure connection is made before using it**. You can make your own connection to mongodb or use mongoConnect funciton which is exported from apexify.js.
const LevelingSystem = require('apexify.js');
const level_system = new LevelingSystem({
    XpCount: 15, // Each message is equalt to how many xp (1 message = 15xp)
    rate: 2, // Rate message multiplier 1 message * 2 so 30xp per each msg
    channelId: '1212829696358875196', // Channel Id to send in it level up messages
    guildId: '1206054171657375754', // Your serverId
    levelingMessage:'Congrates {user} you level up to level {level}.', // Leveling up message
  levelsArray: [ // You can use your own levels system or leave it empty array and it will use the deffaut one which is inside the pkg inbuilt
    { level: 0, xpCount: 0 },
    { level: 1, xpCount: 10 },
    { level: 2, xpCount: 50 },
    { level: 3, xpCount: 75 },
    { level: 4, xpCount: 100 },
    { level: 5, xpCount: 150 },
    { level: 6, xpCount: 200 },
    { level: 7, xpCount: 300 },
    { level: 8, xpCount: 400 },
    { level: 9, xpCount: 500 },
    { level: 10, xpCount: 700 },
    { level: 11, xpCount: 900 },
    { level: 12, xpCount: 1200 },
    { level: 13, xpCount: 1500 },
    { level: 14, xpCount: 1800 },
    { level: 15, xpCount: 2200 },
    { level: 16, xpCount: 2600 },
    { level: 17, xpCount: 3000 },
    { level: 18, xpCount: 3500 },
    { level: 19, xpCount: 4000 },
    { level: 20, xpCount: 4500 },
    { level: 21, xpCount: 5000 },
    { level: 22, xpCount: 6000 },
    { level: 23, xpCount: 7000 },
    { level: 24, xpCount: 8000 },
    { level: 25, xpCount: 9000 },
    { level: 26, xpCount: 10000 },
    { level: 27, xpCount: 12000 },
    { level: 28, xpCount: 14000 },
    { level: 29, xpCount: 16000 },
    { level: 30, xpCount: 20000 }, 
  ],
});


/// Using level system inside messageCreate event

client.on('messageCreate', async (m) => {
  const userId = m.author.id;
  const guild = m.guild;
  try {
    await level_system.setupConfig() /// saving data above into mongodb

    await level_system.addXp(userId, guild.id); /// adding xp to the user on each msg sent
    
    await level_system.disableLevel(guild.id); /// remove/disable leveling system for the current server (note this will delete server data)

    const card = await level_system.xpCard(m, guild.id, userId);// display a leveling card user rank and his current xp 
    m.reply({ files: [card] });

    await level_system.setUserBanner(guild.id, userId); // set user banner in the xpCard 

    const userData = await level_system.userInfo(guild.id, userId); // returns user data (xp, level, userId, bannerURL)
    console.log(userData);
    
    const serverData = await level_system.checkConfig(guild.id);
    console.log(serverData); // returns (serverid, channelId, xpCount, rate, levelsArray, levelUpmessage)


    const topusers = await level_system.serverLeaderBoard(guild.id, '20'); // 20 is the number of user to be displayed for example top 20
    console.log(topusers); // returns top 20 users in order from highest to lowest

    const topGlobal = await level_system.topGlobal('10'); // top 10
    console.log(topGlobal); // Returns each user in order with data displayment for each

    /// levelup event to send level up card once user moves to the next level
    level_system.on('levelup', async (levelupmsg, userId, userlevel, userXp, channelId, guildId) => {
      const guild = message.client.guilds.cache.get(guildId);
      const channel = guild.channels.cache.get(channelId);
      const card = await level_system.levelUpCard(message, userId, guildId);
      await channel.send({ files: [card] })
    });

    const editXp = await level_system.editXp(guild.id, userId, xpAmount); // The xpAmount to add or to remove from the useer
    console.log(editXp); // returns new xp and level of the user


    const removeUser = await level_system.removeUser(guild.id, userId); // remove the user from data

   const serverleaderboard = await level_system.serverLeaderBoardCard(m, guildId, version = 1 or 2, 'set usernames color or put word random'); 
   m.reply({ files: [card] });

   await level_system.liveServerLeaderboard(m, guild.id, 'channel id to set the live leaderboard at', 20000, 1); /// 20000 is the uodate timer for live duration keep it more than 10 seconds and number 1 is the version of the live board either user 1 or 2
  } catch (error) {
    console.error(error.message);
}

});

📊 Database MongoDb (Online) 📁

  • To connect to MongoDB/Mongoose, provide your URL and name your database. Follow these steps:
///for cjs module (.cjs/.js)
const { mongoConnect } = require('apexify.js');
///for es module (.mjs/(.js if "type": "module" in package.json) or ts
import { mongoConnect  } from 'apexify.js';

// Connect to MongoDB
const mongoSuccess = await mongoConnect('mongoURI', 'dbName');

// Access connected databases using getDb functions
const mongoDb = await getDb();

/*----------------------------------------*/
//if you wanted to use your database to save/edit/delete then use this example below

// Example usage:

const { save, updateData, find, remove, removeSpecific } = require('apexify.js');


///# Save (insertOne)
const collectionName = 'exampleCollection';
const document = { key: 'value' };
const options = {
  uniqueFields: ['key'], // Example unique field
 };
 // Saving the document to MongoDB with options
 const savedDocument = await save(collectionName, document, options);


///# Find (findOne)
const collectionName = 'exampleCollection';
const filter = { _id: '6063b0f4e8e8b652780e97e0' }; // Example filter, you can customize it
const projection = { name: 1, age: 1 }; // Example projection, you can customize it
const options = {
   sort: { age: -1 }, // Example sort option, you can customize it
   limit: 5, // Example limit option, you can customize it
};
  // Finding a document in MongoDB with options
  const foundDocument = await find(collectionName, filter, projection, options);


///# SearchMany (find().toArray)
const collectionFilters = [
   { collectionName: 'collection1', displayment: 5, filter: { status: 'active' } },
   { collectionName: 'collection2', displayment: null, filter: { type: 'public' } },
  // Add more collection filters as needed to search for
];
  // Searching for documents in multiple collections with specific filters
  const searchResults = await searchMany(collectionFilters);


///# Remove (deleteOne)
const collectionName = 'exampleCollection';
const filter = { _id: '6063b0f4e8e8b652780e97e0' }; // Example filter, you can customize it
  // Removing a document from MongoDB
  const removalResult = await remove(collectionName, filter);//remove the document which mathces the filter


///# RemoveSpecific (deleteOne(filter))
const collectionName = 'exampleCollection';
const filter = { _id: '6063b0f4e8e8b652780e97e0', name: 'John Doe' }; // Example filter, you can customize it
const keyToRemove = { name: 1 }; // Example key to remove, you can customize it
  // Removing a document from MongoDB with specific keys removed
   const removalResult = await removeSpecific(collectionName, filter, keyToRemove);//remove the key without remvoe the full document 


///# RemoveMany (deleteMany)
const collectionName = 'exampleCollection';
const filter = { status: 'inactive' }; // Example filter, you can customize it
  // Removing multiple documents from MongoDB based on a filter
  const removalResult = await removeMany(collectionName, filter);


///# UpdateData (updateOne)
const collectionName = 'yourCollectionName'; // Replace with your actual collection name
const filter = { _id: 'yourDocumentId', age: 23, name: 'Elias' }; // Replace with your actual filter criteria
const update = { age: 19, gender: 'male' }; // Replace with your actual update data
const uniqueFields = ['field1', 'field2']; // Replace with your unique fields, if any!
  // Updating document data in the specified collection
  const updateResult = await updateData(collectionName, filter, update, uniqueFields);


///# UpdateAll (updateMany)
const collectionName = 'yourCollectionName'; // Replace with your actual collection name
const filter = { level: 20, serverId: guildId, userId: userId  }; // Replace with your actual filter criteria
const update = { level: 31 }; // Replace with your actual update data
const uniqueFields = ['userId', 'serverId']; // Replace with your unique fields, if any!
  // Updating all documents matching the filter in the specified collection
  const updateResult = await updateAll(collectionName, filter, update, options);


///# MigrateData 
const sourceCollection = 'yourSourceCollection'; // Replace with your actual source collection name
  const destinationCollection = 'yourDestinationCollection'; // Replace with your actual destination collection name
    // Transferring data from the source collection to the destination collection
    const transferResult = await migrateData(sourceCollection, destinationCollection);


///# MigrateAndPrune
const sourceCollection = 'yourSourceCollection'; // Replace with your actual source collection name
  const destinationCollection = 'yourDestinationCollection'; // Replace with your actual destination collection name
    // Transferring data from the source collection to the destination collection
    const transferResult = await migrateAndPrune(sourceCollection, destinationCollection);


///# Drop (drop)
const dropCollectiom = 'collectionToRemove'; // Replace with your actual collection name
    // Removing collection from mongoDb
    const dropResults = await drop(dropCollectiom);


///# DataSize
const dataToCheck = 'collectioNameToCheck'; // Replace with your actual collection name
    // Check collection size in db
    const size = await dataSize(dataToCheck);

📊 Database NanoDb (local) 📁

  • NanoDb is specially made for apexify library to make database easy for all (json database)
///for cjs module (.cjs/.js)
const { NanoDb } = require('apexify.js');
///for es module (.mjs/(.js if "type": "module" in package.json) or ts
import { NanoDb } from 'apexify.js';

/// Setting Which data json to configure
const db = await NanoDb('path/file/to/json'); // Example: ../data.json


///# AddOne (inserting new data)
const result = await db.addOne({ userId: , serverId: , name: , age: 27}, { uniqueKeys: ['userId', 'serverId'] });
console.log(result)


///# FindData (search for single document)
const result = await db.findData({ username: 'john', age: 40 });
console.log(result)


///# DisplayData (display data array)
const displayOptions = {
  displayment: 10,//display how many documents
  filters: {
    country: 'usa'///your filter
  },
  page: 1,
  pageSize: 10,
  sortBy: 'size', // Replace with the actual field you want to sort by
  sortOrder: 'asc', // or 'desc' asc => ascending, desc => descending
};

// Displaying data using the displayData method
const result = await db.displayData(displayOptions);
console.log(result)


///# RemoveOne (remove a single key from single document)
const filterQuery = {
   xp: 1000 => assign it 'any' if you dont have specific value
};

const removeFilter = {
 level: 'any'
};
 // Removing fields using the removeOne method
 const result = await db.removeOne(filterQuery, removeFilter);
console.log(result)


///# RemoveDoc (remove a a full document)
const result = await db.removeDoc({ userId: value, serverId: value });
console.log(result)


///# UpdatData (update a single document in the json)
const result = await db.updateData({ userId: value, validate: value}, { validate: newValue });
console.log(result)


///# UpdateMany (update a many documents in the json)
const result = await db.updateMany({ validate: value, session: value }, { session: newvalue });
console.log(result)


///# Drop (remove whole data in json)
const result = await db.drop();
console.log(result)


///# Aggregate 
  const aggregationPipeline = [
    {
      $group: {
        _id: '$serverId', // Group by serverId
        totalWallet: { $sum: '$wallet' }, // Calculate total wallet amount within each serverId
        totalBank: { $sum: { $ifNull: ['$bank', 0] } }, // Calculate total bank amount (considering null values)
        uniqueUsers: { $addToSet: '$unique.userId' }, // Create a set of unique user IDs within each serverId
      },
    },
  ];

  // Use the aggregate method to execute the pipeline
  db.aggregate(aggregationPipeline)
    .then((result) => {
      console.log(result.aggregatedResults[0].$serverId);
    })
    .catch((error) => {
      console.error(error);
    });


  ///# TransferData (moving data from json to another)
  const transferResult = await db.transferData('./output.json');

  ///# DistinctData (Displayd data fields for the query)
    const distinctResult = await db.distinct('id');
    //log results: ['232', '4234', '2342']
    console.log(distinctResult)


  ///# IndexData 
  // Access data from the NanoDb instance
  const existingData = await db.dataPromise;

    // Iterate through each data point and create indexes
    existingData.forEach((data) => {
      db.indexData(data);
    });

    // Now you can access the indexes
    // For example, let's say you want to retrieve all data with serverId 'A'
    const serverAData = db.indexes.get('serverId')?.get('A');
    console.log(serverAData)


  ///# SearchTeaxt (search in values of the keys in json)
  const searchQuery = '3423411305833931769200953'; // Key value for userId
  const searchResults = await db.fullTextSearch(searchQuery);
  console.log(searchResults)

 ///# NanoSize 
 const result = await db.nanoSize()
 console.log(result)


 ///# Replicate 
 const result = await db.replicate('./data.json', '../output.json');
 console.log(result)


 ///# EncryptData
 const encryptResult = await db.encrypt('a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6') // Change the key as you like
 console.log(ecryptResult)

ْ
 ///# DecryptData
 const descryptResult = await db.decryptData('a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6') // Change the key depending on the key you used to encrypt
 console.log(descryptResult)

 
  ///# BackUp
  const filePathToJsonData = './output.json';
  const typeOfCompression = 'txt'; // Formates we provide is txt/json/zip/gzip
  const outputPath = './lib/done.txt';
  const encrypted = false; // Encrypting your backup data
  const encryptionKey = 'a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6';

  const backupOptions = {
    outputPath,
    encrypted,
    key: encrypted ? encryptionKey : undefined,
  };

   const backUp = await db.backup(filePathToJsonData, typeOfCompression, backupOptions);

📸 Manipulating Images Using Canvas 🎨

Add images, shapes, and effects to images with ease!
const { ApexPainter } = require('apexify.js');/// cjs module .js

const paintImage = new ApexPainter();


///Creating a background
const canvasOptions = {
  width: 1200,//background width
  height: 300,//background height
  customBg: '',/// it can be URL only for now and if used plz dont use bgColor or bgGradient
  backgroundColor: '#3498db', // Example color (blue) or use 'transparent' for no backgound color
  backgroundGradient: {////Adding  a gradient instead of constant color
    type: 'linear',/// change to 'radial' if you want gradient start from middle
    startX: 0,
    startY: 0,
    startRadius: 0,///add if radial only!  
    endRadius: 0,///add if radial only! 
    endX: 100,
    endY: 0,
    colors: [
      { stop: 0, color: 'red' },
      { stop: 0.5, color: 'green' },
      { stop: 1, color: 'blue' },
      ///add more colors if needed
    ],
  },
  borderRadius: 0,///adding a radius to create a curvy edges or use 'circular' to make it a circle
};


//// 
const images = [
  {
    source: 'square',///drawing  shapes as images. We only support those shapes ('square', 'triangle', 'circle', 'pentagon').
    x: 385,///positions on background horizontally.
    y: 225,///positions on background vertically.
    rotate: 0,//rotate only applyed for shapes.
    filled: true,///to fill the shape if true.
    width: 500,///shape width.
    height: 80,//shape height.
    borderRadius: 35,///adding a radius to create a curvy edges or use 'circular' to make it a circle.
    color: 'rgba(0, 0, 0, 0.4)',///only being applied for shapes (filling the shape with the provided color).
    gradient:, ////Adding  a gradient instead of constant color (used same way as in canvas (only works with shapes).
    stroke: {//Adding stroke
      color: '#498afc',//color of the stroke
      width: 5,//size of the stroke.
      borderRadius: 35,///adding a radius to create a curvy edges or use 'circular' to make it a circle.
    },
  
  },
    {
    source: 'square',
    x: 395,
    y: 235,
    rotate: 0,
    filled: true,
    width: 440,
    height: 60,
    borderRadius: 35,
   gradient: {
    type: 'linear',
    startX: 0,
    startY: 0,
    endX: 100,
    endY: 0,
    colors: [
      { stop: 0, color: 'red' },
      { stop: 0.5, color: 'green' },
      { stop: 1, color: 'blue' },
    ],
  },
  },
  {
    source: 'local/file/path || image url',//you can provide an image url or local path and for images styling you can use same as above in shapes except for rotate and gradient which won't work.
    x: 120,
    y: 120,
    width: 210,
    height: 210,
    borderRadius: 20,///adding a radius to create a curvy edges or use 'circular' to make it a circle.
    shadow: {
      color: null,//shadow color.
      offsetX: 0,///shadow position off from image horizontally.
      offsetY: 0,///shadow postion off  from image vertically.
      opacity: 0,//shadow opacity.
      blur: 0,//shadow blur.
      borderRadius: null,///adding a radius to create a curvy edges or use 'circular' to make it a circle.
    }
  }, 
];
////image already got buffered you can send it directly or add text option
  const image = await paintImage.drawImages(images, canvasOptions, __dirname);

const textOptionsArray = [
  {
    text: 'elias79. Rank',//adding a text.
    x: 440,//text horizontally positon .
    y: 145,//text vetically position.
    fontName: 'Wind',//name your font as you want or use default (Arial).
    fontPath: './wind.ttf',//font path for custom font.
    fontSize: 50,///size of the font.
    color: 'white',//font color.
    shadow: {
    offsetX: 3,
    offsetY: 3,
    color: "rgba(0, 0, 0, 0.5)",
    blur: 5
  },
    stroke: {
        color: '#deff08',
        width: 1.2,
      },
  },
   {
    text: '95/100 XP',
    x: 530,
    y: 250,
    fontName: 'Arial',
    fontSize: 35,
    color: 'white',
    stroke: {
        color: 'black',
        width: 0.5,
      },
  },
];
///Adding the text on the drawn image before
const buffer = await paintImage.addText(textOptionsArray, image, __dirname);

//sending the buffered image with text on it 
 await message.channel.send({files: [buffer] });

Discord-Build ⚒️

  • Easy & Simple ways to make buttons & menus & paginator & permschecker
//////MAKE BUTTONS///////

const { ButtonManager } = require('apexify.js'); ///cjs modules .js

import { ButtonManager } from 'apexify.js'; /// ejs modules .mjs or ts

const buttonsData = [
  {
    customId: 'button1',
    style: 'Primary',// style: Primary, Secondary, Link, Danger, Success
    label: 'Primary Button',
    emoji: '😃',  // Emoji for the button
    disabled: false,  // Whether the button is disabled
  },
  {
    customId: 'button2',
    style: 'Secondary',
    label: 'Secondary Button',
    emoji: '🚀',
    disabled: true,
  },
  {
    customId: 'linkButton',
    style: 'Link',
    label: 'Link Button',
    url: 'https://example.com',  // URL for link-style button
    emoji: '🔗',
  },
];

// Create an instance of ButtonManager
const buttonManager = new ButtonManager(buttonsData);

// Create an action row with the buttons
const actionRow = buttonManager.ButtonBuild();

// Define a message with the action row
message.reply({ content: 'Click the buttons:',
  components: [actionRow],
});

// Define in interaction
interaction.reply({ content: 'Click the buttons:',
  components: [actionRow],
});


//////MAKE MENUS///////

const { SelectMenuManager } = require('apexify.js');// cjs module .js
import { SelectMenuManager } from 'apexify.js'; // ejs module .mjs or ts

// Define select menu options
const selectMenuOptions = [
  { label: 'Option 1', value: 'option1', description: 'Description for Option 1', emoji: '🌟', default: true },
  { label: 'Option 2', value: 'option2', description: 'Description for Option 2', emoji: '🚀' },
  { label: 'Option 3', value: 'option3', description: 'Description for Option 3', emoji: '🔗' },
];

// Create an instance of SelectMenuManager
const selectMenuManager = new SelectMenuManager(
  selectMenuOptions,
  'customSelectMenuId',  // Custom ID for the select menu
  'Select an option',    // Placeholder text for the select menu
  1,                      // Minimum number of selected values
  2,                       // Maximum number of selected values
  false                   // Disabled state for meny (true or false)
);

// Create a select menu with the specified options
const selectMenuRow = selectMenuManager.createSelectMenu();

// Define a message with the select menu
 message.reply({
  content: 'Please choose an option:',
  components: [selectMenuRow],
});

// Define a interaction with the select menu
 interaction.reply({
  content: 'Please choose an option:',
  components: [selectMenuRow],
});


////////MAKE EMBED PAGINATOR////////

const { Paginator } = require('apexify.js');// cjs module .js
import { Paginator } from 'apexify.js'; // ejs module .mjs or ts

const pageOptions = [
  {
    title: 'Page 1',
    description: 'Content for Page 1',
    color: '#3498db', // Hex color code
    authorName: 'Author Name',
    authorIcon: 'https://example.com/author-icon.png', // URL to author's icon
    footerName: 'Footer Name',
    footerIcon: 'https://example.com/footer-icon.png', // URL to footer's icon
    image: 'https://example.com/image.png', // URL to image
    thumbnail: 'https://example.com/thumbnail.png', // URL to thumbnail
    url: 'https://example.com/page-1', // URL for the entire embed
    timestamp: true, // Include timestamp
  },
  {
    title: 'Page 2',
    description: 'Content for Page 2',
    color: '#e74c3c',
    authorName: 'Another Author',
    authorIcon: 'https://example.com/another-author-icon.png',
    footerName: 'Another Footer',
    footerIcon: 'https://example.com/another-footer-icon.png',
    image: 'https://example.com/another-image.png',
    thumbnail: 'https://example.com/another-thumbnail.png',
    url: 'https://example.com/page-2',
    timestamp: true,
  },
  {
    title: 'Page 3',
    description: 'Content for Page 3',
    color: '#2ecc71',
    authorName: 'Yet Another Author',
    authorIcon: 'https://example.com/yet-another-author-icon.png',
    footerName: 'Yet Another Footer',
    footerIcon: 'https://example.com/yet-another-footer-icon.png',
    image: 'https://example.com/yet-another-image.png',
    thumbnail: 'https://example.com/yet-another-thumbnail.png',
    url: 'https://example.com/page-3',
    timestamp: true,
  },
  // Add more pages as needed
];

// Create an instance of the Paginator class
const paginator = new Paginator({ options: pageOptions, timeout: 30000 });

/// In messages
client.on('messageCreate', async (msg) => {
  // Check if the message author is a bot
  if (msg.author.bot) return;

  // Send the paginated message when the command !sendPaginator is received
  if (msg.content === '!sendPaginator') {
    const user = msg.author;
    const options = { ownerOnly: false, hidden: false, };

    // Send the paginated message
    await paginator.send(msg, user, options);
  }
});


/// In interactions
client.on('interactionCreate', async (i) => {
  // Check if the message author is a bot
  if (i.user.bot) return;

  // Send the paginated message when the command/ button is used
  if (i.customId === 'button') {
    const user = i.user;
    const options = { ownerOnly: false, hidden: false, };

    // Send the paginated message
    await paginator.send(i, user, options);
  }
});


//////PERMISSION CHECKER///////

const { PermissionChecker } = require('apexify.js'); // cjs module .js
import { PermissionChecker } from 'apexify.js'; // ejs module .mjs or ts


client.on('messageCreate', async (message) => {
    if (message.content.startsWith('!checkPermissions')) {
        try {
            // Specify the required permissions you want to check
            const requiredPermissions = ['KickMembers', 'BanMembers', 'ManageChannels'];

            // Instantiate the PermissionChecker
            const permissionChecker = new PermissionChecker();

            // Check if the message author has the required permissions
            const hasPermissions = await permissionChecker.checker(message.author.id, message.guild, requiredPermissions);

            if (hasPermissions) {
                message.reply('You have the required permissions!');
            } else {
                message.reply('You do not have the required permissions!');
            }
        } catch (error) {
            console.error('Error:', error.message);
        }
    }
});


client.on('interactionCreate', async (i) => {
    if (i.customId === 'button_checker') {
        try {
            // Specify the required permissions you want to check
            const requiredPermissions = ['KickMembers', 'BanMembers', 'ManageChannels'];

            // Instantiate the PermissionChecker
            const permissionChecker = new PermissionChecker();

            // Check if the message author has the required permissions
            const hasPermissions = await permissionChecker.checker(i.user.id, i.guild, requiredPermissions);

            if (hasPermissions) {
                i.reply('You have the required permissions!');
            } else {
                i.reply('You do not have the required permissions!');
            }
        } catch (error) {
            console.error('Error:', error.message);
        }
    }
});

📚 More Info & Documentation 📖

  • Explore a detailed list of apexify.js and their usage at our Support Server.

🚨 Important Notes 📌

  1. Voice Messages: Currently in beta, occasional disruptions may occur.

  2. Commands: Support for slash commands is coming soon.

  3. Music: Utilizing Lavalink for audio streaming. Customize Lavalink node if needed.

  4. Database: There is two type of Database NanoDb (local db json) and MongoDb (online db bson).

Keep experimenting, and feel free to contact me for assistance! Suggestions and adjustments are welcome. 🌟

Draw Models

Click to display models - v1 - v2 - v2-beta - lexica - prodia - animefy - raava - shonin - v3 - 3Guofeng3_v34.safetensors [50f420de] - absolutereality_V16.safetensors [37db0fc3] - absolutereality_v181.safetensors [3d9d4d2b] - amIReal_V41.safetensors [0a8a2e61] - analog-diffusion-1.0.ckpt [9ca13f02] - anythingv3_0-pruned.ckpt [2700c435] - anything-v4.5-pruned.ckpt [65745d25] - anythingV5_PrtRE.safetensors [893e49b9] - AOM3A3_orangemixs.safetensors [9600da17] - blazing_drive_v10g.safetensors [ca1c1eab] - cetusMix_Version35.safetensors [de2f2560] - childrensStories_v13D.safetensors [9dfaabcb] - childrensStories_v1SemiReal.safetensors [a1c56dbb] - childrensStories_v1ToonAnime.safetensors [2ec7b88b] - Counterfeit_v30.safetensors [9e2a8f19] - cuteyukimixAdorable_midchapter3.safetensors [04bdffe6] - cyberrealistic_v33.safetensors [82b0d085] - dalcefo_v4.safetensors [425952fe] - deliberate_v2.safetensors [10ec4b29] - deliberate_v3.safetensors [afd9d2d4] - dreamlike-anime-1.0.safetensors [4520e090] - dreamlike-diffusion-1.0.safetensors [5c9fd6e0] - dreamlike-photoreal-2.0.safetensors [fdcf65e7] - dreamshaper_6BakedVae.safetensors [114c8abb] - dreamshaper_7.safetensors [5cf5ae06] - dreamshaper_8.safetensors [9d40847d] - edgeOfRealism_eorV20.safetensors [3ed5de15] - EimisAnimeDiffusion_V1.ckpt [4f828a15] - elldreths-vivid-mix.safetensors [342d9d26] - epicrealism_naturalSinRC1VAE.safetensors [90a4c676] - ICantBelieveItsNotPhotography_seco.safetensors [4e7a3dfd] - juggernaut_aftermath.safetensors [5e20c455] - lofi_v4.safetensors [ccc204d6] - lyriel_v16.safetensors [68fceea2] - majicmixRealistic_v4.safetensors [29d0de58] - mechamix_v10.safetensors [ee685731] - meinamix_meinaV9.safetensors [2ec66ab0] - meinamix_meinaV11.safetensors [b56ce717] - neverendingDream_v122.safetensors [f964ceeb] - openjourney_V4.ckpt [ca2f377f] - pastelMixStylizedAnime_pruned_fp16.safetensors [793a26e8] - portraitplus_V1.0.safetensors [1400e684] - protogenx34.safetensors [5896f8d5] - Realistic_Vision_V1.4-pruned-fp16.safetensors [8d21810b] - Realistic_Vision_V2.0.safetensors [79587710] - Realistic_Vision_V4.0.safetensors [29a7afaa] - Realistic_Vision_V5.0.safetensors [614d1063] - redshift_diffusion-V10.safetensors [1400e684] - revAnimated_v122.safetensors [3f4fefd9] - rundiffusionFX25D_v10.safetensors [cd12b0ee] - rundiffusionFX_v10.safetensors [cd4e694d] - sdv1_4.ckpt [7460a6fa] - v1-5-pruned-emaonly.safetensors [d7049739] - v1-5-inpainting.safetensors [21c7ab71] - shoninsBeautiful_v10.safetensors [25d8c546] - theallys-mix-ii-churned.safetensors [5d9225a4] - timeless-1.0.ckpt [7c4971d4] - toonyou_beta6.safetensors [980f6b15]

chat Models

Click to display models - v3 - v3-32k - turbo - turbo-16k - gemini - apexChat - gemma-v3 - gemma-v4 - starChat - zephyr-beta

Voice Models

Click to display models
  • Language Name Language Code Voice Code Voice Type Voice Gender
  • Afrikaans (South Africa) af-ZA af-ZA-1 Neural Female
  • Afrikaans (South Africa) af-ZA af-ZA-2 Neural Male
  • Amharic (Ethiopia) am-ET am-ET-1 Neural Male
  • Amharic (Ethiopia) am-ET am-ET-2 Neural Female
  • Arabic (United Arab Emirates) ar-AE ar-AE-1 Neural Female
  • Arabic (United Arab Emirates) ar-AE ar-AE-2 Neural Male
  • Arabic (Bahrain) ar-BH ar-BH-1 Neural Male
  • Arabic (Bahrain) ar-BH ar-BH-2 Neural Female
  • Arabic (Algeria) ar-DZ ar-DZ-1 Neural Female
  • Arabic (Algeria) ar-DZ ar-DZ-2 Neural Male
  • Arabic (Egypt) ar-EG ar-EG-1 Neural Female
  • Arabic (Egypt) ar-EG ar-EG-2 Neural Male
  • Arabic (Egypt) ar-EG ar-EG-3 Standard Female
  • Arabic (Iraq) ar-IQ ar-IQ-1 Neural Male
  • Arabic (Iraq) ar-IQ ar-IQ-2 Neural Female
  • Arabic (Jordan) ar-JO ar-JO-1 Neural Female
  • Arabic (Jordan) ar-JO ar-JO-2 Neural Male
  • Arabic (Kuwait) ar-KW ar-KW-1 Neural Male
  • Arabic (Kuwait) ar-KW ar-KW-2 Neural Female
  • Arabic (Libya) ar-LY ar-LY-1 Neural Female
  • Arabic (Libya) ar-LY ar-LY-2 Neural Male
  • Arabic (Morocco) ar-MA ar-MA-1 Neural Male
  • Arabic (Morocco) ar-MA ar-MA-2 Neural Female
  • Arabic (Qatar) ar-QA ar-QA-1 Neural Female
  • Arabic (Qatar) ar-QA ar-QA-2 Neural Male
  • Arabic (Saudi Arabia) ar-SA ar-SA-1 Neural Male
  • Arabic (Saudi Arabia) ar-SA ar-SA-2 Neural Female
  • Arabic (Saudi Arabia) ar-SA ar-SA-3 Standard Male
  • Arabic (Syria) ar-SY ar-SY-1 Neural Female
  • Arabic (Syria) ar-SY ar-SY-2 Neural Male
  • Arabic (Tunisia) ar-TN ar-TN-1 Neural Male
  • Arabic (Tunisia) ar-TN ar-TN-2 Neural Female
  • Arabic (Yemen) ar-YE ar-YE-1 Neural Female
  • Arabic (Yemen) ar-YE ar-YE-2 Neural Male
  • Bulgarian (Bulgaria) bg-BG bg-BG-1 Neural Male
  • Bulgarian (Bulgaria) bg-BG bg-BG-2 Neural Female
  • Bulgarian (Bulgaria) bg-BG bg-BG-3 Standard Male
  • Bangla (Bangladesh) bn-BD bn-BD-1 Neural Female
  • Bangla (Bangladesh) bn-BD bn-BD-2 Neural Male
  • Catalan (Spain) ca-ES ca-ES-1 Neural Female
  • Catalan (Spain) ca-ES ca-ES-2 Neural Female
  • Catalan (Spain) ca-ES ca-ES-3 Neural Male
  • Catalan (Spain) ca-ES ca-ES-4 Standard Female
  • Czech (Czech) cs-CZ cs-CZ-1 Neural Male
  • Czech (Czech) cs-CZ cs-CZ-2 Neural Female
  • Czech (Czech) cs-CZ cs-CZ-3 Standard Male
  • Welsh (United Kingdom) cy-GB cy-GB-1 Neural Male
  • Welsh (United Kingdom) cy-GB cy-GB-2 Neural Female
  • Danish (Denmark) da-DK da-DK-1 Neural Female
  • Danish (Denmark) da-DK da-DK-2 Neural Male
  • Danish (Denmark) da-DK da-DK-3 Standard Female
  • German (Austria) de-AT de-AT-1 Neural Female
  • German (Austria) de-AT de-AT-2 Neural Male
  • German (Austria) de-AT de-AT-3 Standard Male
  • German (Switzerland) de-CH de-CH-1 Neural Male
  • German (Switzerland) de-CH de-CH-2 Neural Female
  • German (Switzerland) de-CH de-CH-3 Standard Male
  • German (Germany) de-DE de-DE-1 Neural Female
  • German (Germany) de-DE de-DE-2 Neural Male
  • German (Germany) de-DE de-DE-3 Standard Female
  • German (Germany) de-DE de-DE-4 Standard Male
  • Greek (Greece) el-GR el-GR-1 Neural Female
  • Greek (Greece) el-GR el-GR-2 Neural Male
  • Greek (Greece) el-GR el-GR-3 Standard Male
  • English (Australia) en-AU en-AU-1 Neural Female
  • English (Australia) en-AU en-AU-2 Neural Male
  • English (Australia) en-AU en-AU-3 Standard Female
  • English (Australia) en-AU en-AU-4 Standard Female
  • English (Canada) en-CA en-CA-1 Neural Female
  • English (Canada) en-CA en-CA-2 Neural Male
  • English (Canada) en-CA en-CA-3 Standard Female
  • English (Canada) en-CA en-CA-4 Standard Female
  • English (United Kingdom) en-GB en-GB-1 Neural Female
  • English (United Kingdom) en-GB en-GB-2 Neural Male
  • English (United Kingdom) en-GB en-GB-3 Neural Female
  • English (United Kingdom) en-GB en-GB-4 Neural Female
  • English (United Kingdom) en-GB en-GB-5 Standard Male
  • English (United Kingdom) en-GB en-GB-6 Standard Female
  • English (United Kingdom) en-GB en-GB-7 Standard Female
  • English (Hongkong) en-HK en-HK-1 Neural Male
  • English (Hongkong) en-HK en-HK-2 Neural Female
  • English (Ireland) en-IE en-IE-1 Neural Male
  • English (Ireland) en-IE en-IE-2 Neural Female
  • English (Ireland) en-IE en-IE-3 Standard Male
  • English (India) en-IN en-IN-1 Neural Female
  • English (India) en-IN en-IN-2 Neural Male
  • English (India) en-IN en-IN-3 Standard Female
  • English (India) en-IN en-IN-4 Standard Female
  • English (India) en-IN en-IN-5 Standard Male
  • English (Kenya) en-KE en-KE-1 Neural Female
  • English (Kenya) en-KE en-KE-2 Neural Male
  • English (Nigeria) en-NG en-NG-1 Neural Male
  • English (Nigeria) en-NG en-NG-2 Neural Female
  • English (New Zealand) en-NZ en-NZ-1 Neural Male
  • English (New Zealand) en-NZ en-NZ-2 Neural Female
  • English (Philippines) en-PH en-PH-1 Neural Male
  • English (Philippines) en-PH en-PH-2 Neural Female
  • English (Singapore) en-SG en-SG-1 Neural Female
  • English (Singapore) en-SG en-SG-2 Neural Male
  • English (Tanzania) en-TZ en-TZ-1 Neural Male
  • English (Tanzania) en-TZ en-TZ-2 Neural Female
  • English (United States) en-US en-US-1 Neural Female
  • English (United States) en-US en-US-2 Neural Female
  • English (United States) en-US en-US-3 Neural Male
  • English (United States) en-US en-US-4 Neural Female
  • English (United States) en-US en-US-5 Neural Female
  • English (United States) en-US en-US-6 Neural Female
  • English (United States) en-US en-US-7 Neural Female
  • English (United States) en-US en-US-8 Neural Male
  • English (United States) en-US en-US-9 Neural Male
  • English (United States) en-US en-US-10 Neural Female
  • English (United States) en-US en-US-11 Neural Female
  • English (United States) en-US en-US-12 Neural Male
  • English (United States) en-US en-US-13 Neural Male
  • English (United States) en-US en-US-14 Neural Female
  • English (United States) en-US en-US-15 Neural Female
  • English (United States) en-US en-US-16 Neural Female
  • English (United States) en-US en-US-17 Standard Female
  • English (United States) en-US en-US-18 Standard Male
  • English (United States) en-US en-US-19 Standard Male
  • English (United States) en-US en-US-20 Standard Female
  • English (South Africa) en-ZA en-ZA-1 Neural Female
  • English (South Africa) en-ZA en-ZA-2 Neural Male
  • Spanish (Argentina) es-AR es-AR-1 Neural Female
  • Spanish (Argentina) es-AR es-AR-2 Neural Male
  • Spanish (Bolivia) es-BO es-BO-1 Neural Male
  • Spanish (Bolivia) es-BO es-BO-2 Neural Female
  • Spanish (Chile) es-CL es-CL-1 Neural Female
  • Spanish (Chile) es-CL es-CL-2 Neural Male
  • Spanish (Colombia) es-CO es-CO-1 Neural Male
  • Spanish (Colombia) es-CO es-CO-2 Neural Female
  • Spanish (Costa Rica) es-CR es-CR-1 Neural Male
  • Spanish (Costa Rica) es-CR es-CR-2 Neural Female
  • Spanish (Cuba) es-CU es-CU-1 Neural Female
  • Spanish (Cuba) es-CU es-CU-2 Neural Male
  • Spanish (Dominican Republic) es-DO es-DO-1 Neural Male
  • Spanish (Dominican Republic) es-DO es-DO-2 Neural Female
  • Spanish (Ecuador) es-EC es-EC-1 Neural Female
  • Spanish (Ecuador) es-EC es-EC-2 Neural Male
  • Spanish (Spain) es-ES es-ES-1 Neural Male
  • Spanish (Spain) es-ES es-ES-2 Neural Female
  • Spanish (Spain) es-ES es-ES-3 Standard Female
  • Spanish (Spain) es-ES es-ES-4 Standard Female
  • Spanish (Spain) es-ES es-ES-5 Standard Male
  • Spanish (Equatorial Guinea) es-GQ es-GQ-1 Neural Male
  • Spanish (Equatorial Guinea) es-GQ es-GQ-2 Neural Female
  • Spanish (Guatemala) es-GT es-GT-1 Neural Male
  • Spanish (Guatemala) es-GT es-GT-2 Neural Female
  • Spanish (Honduras) es-HN es-HN-1 Neural Male
  • Spanish (Honduras) es-HN es-HN-2 Neural Female
  • Spanish (Mexico) es-MX es-MX-1 Neural Female
  • Spanish (Mexico) es-MX es-MX-2 Neural Male
  • Spanish (Mexico) es-MX es-MX-3 Standard Female
  • Spanish (Mexico) es-MX es-MX-4 Standard Male
  • Spanish (Nicaragua) es-NI es-NI-1 Neural Male
  • Spanish (Nicaragua) es-NI es-NI-2 Neural Female
  • Spanish (Panama) es-PA es-PA-1 Neural Female
  • Spanish (Panama) es-PA es-PA-2 Neural Male
  • Spanish (Peru) es-PE es-PE-1 Neural Male
  • Spanish (Peru) es-PE es-PE-2 Neural Female
  • Spanish (Puerto Rico) es-PR es-PR-1 Neural Female
  • Spanish (Puerto Rico) es-PR es-PR-2 Neural Male
  • Spanish (Paraguay) es-PY es-PY-1 Neural Male
  • Spanish (Paraguay) es-PY es-PY-2 Neural Female
  • Spanish (El Salvador) es-SV es-SV-1 Neural Female
  • Spanish (El Salvador) es-SV es-SV-2 Neural Male
  • Spanish (United States) es-US es-US-1 Neural Male
  • Spanish (United States) es-US es-US-2 Neural Female
  • Spanish (Uruguay) es-UY es-UY-1 Neural Male
  • Spanish (Uruguay) es-UY es-UY-2 Neural Female
  • Spanish (Venezuela) es-VE es-VE-1 Neural Female
  • Spanish (Venezuela) es-VE es-VE-2 Neural Male
  • Estonian (Estonia) et-EE et-EE-1 Neural Female
  • Estonian (Estonia) et-EE et-EE-2 Neural Male
  • Persian (Iran) fa-IR fa-IR-1 Neural Female
  • Persian (Iran) fa-IR fa-IR-2 Neural Male
  • Finnish (Finland) fi-FI fi-FI-1 Neural Female
  • Finnish (Finland) fi-FI fi-FI-2 Neural Male
  • Finnish (Finland) fi-FI fi-FI-3 Neural Female
  • Finnish (Finland) fi-FI fi-FI-4 Standard Female
  • Filipino (Philippines) fil-PH fil-PH-1 Neural Male
  • Filipino (Philippines) fil-PH fil-PH-2 Neural Female
  • French (Belgium) fr-BE fr-BE-1 Neural Female
  • French (Belgium) fr-BE fr-BE-2 Neural Male
  • French (Canada) fr-CA fr-CA-1 Neural Female
  • French (Canada) fr-CA fr-CA-2 Neural Male
  • French (Canada) fr-CA fr-CA-3 Neural Male
  • French (Canada) fr-CA fr-CA-4 Standard Female
  • French (Canada) fr-CA fr-CA-5 Standard Female
  • French (Switzerland) fr-CH fr-CH-1 Neural Female
  • French (Switzerland) fr-CH fr-CH-2 Neural Male
  • French (Switzerland) fr-CH fr-CH-3 Standard Male
  • French (France) fr-FR fr-FR-1 Neural Female
  • French (France) fr-FR fr-FR-2 Neural Male
  • French (France) fr-FR fr-FR-3 Standard Female
  • French (France) fr-FR fr-FR-4 Standard Female
  • French (France) fr-FR fr-FR-5 Standard Male
  • Irish (Ireland) ga-IE ga-IE-1 Neural Male
  • Irish (Ireland) ga-IE ga-IE-2 Neural Female
  • Galician (Spain) gl-ES gl-ES-1 Neural Male
  • Galician (Spain) gl-ES gl-ES-2 Neural Female
  • Gujarati (India) gu-IN gu-IN-1 Neural Female
  • Gujarati (India) gu-IN gu-IN-2 Neural Male
  • Hebrew (Israel) he-IL he-IL-1 Neural Male
  • Hebrew (Israel) he-IL he-IL-2 Neural Female
  • Hebrew (Israel) he-IL he-IL-3 Standard Male
  • Hindi (India) hi-IN hi-IN-1 Neural Male
  • Hindi (India) hi-IN hi-IN-2 Neural Female
  • Hindi (India) hi-IN hi-IN-3 Standard Male
  • Hindi (India) hi-IN hi-IN-4 Standard Female
  • Croatian (Croatia) hr-HR hr-HR-1 Neural Female
  • Croatian (Croatia) hr-HR hr-HR-2 Neural Male
  • Croatian (Croatia) hr-HR hr-HR-3 Standard Male
  • Hungarian (Hungary) hu-HU hu-HU-1 Neural Female
  • Hungarian (Hungary) hu-HU hu-HU-2 Neural Male
  • Hungarian (Hungary) hu-HU hu-HU-3 Standard Male
  • Indonesian (Indonesia) id-ID id-ID-1 Neural Male
  • Indonesian (Indonesia) id-ID id-ID-2 Neural Female
  • Indonesian (Indonesia) id-ID id-ID-3 Standard Male
  • Italian (Italy) it-IT it-IT-1 Neural Female
  • Italian (Italy) it-IT it-IT-2 Neural Male
  • Italian (Italy) it-IT it-IT-3 Neural Female
  • Italian (Italy) it-IT it-IT-4 Standard Male
  • Italian (Italy) it-IT it-IT-5 Standard Female
  • Japanese (Japan) ja-JP ja-JP-1 Neural Female
  • Japanese (Japan) ja-JP ja-JP-2 Neural Male
  • Japanese (Japan) ja-JP ja-JP-3 Standard Female
  • Japanese (Japan) ja-JP ja-JP-4 Standard Female
  • Japanese (Japan) ja-JP ja-JP-5 Standard Male
  • Javanese (Indonesia) jv-ID jv-ID-1 Neural Male
  • Javanese (Indonesia) jv-ID jv-ID-2 Neural Female
  • Khmer (Cambodia) km-KH km-KH-1 Neural Male
  • Khmer (Cambodia) km-KH km-KH-2 Neural Female
  • Korean (Korea) ko-KR ko-KR-1 Neural Female
  • Korean (Korea) ko-KR ko-KR-2 Neural Male
  • Korean (Korea) ko-KR ko-KR-3 Standard Female
  • Lithuanian (Lithuania) lt-LT lt-LT-1 Neural Male
  • Lithuanian (Lithuania) lt-LT lt-LT-2 Neural Female
  • Latvian (Latvia) lv-LV lv-LV-1 Neural Female
  • Latvian (Latvia) lv-LV lv-LV-2 Neural Male
  • Marathi (India) mr-IN mr-IN-1 Neural Female
  • Marathi (India) mr-IN mr-IN-2 Neural Male
  • Malay (Malaysia) ms-MY ms-MY-1 Neural Male
  • Malay (Malaysia) ms-MY ms-MY-2 Neural Female
  • Malay (Malaysia) ms-MY ms-MY-3 Standard Male
  • Maltese (Malta) mt-MT mt-MT-1 Neural Female
  • Maltese (Malta) mt-MT mt-MT-2 Neural Male
  • Burmese (Myanmar) my-MM my-MM-1 Neural Female
  • Burmese (Myanmar) my-MM my-MM-2 Neural Male
  • Norwegian (Bokmål, Norway) nb-NO nb-NO-1 Neural Female
  • Norwegian (Bokmål, Norway) nb-NO nb-NO-2 Neural Male
  • Norwegian (Bokmål, Norway) nb-NO nb-NO-3 Neural Female
  • Norwegian (Bokmål, Norway) nb-NO nb-NO-4 Standard Female
  • Dutch (Belgium) nl-BE nl-BE-1 Neural Male
  • Dutch (Belgium) nl-BE nl-BE-2 Neural Female
  • Dutch (Netherlands) nl-NL nl-NL-1 Neural Female
  • Dutch (Netherlands) nl-NL nl-NL-2 Neural Female
  • Dutch (Netherlands) nl-NL nl-NL-3 Neural Male
  • Dutch (Netherlands) nl-NL nl-NL-4 Standard Female
  • Polish (Poland) pl-PL pl-PL-1 Neural Female
  • Polish (Poland) pl-PL pl-PL-2 Neural Male
  • Polish (Poland) pl-PL pl-PL-3 Neural Female
  • Polish (Poland) pl-PL pl-PL-4 Standard Female
  • Portuguese (Brazil) pt-BR pt-BR-1 Neural Female
  • Portuguese (Brazil) pt-BR pt-BR-2 Neural Male
  • Portuguese (Brazil) pt-BR pt-BR-3 Standard Male
  • Portuguese (Brazil) pt-BR pt-BR-4 Standard Female
  • Portuguese (Portugal) pt-PT pt-PT-1 Neural Male
  • Portuguese (Portugal) pt-PT pt-PT-2 Neural Female
  • Portuguese (Portugal) pt-PT pt-PT-3 Neural Female
  • Romanian (Romania) ro-RO ro-RO-1 Neural Female
  • Romanian (Romania) ro-RO ro-RO-2 Neural Male
  • Romanian (Romania) ro-RO ro-RO-3 Standard Male
  • Russian (Russia) ru-RU ru-RU-1 Neural Female
  • Russian (Russia) ru-RU ru-RU-2 Neural Female
  • Russian (Russia) ru-RU ru-RU-3 Neural Male
  • Russian (Russia) ru-RU ru-RU-4 Standard Female
  • Russian (Russia) ru-RU ru-RU-5 Standard Female
  • Russian (Russia) ru-RU ru-RU-6 Standard Male
  • Slovak (Slovakia) sk-SK sk-SK-1 Neural Male
  • Slovak (Slovakia) sk-SK sk-SK-2 Neural Female
  • Slovak (Slovakia) sk-SK sk-SK-3 Standard Male
  • Slovenian (Slovenia) sl-SI sl-SI-1 Neural Female
  • Slovenian (Slovenia) sl-SI sl-SI-2 Neural Male
  • Slovenian (Slovenia) sl-SI sl-SI-3 Standard Male
  • Somali (Somalia) so-SO so-SO-1 Neural Male
  • Somali (Somalia) so-SO so-SO-2 Neural Female
  • Sundanese (Indonesia) su-ID su-ID-1 Neural Male
  • Sundanese (Indonesia) su-ID su-ID-2 Neural Female
  • Swedish (Sweden) sv-SE sv-SE-1 Neural Female
  • Swedish (Sweden) sv-SE sv-SE-2 Neural Female
  • Swedish (Sweden) sv-SE sv-SE-3 Neural Male
  • Swedish (Sweden) sv-SE sv-SE-4 Standard Female
  • Swahili (Kenya) sw-KE sw-KE-1 Neural Male
  • Swahili (Kenya) sw-KE sw-KE-2 Neural Female
  • Swahili (Tanzania) sw-TZ sw-TZ-1 Neural Male
  • Swahili (Tanzania) sw-TZ sw-TZ-2 Neural Female
  • Tamil (India) ta-IN ta-IN-1 Neural Female
  • Tamil (India) ta-IN ta-IN-2 Neural Male
  • Tamil (India) ta-IN ta-IN-3 Standard Male
  • Tamil (Sri Lanka) ta-LK ta-LK-1 Neural Male
  • Tamil (Sri Lanka) ta-LK ta-LK-2 Neural Female
  • Tamil (Singapore) ta-SG ta-SG-1 Neural Male
  • Tamil (Singapore) ta-SG ta-SG-2 Neural Female
  • Telugu (India) te-IN te-IN-1 Neural Male
  • Telugu (India) te-IN te-IN-2 Neural Female
  • Telugu (India) te-IN te-IN-3 Standard Female
  • Thai (Thailand) th-TH th-TH-1 Neural Female
  • Thai (Thailand) th-TH th-TH-2 Neural Female
  • Thai (Thailand) th-TH th-TH-3 Neural Male
  • Thai (Thailand) th-TH th-TH-4 Standard Male
  • Turkish (Turkey) tr-TR tr-TR-1 Neural Male
  • Turkish (Turkey) tr-TR tr-TR-2 Neural Female
  • Turkish (Turkey) tr-TR tr-TR-3 Standard Female
  • Ukrainian (Ukraine) uk-UA uk-UA-1 Neural Male
  • Ukrainian (Ukraine) uk-UA uk-UA-2 Neural Female
  • Urdu (India) ur-IN ur-IN-1 Neural Female
  • Urdu (India) ur-IN ur-IN-2 Neural Male
  • Urdu (Pakistan) ur-PK ur-PK-1 Neural Male
  • Urdu (Pakistan) ur-PK ur-PK-2 Neural Female
  • Uzbek (Uzbekistan) uz-UZ uz-UZ-1 Neural Female
  • Uzbek (Uzbekistan) uz-UZ uz-UZ-2 Neural Male
  • Vietnamese (Vietnam) vi-VN vi-VN-1 Neural Female
  • Vietnamese (Vietnam) vi-VN vi-VN-2 Neural Male
  • Vietnamese (Vietnam) vi-VN vi-VN-3 Standard Male
  • Chinese (Mandarin, Simplified) zh-CN zh-CN-1 Neural Female
  • Chinese (Mandarin, Simplified) zh-CN zh-CN-2 Neural Male
  • Chinese (Mandarin, Simplified) zh-CN zh-CN-3 Neural Female
  • Chinese (Mandarin, Simplified) zh-CN zh-CN-4 Neural Female
  • Chinese (Mandarin, Simplified) zh-CN zh-CN-5 Neural Female
  • Chinese (Mandarin, Simplified) zh-CN zh-CN-6 Neural Female
  • Chinese (Mandarin, Simplified) zh-CN zh-CN-7 Neural Female
  • Chinese (Mandarin, Simplified) zh-CN zh-CN-8 Neural Male
  • Chinese (Mandarin, Simplified) zh-CN zh-CN-9 Neural Male
  • Chinese (Mandarin, Simplified) zh-CN zh-CN-10 Neural Female
  • Chinese (Mandarin, Simplified) zh-CN zh-CN-11 Neural Female
  • Chinese (Mandarin, Simplified) zh-CN zh-CN-12 Neural Female
  • Chinese (Mandarin, Simplified) zh-CN zh-CN-13 Neural Female
  • Chinese (Mandarin, Simplified) zh-CN zh-CN-14 Standard Female
  • Chinese (Mandarin, Simplified) zh-CN zh-CN-15 Standard Male
  • Chinese (Mandarin, Simplified) zh-CN zh-CN-16 Standard Female
  • Chinese (Cantonese, Traditional) zh-HK zh-HK-1 Neural Female
  • Chinese (Cantonese, Traditional) zh-HK zh-HK-2 Neural Female
  • Chinese (Cantonese, Traditional) zh-HK zh-HK-3 Neural Male
  • Chinese (Cantonese, Traditional) zh-HK zh-HK-4 Standard Male
  • Chinese (Cantonese, Traditional) zh-HK zh-HK-5 Standard Female
  • Chinese (Taiwanese Mandarin) zh-TW zh-TW-1 Neural Female
  • Chinese (Taiwanese Mandarin) zh-TW zh-TW-2 Neural Female
  • Chinese (Taiwanese Mandarin) zh-TW zh-TW-3 Neural Male
  • Chinese (Taiwanese Mandarin) zh-TW zh-TW-4 Standard Female
  • Chinese (Taiwanese Mandarin) zh-TW zh-TW-5 Standard Female
  • Chinese (Taiwanese Mandarin) zh-TW zh-TW-6 Standard Male
  • Zulu (South Africa) zu-ZA zu-ZA-1 Neural Female
  • Zulu (South Africa) zu-ZA zu-ZA-2 Neural Male