Wednesday, July 17, 2024

Debian: using Festival to generate voice from text (Text To Speech/TTS) - AI TTS

folder voice

$ ls /usr/share/festival/voices/english/

Using command interpreter:

$ festival
...
festival> (voice.list)
(kal_diphone)
festival> (SayText "Hello")
#<Utterance 0x7f8747f99ef0>

festival> (quit)

Load text from file output direct to sound

$ festival --tts ./hello.txt 

Load text from file output direct to file

$ text2wave ./hello.txt -o text1.wav

Monday, July 8, 2024

java 17: shuffle 52 playing cards and sort the order base on bridge playing game

This is the code to shuffle 52 playing cards for 4 players and re order each hand cards. I provide to order card base on trump (at right side).

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Random;

public class Test {
    /*
     * TODO how to repesent card
     */
    public final static String[] S_CLUB = {
        "2C",
        "3C",
        "4C",
        "5C",
        "6C",
        "7C",
        "8C",
        "9C",
        "10C",
        "JC", //JC
        "QC", //QC
        "KC", //KC
        "AC"  //AC
    };

    public final static String[] S_DIAMOND = {
        "2D",
        "3D",
        "4D",
        "5D",
        "6D",
        "7D",
        "8D",
        "9D",
        "10D",
        "JD",
        "QD",
        "KD",
        "AD"
    };
    
    public final static String[] S_HEART = {
        "2H",
        "3H",
        "4H",
        "5H",
        "6H",
        "7H",
        "8H",
        "9H",
        "10H",
        "JH",
        "QH",
        "KH",
        "AH"
    };
    
    public final static String[] S_SPADE = {
        "2S",
        "3S",
        "4S",
        "5S",
        "6S",
        "7S",
        "8S",
        "9S",
        "10S",
        "JS",
        "QS",
        "KS",
        "AS"
    };
    
    public static void main(String[] args) {

        long startTime = System.nanoTime();
        shuffleCard();
        long endTime = System.nanoTime();
        System.out.println("North");
        for (int i=0;i<13;i++) {
            System.out.print(north[i]+" ");
        }
        System.out.println();
        System.out.println("After Sorting");
        ArrayList<String> tmp = sortEnd2Begin(north);
        tmp.forEach((String myCard) ->{
            System.out.print(myCard+" ");
        });
        System.out.println();
        

        System.out.println("EAST");
        for (int i=0;i<13;i++) {
            System.out.print(east[i]+" ");
        }
        System.out.println();
        System.out.println("After Sorting");
        tmp = sortEnd2Begin(east);
        tmp.forEach((String myCard) ->{
            System.out.print(myCard+" ");
        });
        System.out.println();
        
        System.out.println("South");
        for (int i=0;i<13;i++) {
            System.out.print(south[i]+" ");
        }
        System.out.println();
        System.out.println("After Sorting");
        tmp = sortEnd2Begin(south);
        tmp.forEach((String myCard) ->{
            System.out.print(myCard+" ");
        });
        System.out.println();
        
        System.out.println("West");
        for (int i=0;i<13;i++) {
            System.out.print(west[i]+" ");
        }
        System.out.println();
        System.out.println("After Sorting");
        tmp = sortEnd2Begin(west);
        tmp.forEach((String myCard) ->{
            System.out.print(myCard+" ");
        });
        System.out.println();

        System.out.println((endTime-startTime)%1000000+" mili"); // time_ms % 1E+3 + " MicroSeconds, "


    }
    
    static String[] north = new String[13];
    static String[] east = new String[13];
    static String[] south = new String[13];
    static String[] west = new String[13];
    
    private static void shuffleCard() {
        //TODO
        ArrayList<String> cards = new ArrayList<>();
        List<String> listCard = Arrays.asList(S_CLUB);
        cards.addAll(listCard);
        listCard = Arrays.asList(S_DIAMOND);
        cards.addAll(listCard);
        listCard = Arrays.asList(S_HEART);
        cards.addAll(listCard);
        listCard = Arrays.asList(S_SPADE);
        cards.addAll(listCard);
        //System.out.println("card number: "+cards.size()); // debug
        
        cards = shuffle(1,cards);
        
        //System.out.println("Distribution "+cards.size());
        int topPosition = cards.size()-1;
        for (int i=0;i<13;i++) {
            //System.out.println("north "+i+" "+topPosition);  // debug
            String tmp = cards.get(topPosition);
            cards.remove(topPosition);
            topPosition --;
            north[i] = tmp;
            //System.out.println("east "+i+" "+topPosition);  // debug
            tmp = cards.get(topPosition);
            cards.remove(topPosition);
            topPosition --;
            east[i] = tmp;
            //System.out.println("south "+i+" "+topPosition);  // debug
            tmp = cards.get(topPosition);
            cards.remove(topPosition);
            topPosition --;
            south[i] = tmp;
            //System.out.println("west "+i+" "+topPosition);  // debug
            tmp = cards.get(topPosition);
            cards.remove(topPosition);
            topPosition --;
            west[i] = tmp;    
        }
        
        
    }
    
    static Random rand = new Random();
    
    private static ArrayList<String> shuffle(int numSuffle, ArrayList<String> cards) {
        //System.out.println("Suffle: "+numSuffle);  // debug
        Collections.shuffle(cards, rand);
        //System.out.println("Card size "+cards.size()); // debug
        
        if (numSuffle>0) {
            shuffle(numSuffle-1, cards);
        }
        
        return cards;
    }
    
    private static ArrayList<String> sortEnd2Begin(String[] myCards) {
        ArrayList<String> myNewCards = new ArrayList<>();
        myNewCards.add(myCards[0]);
        for (int i=1;i<myCards.length;i++) {
            // loop for unordered myCards
            String card2Sort = myCards[i];
            for (int j=0;j<myNewCards.size();j++) {
                // loop for ordered myNewCards
                // find until card2Sort equal or bigger then existing list
                String cardIterate = myNewCards.get(j);
                //int posCard = beforeOrAfter(card2Sort, cardIterate, 0, iterMax);
                int posCard = beforeOrAfter2(card2Sort, cardIterate);
                if (posCard<=0) {
                    myNewCards.add(j, card2Sort);
                    break;
                } else {
                    //System.out.println(j); // debug
                    if (j+1==myNewCards.size()) {
                        // end of list
                        myNewCards.add(card2Sort);
                        break;
                    }
                }
            }

        }
        return myNewCards;
    }
    
    
    /* -1 wordA before wordB
     * 0 wordA equal wordB
     * 1 wordA after wordB
     * suite order less C D H S higher
     * value suit  less 0 1 2 3 4 5 6 7 8 9 A J K Q
     * map 10 to A
     *      J to B
     *      Q to C
     *      K to D
     *      A to E
     */
    private static int beforeOrAfter2(String wordA, String wordB) {
        //System.out.print("word "+wordA+" "+wordB+" "); // debug
        char charA = wordA.charAt(wordA.length()-1);
        char charB = wordB.charAt(wordB.length()-1);
        //System.out.println(wordA+" "+wordB+" End "+charA+" "+charB+" "); // debug
        if (charA<charB) {
            return -1;
        } else if (charA>charB) {
            return 1;
        } else {
            // equal
            charA = wordA.charAt(wordA.length()-2);
            charB = wordB.charAt(wordB.length()-2);
            // mapping charA to correct order
            if (charA=='0') {
                charA='A';
            } else if (charA=='J') {
                charA='B';
            } else if (charA=='Q') {
                charA='C';
            } else if (charA=='K') {
                charA='D';
            } else if (charA=='A') {
                charA='E';
            }
            // mapping charB to correct order
            if (charB=='0') {
                charB='A';
            } else if (charB=='J') {
                charB='B';
            } else if (charB=='Q') {
                charB='C';
            } else if (charB=='K') {
                charB='D';
            } else if (charB=='A') {
                charB='E';
            }
            
            //System.out.println(" First "+charA+" "+charB); // debug
            if (charA<charB) {
                return -1;
            } else if (charA>charB) {
                return 1;
            }
        }
        
        return 0;
    }

    public static ArrayList<String> sortCardsWithTrump(ArrayList<String> myCards, char trump) {
        ArrayList<String> myNewCards = new ArrayList<>();
        myNewCards.add(myCards.get(0));
        for (int i=1;i<myCards.size();i++) {
            // loop for unordered myCards
            String card2Sort = myCards.get(i);
            for (int j=0;j<myNewCards.size();j++) {
                // loop for ordered myNewCards
                // find until card2Sort equal or bigger then existing list
                String cardIterate = myNewCards.get(j);
                //int posCard = beforeOrAfter(card2Sort, cardIterate, 0, iterMax);
                int posCard = beforeOrAfter2Trump(card2Sort, cardIterate, trump);
                if (posCard<=0) {
                    myNewCards.add(j, card2Sort);
                    break;
                } else {
                    //System.out.println(j); // debug
                    if (j+1==myNewCards.size()) {
                        // end of list
                        myNewCards.add(card2Sort);
                        break;
                    }
                }
            }

        }
        return myNewCards;
    }
    
    /* -1 wordA before wordB
     * 0 wordA equal wordB
     * 1 wordA after wordB
     * NO TRUMP CDHS
     * TRUMP Map to Z for trump
     * suite order less C D H S higher
     * value suit  less 0 1 2 3 4 5 6 7 8 9 A J K Q
     * map 10 to A
     *      J to B
     *      Q to C
     *      K to D
     *      A to E
     */
    private static int beforeOrAfter2Trump(String wordA, String wordB, char trump) {
        //System.out.print("word "+wordA+" "+wordB+" "); // debug
        char charA = wordA.charAt(wordA.length()-1);
        char charB = wordB.charAt(wordB.length()-1);
        //System.out.println(wordA+" "+wordB+" End "+charA+" "+charB+" "); // debug
        // remap char for TRUMP
        // mapping charA to correct order
        if (charA==trump) {
            charA='Z';
        }
        // mapping charB to correct order
        if (charB==trump) {
            charB='Z';
        }
        if (charA<charB) {
            return -1;
        } else if (charA>charB) {
            return 1;
        } else {
            // equal
            charA = wordA.charAt(wordA.length()-2);
            charB = wordB.charAt(wordB.length()-2);
            // mapping charA to correct order
            if (charA=='0') {
                charA='A';
            } else if (charA=='J') {
                charA='B';
            } else if (charA=='Q') {
                charA='C';
            } else if (charA=='K') {
                charA='D';
            } else if (charA=='A') {
                charA='E';
            }
            // mapping charB to correct order
            if (charB=='0') {
                charB='A';
            } else if (charB=='J') {
                charB='B';
            } else if (charB=='Q') {
                charB='C';
            } else if (charB=='K') {
                charB='D';
            } else if (charB=='A') {
                charB='E';
            }
           
            //System.out.println(" First "+charA+" "+charB); // debug
            if (charA<charB) {
                return -1;
            } else if (charA>charB) {
                return 1;
            }
        }
        return 0;
    }

}


 

Friday, July 5, 2024

java 17: sort 2 strings from end to begin of word

This code will sort string array and return a new arraylist with order word (ascending), but ordered done from end of each word. This code work like sorting file name in file manager.

Source code:

public class WordC {
    // sort from end to begin

    public static void main(String[] args) {
                String[] sTest = {"4H", "5H", "8C", "8D", "9H", "9D", "AC", "6S", "5D", "6D", "KD", "10C", "AD" };
       
        for (int i=0;i<13;i++) {
            System.out.print(sTest[i]+" ");
        }
        System.out.println();
        System.out.println("Sorting");
        ArrayList<String> tmp = sortEnd2Begin(sTest);
        tmp.forEach((String myCard) ->{
            System.out.print(myCard+" ");
        });
        System.out.println();
    }
       
    private static ArrayList<String> sortEnd2Begin(String[] myCards) {
        ArrayList<String> myNewCards = new ArrayList<>();
        myNewCards.add(myCards[0]);
        for (int i=1;i<myCards.length;i++) {
            // loop for unordered myCards
            String card2Sort = myCards[i];
            for (int j=0;j<myNewCards.size();j++) {
                // loop for ordered myNewCards
                // find until card2Sort equal or bigger then existing list
                String cardIterate = myNewCards.get(j);
                int iterMax = card2Sort.length();
                if (card2Sort.length() > cardIterate.length()) {
                    iterMax = cardIterate.length();
                }
                int posCard = beforeOrAfter(card2Sort, cardIterate, 0, iterMax);
                if (posCard==0 || posCard<0) {
                    myNewCards.add(j, card2Sort);
                    break;
                } else {
                    // TODO
                    //System.out.println(j); // debug
                    if (j+1==myNewCards.size()) {
                        // end of list
                        myNewCards.add(card2Sort);
                        break;
                    }
                }
            }

        }
        return myNewCards;
    }
       
    // -1 wordA before wordB
    // 0 wordA equal wordB
    // 1 wordA after wordB
    private static int beforeOrAfter(String wordA, String wordB, int iterX, int iterMax) {
        //System.out.println(wordA+" "+wordB+" "+iterX+" "+iterMax);
        int inA = wordA.length()-1-iterX;
        int inB = wordB.length()-1-iterX;
        char cA = wordA.charAt(inA);
        char cB = wordB.charAt(inB);
        int retValue = 0;
        if (iterX+1==iterMax) {
            // we reach max recursive {
            //System.out.println(iterX+" "+iterMax+" "+cA+" "+cB); // debug
            if (cA==cB) {
                //System.out.println("Debug"); // debug
                if (wordA.length()<wordB.length())  {
                    retValue = -1;
                } else if (wordA.length()>wordB.length())  {
                    retValue = 1;
                } else {
                    retValue = 0; // equal letters and length
                }
            } else if (cA<cB) {
                //retValue = -1;  // ori
            } else if (cA>cB) {
                retValue = 1; // ori
            }
        } else {
            if (cA<cB) {
                //System.out.println(cA+" < "+cB+" "+(cA < cB)); // debug
                retValue = -1; // ori
            } else if (cA>cB) {
                //System.out.println(cA+" > "+cB+" "+(cA > cB)); // debug
                retValue = 1; // ori

            } else {
                //System.out.println(cA+" = "+cB+" "+(cA == cB)); // debug
                retValue = beforeOrAfter(wordA, wordB, iterX+1, iterMax);
            }
        }
        return retValue;
    }

}