Previously, while traveling abroad, a story was made when a local person holding a kitten spoke in English.
Foreigner "How to say" kitchen "in Japanese?" Myself "(?? Why do you suddenly hear such a thing ...) DAIDOKORO" Foreigner "?? ...? What?" Myself "DAIDOKORO!" Foreigner "... Oh, DAIDOKORO! OK! DAIDOKORO!"
At a later date
I said, "There was something like this. I wonder why I heard that." Friend "That's what you said kitten, not kitchen? You had a kitten, right? " I said, "Oh, kitten! That's a kitten! I made a mistake because the pronunciation is similar to kitchen! hahaha "
My friend "..."
I "Let's study English ..."
Display two words with similar pronunciation on the screen, Play either audio file at random. Select the word that the user determines to have been pronounced, Display the correct or incorrect answer on the screen.
Also, various word pairs with similar phonetic symbols Collect by phonetic symbol and distinguish which phonetic symbol Challenge or allow the user to choose.
For example, the difference between'r'and'l' that many people including me are worried about Suppose you want to learn.
When you start the game, for example, either light or right audio Randomly played, select the one you think was played.
Then, the correct answer or the incorrect answer is displayed.
By the way, as shown below, the words light and right are the first They are exactly the same except that the phonetic symbols are l and r.
word | Phonetic symbols |
---|---|
light | lάɪt |
right | rάɪt |
Also, download the audio file of English words used in this tool from weblio. However, it is very troublesome to download many English word files one by one. It takes.
Therefore, I made a tool to automatically download English words by web scraping. ↓ https://qiita.com/Fuminori_Souma/private/60ce627e66209763d4f2
With this tool, you can easily download the audio file you want. However, the audio file of the word described in the json file of this tool is published on Google drive (described later).
The screen immediately after execution looks like this.
Today, I will try to distinguish between's'and'th', which Japanese people are not good at.
When you press the "Start Game" button, the screen changes to the game screen. Is there a total of 14 questions?
When I pressed the "Play Audio" button, the audio file was played and I had two options. I wonder which one was pronounced. .. Press the "Play Again" button and listen again. Okay, the tense on the left! Click on the "tense" text to answer.
Excellent answer! You did it. Click "tense" and "tenth" to play and each Let's check the difference in voice. When you're done, press the "Start Next Problem" button.
This time "mouse" and "mouth"? Okay, mouth!
... isn't it? damn it!
... it's all over. 7 out of 14 correct answers? Well, it's ok (sweat) Press the "Return to title" button.
Next, let's try to distinguish between'b'and'v'.
I use it like this.
English_study.py
import sys
import tkinter
from tkinter import messagebox
from mutagen.mp3 import MP3 as mp3
from tkinter import *
import pygame
import time
import json
import random
from PIL import Image, ImageTk
def ques_start_next(event): #Start the problem/Play audio again/Start the next problem
if bttn_repnxt['text'] == 'Play audio':
global word1
global word2
global rep_word #Words actually pronounced
global id
text_res["text"] = '' #Reset the answer to the previous question
group = ps
words = random.choice(list(wordlist['Wordlist'][group]))
id = 'id' + str(quorder[qunum - renum])
word1 = (wordlist['Wordlist'][group][id]['word1'])
word2 = (wordlist['Wordlist'][group][id]['word2'])
rep_word = wordlist['Wordlist'][group][id][random.choice(list(wordlist['Wordlist'][group][words]))]
rep_mp3(rep_word) #Play audio file
#Change object state
text_w1["text"] = word1
text_w2["text"] = word2
text_ques1["text"] = 'It was pronounced ...'
text_ques2["text"] = 'Which one?'
bttn_repnxt['text'] = 'Play again'
text_adc.place_forget()
elif bttn_repnxt['text'] == 'Play again':
rep_mp3(rep_word) #Play audio file
else: # 'Start the next problem'
#Change object state
bttn_repnxt['text'] = 'Play audio'
text_res.place_forget()
#Start the next problem (play audio file)
ques_start_next(event)
def rep_mp3(tgt_word): #Play audio
filename = 'C:/Users/fumin/OneDrive/desktop/English_words/' + tgt_word + '.mp3' #The mp3 file you want to play
pygame.mixer.init()
pygame.mixer.music.load(filename) #Load the sound source
mp3_length = mp3(filename).info.length #Get the length of the sound source
pygame.mixer.music.play(1) #Playback starts. Play n times if part 1 is changed(In that case, also xn the number of seconds on the next line.)
time.sleep(mp3_length + 0.25) #After starting playback, wait for the length of the sound source(0.25 Waiting for error elimination)
pygame.mixer.music.stop() #Playback stops after waiting for the length of the sound source
def enlarge_word(event): #Larger word with mouse pointer
if str(event.widget["text"]) == word1:
text_w1["font"] = ("", 12) #Larger characters
text_w1["cursor"] = "hand2" #Change mouse pointer to index finger type
else:
text_w2["font"] = ("", 12) #Larger characters
text_w2["cursor"] = "hand2" #Change mouse pointer to index finger type
def undo_word(event): #Restores a word that is out of the mouse pointer to its original size
if str(event.widget["text"]) == word1:
text_w1["font"] = ("", 10) #Display characters in initial size
else:
text_w2["font"] = ("", 10) #Display characters in initial size
def choose_word(event): #Determine if the word selected by the user is correct
global oknum
global renum
if bttn_repnxt['text'] == 'Play again':
#Display correct answers and notes
text_res.place(x=175, y=130)
text_adc.place(x=130, y=160)
if str(event.widget["text"]) == word1: #If you select the word on the left
if rep_word == word1:
text_res["text"] = 'Correct answer!!'
else:
text_res["text"] = 'Incorrect answer…'
else: #If you select the word on the right
if rep_word == word2:
text_res["text"] = 'Correct answer!!'
else:
text_res["text"] = 'Incorrect answer…'
if text_res["text"] == 'Correct answer!!':
oknum = oknum + 1 #Add the number of correct answers
text_res["foreground"] = 'blue'
else:
text_res["foreground"] = 'red'
renum -= 1 #Subtract the number of remaining questions
#Change object state
text_scr['text'] = 'Score:' + str(oknum) + '/' + str(qunum)
text_rest['text'] = 'remaining:' + str(renum)
text_ques1["text"] = ''
text_ques2["text"] = ''
bttn_repnxt["text"] = 'Start the next problem'
if renum == 0: #When all problems are over
bttn_repnxt.place_forget()
text_end.place(x=110, y=320)
elif bttn_repnxt['text'] == 'Start the next problem': #Play the audio of the following problem
if str(event.widget["text"]) == word1:
rep_mp3(wordlist['Wordlist'][ps][id]['word1'])
else:
rep_mp3(wordlist['Wordlist'][ps][id]['word2'])
def create_radioboutton(row, column, pdx, num, value): #Generate a radio button on the title screen
rdbtn[num] = tkinter.Radiobutton(frame, value=value, command=rb_clicked, variable=var, text=u'')
rdbtn[num].grid(row=row, column=column, padx=0, ipadx=pdx, pady=yinvl)
def create_picture(row='df', column='df', pdx='df', num='df'): #Phonetic symbols on the title screen(image)Generate a
if row == 'df' and column == 'df'and pdx == 'df'and num == 'df': #For title screen
cv[rbnum] = Canvas(width=70, height=20)
cv[rbnum].create_image(1, 1, image=pngfile[rbnum], anchor=NW)
cv[rbnum].place(x=195, y=25)
else: #In the case of the game start screen
cv[num] = Canvas(frame, width=70, height=20)
cv[num].create_image(1, 1, image=pngfile[num], anchor=NW)
cv[num].grid(row=row, column=column, ipadx=pdx, pady=yinvl)
def rb_clicked(): #Select phonetic symbols to study
global rbnum
global ps
rbnum = int(var.get()) #Selected radio button(=Phonetic symbols)Store the number of
ps = list(wordlist['Wordlist'])[rbnum] #Select the selected phonetic symbol
def switch_mode(event): #Start the game/Return to title screen
global qunum #Number of total problems
global oknum #Number of correct questions
global renum #Number of remaining issues
global quorder #Order of question questions
if bttn_swmode['text'] == 'game start':
#Hide the object that was on the first screen
frame.place_forget()
text_title.place_forget()
text_ques3.place_forget()
#Show objects for games
bttn_repnxt.place(x=155, y=70)
text_scr.place(x=200, y=250)
text_rest.place(x=130, y=250)
text_w1.place(x=128, y=190)
text_w2.place(x=228, y=190)
text_ps.place(x=135, y=28)
text_ques1.place(x=160, y=130)
text_ques2.place(x=175, y=160)
create_picture()
#various settings
oknum = 0
qunum = len(wordlist['Wordlist'][ps])
renum = qunum
text_scr['text'] = 'Score:' + str(oknum) + '/' + str(qunum)
text_rest['text'] = 'remaining:' + str(renum)
quorder = random.sample(range(1, qunum + 1), k=qunum)
bttn_swmode['text'] = 'Return to title'
text_w1["text"] = ''
text_w2["text"] = ''
text_ques1["text"] = ''
text_ques2["text"] = ''
bttn_repnxt['text'] = 'Play audio'
else: #Return to title screen
if renum == 0 or (renum != 0 and messagebox.askyesno('Verification', 'There are still problems. Do you want to return to the title screen?')):
# if messagebox.askyesno('Verification', 'There are still problems. Do you want to return to the title screen?'):
#Hide the objects that were on the game screen
bttn_repnxt.place_forget()
text_scr.place_forget()
text_rest.place_forget()
text_w1.place_forget()
text_w2.place_forget()
text_ps.place_forget()
text_ques1.place_forget()
text_ques2.place_forget()
text_end.place_forget()
text_res.place_forget()
text_adc.place_forget()
cv[rbnum].place_forget()
#Display the object for the title screen
frame.place(x=90, y=90)
text_title.place(x=110, y=30)
text_ques3.place(x=90, y=65)
bttn_swmode['text'] = 'game start'
#Screen display
root = tkinter.Tk()
root.title(u"Pronunciation")
root.geometry("400x420")
root.columnconfigure(0, weight=1)
root.rowconfigure(0, weight=1)
# Frame
frame = tkinter.Frame(root)
frame.place(x=90, y=90)
frame.columnconfigure(0, weight=1)
frame.rowconfigure(0, weight=1)
#Label settings
text_w1 = tkinter.Label(text=u'', font=("", 10))
text_w1.bind("<Enter>", enlarge_word)
text_w1.bind("<Leave>", undo_word)
text_w1.bind("<Button-1>", choose_word)
text_w2 = tkinter.Label(text=u'', font=("", 10))
text_w2.bind("<Enter>", enlarge_word)
text_w2.bind("<Leave>", undo_word)
text_w2.bind("<Button-1>", choose_word)
text_ques1 = tkinter.Label(text=u'')
text_ques2 = tkinter.Label(text=u'')
text_ques3 = tkinter.Label(text=u'Select a phonetic symbol and start the game.')
text_ques3.place(x=90, y=65)
text_ps = tkinter.Label(text=u'Phonetic symbols:')
text_adc = tkinter.Label(text=u'* Click each word to play voice')
text_res = tkinter.Label(text=u'')
text_scr = tkinter.Label(text=u'')
text_rest = tkinter.Label(text=u'')
text_title = tkinter.Label(text=u'Pronunciation(Temporary)', font=(u'MS Mincho', 20))
text_title.place(x=110, y=30)
text_end = tkinter.Label(text=u'The game with this phonetic symbol is over.')
text_end["foreground"] = 'green'
#Push button settings
bttn_repnxt = tkinter.Button(text=u'Play audio', width=11)
bttn_repnxt.bind("<Button-1>", ques_start_next) # (Button-2 for wheel click, 3 for right click)
bttn_swmode = tkinter.Button(text=u'game start', width=10)
bttn_swmode.bind("<Button-1>", switch_mode) # (Button-2 for wheel click, 3 for right click)
bttn_swmode.place(x=157, y=380)
#Setting parameters used for radio button placement
xinvl = 30
yinvl = 0
var = StringVar()
var.set('0') #Set the radio button to "Unchecked"
f = open("C:/Users/fumin/OneDrive/desktop/Wordlist.json", 'r')
wordlist = json.load(f)
oknum = 0
rb_clicked() #Radio button selected in the initial state
#Initialization of variables that store image information and radio button information
pngfile = [''] * len(wordlist['Wordlist'])
cv = [''] * len(wordlist['Wordlist'])
rdbtn = [''] * len(wordlist['Wordlist'])
#Radio buttons/Phonetic symbol settings
for i in range(int(len(wordlist['Wordlist'])/2)):
ipadx = 10
pngfile[i*2] = PhotoImage(file="C:/Users/fumin/OneDrive/image/" + list(wordlist['Wordlist'])[i * 2] + ".PNG")
pngfile[i*2+1] = PhotoImage(file="C:/Users/fumin/OneDrive/image/" + list(wordlist['Wordlist'])[i * 2 + 1] + ".PNG")
create_radioboutton(i+1, 1, 0, i*2, i*2)
create_picture(i+1, 2, ipadx, i*2)
create_radioboutton(i+1, 3, 0, i*2+1, i*2+1)
create_picture(i+1, 4, ipadx, i*2+1)
root.mainloop()
Wordlist.json
{
"Wordlist": {
"b_v" : {
"id1" : {
"word1": "boat",
"word2": "vote"
},
"id2" : {
"word1": "bury",
"word2": "vary"
},
"id3" : {
"word1": "base",
"word2": "vase"
},
"id4" : {
"word1": "bent",
"word2": "vent"
},
"id5" : {
"word1": "ban",
"word2": "van"
},
"id6" : {
"word1": "best",
"word2": "vest"
},
"id7" : {
"word1": "bat",
"word2": "vat"
}
},
"l_r" : {
"id1" : {
"word1": "light",
"word2": "right"
},
"id2" : {
"word1": "lice",
"word2": "rice"
},
"id3" : {
"word1": "long",
"word2": "wrong"
},
"id4" : {
"word1": "lock",
"word2": "rock"
},
"id5" : {
"word1": "lane",
"word2": "rain"
},
"id6" : {
"word1": "lend",
"word2": "rend"
},
"id7" : {
"word1": "lead",
"word2": "read"
},
"id8" : {
"word1": "loom",
"word2": "room"
},
"id9" : {
"word1": "lace",
"word2": "race"
},
"id10" : {
"word1": "lack",
"word2": "rack"
},
"id11" : {
"word1": "lake",
"word2": "rake"
},
"id12" : {
"word1": "lamp",
"word2": "ramp"
},
"id13" : {
"word1": "lank",
"word2": "rank"
},
"id14" : {
"word1": "late",
"word2": "rate"
},
"id15" : {
"word1": "law",
"word2": "raw"
},
"id16" : {
"word1": "clown",
"word2": "crown"
},
"id17" : {
"word1": "folk",
"word2": "fork"
},
"id18" : {
"word1": "glamour",
"word2": "grammar"
},
"id19" : {
"word1": "flee",
"word2": "free"
},
"id20" : {
"word1": "allow",
"word2": "arrow"
},
"id21" : {
"word1": "belly",
"word2": "berry"
},
"id22" : {
"word1": "blanch",
"word2": "branch"
},
"id23" : {
"word1": "bland",
"word2": "brand"
},
"id24" : {
"word1": "bravely",
"word2": "bravery"
},
"id25" : {
"word1": "bleach",
"word2": "breach"
},
"id26" : {
"word1": "bleed",
"word2": "breed"
},
"id27" : {
"word1": "blink",
"word2": "brink"
},
"id28" : {
"word1": "bully",
"word2": "burly"
},
"id29" : {
"word1": "collect",
"word2": "correct"
},
"id30" : {
"word1": "flesh",
"word2": "fresh"
}
},
"crt_ash" : {
"id1" : {
"word1": "bug",
"word2": "bag"
},
"id2" : {
"word1": "fun",
"word2": "fam"
},
"id3" : {
"word1": "tusk",
"word2": "task"
},
"id4" : {
"word1": "much",
"word2": "match"
},
"id5" : {
"word1": "buck",
"word2": "back"
},
"id6" : {
"word1": "crush",
"word2": "crash"
},
"id7" : {
"word1": "suck",
"word2": "sack"
},
"id8" : {
"word1": "stuff",
"word2": "staff"
},
"id9" : {
"word1": "mud",
"word2": "mad"
},
"id10" : {
"word1": "musk",
"word2": "mask"
},
"id11" : {
"word1": "lump",
"word2": "lamp"
},
"id12" : {
"word1": "bung",
"word2": "bang"
},
"id13" : {
"word1": "hut",
"word2": "hat"
},
"id14" : {
"word1": "rump",
"word2": "ramp"
},
"id15" : {
"word1": "uncle",
"word2": "ankle"
},
"id16" : {
"word1": "muster",
"word2": "master"
},
"id17" : {
"word1": "bund",
"word2": "band"
},
"id18" : {
"word1": "puppy",
"word2": "pappy"
},
"id19" : {
"word1": "double",
"word2": "dabble"
},
"id20" : {
"word1": "hunk",
"word2": "hank"
},
"id21" : {
"word1": "stunned",
"word2": "stand"
}
},
"ash_alfa" : {
"id1" : {
"word1": "pappy",
"word2": "poppy"
},
"id2" : {
"word1": "adapt",
"word2": "adopt"
},
"id3" : {
"word1": "bag",
"word2": "bog"
},
"id4" : {
"word1": "back",
"word2": "bock"
},
"id5" : {
"word1": "sack",
"word2": "sock"
},
"id6" : {
"word1": "mask",
"word2": "mosque"
},
"id7" : {
"word1": "hat",
"word2": "hot"
},
"id8" : {
"word1": "ramp",
"word2": "romp"
},
"id9" : {
"word1": "band",
"word2": "bond"
},
"id10" : {
"word1": "possible",
"word2": "passable"
},
"id11" : {
"word1": "sad",
"word2": "sod"
},
"id12" : {
"word1": "tap",
"word2": "top"
},
"id13" : {
"word1": "nat",
"word2": "not"
},
"id14" : {
"word1": "hank",
"word2": "honk"
},
"id15" : {
"word1": "bax",
"word2": "box"
},
"id16" : {
"word1": "valley",
"word2": "volley"
},
"id17" : {
"word1": "sax",
"word2": "sox"
}
},
"alfa_crt" : {
"id1" : {
"word1": "body",
"word2": "buddy"
},
"id2" : {
"word1": "wander",
"word2": "wonder"
},
"id3" : {
"word1": "soccer",
"word2": "sucker"
},
"id4" : {
"word1": "poppy",
"word2": "puppy"
},
"id5" : {
"word1": "bond",
"word2": "bund"
},
"id6" : {
"word1": "romp",
"word2": "rump"
},
"id7" : {
"word1": "hot",
"word2": "hut"
},
"id8" : {
"word1": "mosque",
"word2": "musk"
},
"id9" : {
"word1": "sock",
"word2": "suck"
},
"id10" : {
"word1": "bock",
"word2": "buck"
},
"id11" : {
"word1": "bog",
"word2": "bug"
},
"id12" : {
"word1": "collar",
"word2": "color"
},
"id13" : {
"word1": "rob",
"word2": "rub"
},
"id14" : {
"word1": "honk",
"word2": "hunk"
},
"id15" : {
"word1": "calm",
"word2": "come"
},
"id16" : {
"word1": "coddle",
"word2": "cuddle"
}
},
"s_th" : {
"id1" : {
"word1": "sink",
"word2": "think"
},
"id2" : {
"word1": "sick",
"word2": "thick"
},
"id3" : {
"word1": "sing",
"word2": "thing"
},
"id4" : {
"word1": "sought",
"word2": "thought"
},
"id5" : {
"word1": "sank",
"word2": "thank"
},
"id6" : {
"word1": "seam",
"word2": "theme"
},
"id7" : {
"word1": "sin",
"word2": "thin"
},
"id8" : {
"word1": "mouse",
"word2": "mouth"
},
"id9" : {
"word1": "tense",
"word2": "tenth"
},
"id10" : {
"word1": "force",
"word2": "forth"
},
"id11" : {
"word1": "worse",
"word2": "worth"
},
"id12" : {
"word1": "face",
"word2": "faith"
},
"id13" : {
"word1": "boss",
"word2": "both"
},
"id14" : {
"word1": "mass",
"word2": "math"
}
},
"oo-lvc_ou" : {
"id1" : {
"word1": "called",
"word2": "cold"
},
"id2" : {
"word1": "raw",
"word2": "row"
},
"id3" : {
"word1": "law",
"word2": "low"
},
"id4" : {
"word1": "call",
"word2": "coal"
},
"id5" : {
"word1": "hall",
"word2": "hole"
},
"id6" : {
"word1": "tall",
"word2": "toll"
},
"id7" : {
"word1": "bawl",
"word2": "bowl"
},
"id8" : {
"word1": "tall",
"word2": "tole"
},
"id9" : {
"word1": "lawn",
"word2": "loan"
},
"id10" : {
"word1": "pawl",
"word2": "pole"
},
"id11" : {
"word1": "ball",
"word2": "bole"
},
"id12" : {
"word1": "caught",
"word2": "coat"
}
},
"alfa-hschwa_hschwa-lvc" : {
"id1" : {
"word1": "heart",
"word2": "hurt"
},
"id2" : {
"word1": "hard",
"word2": "heard"
},
"id3" : {
"word1": "carve",
"word2": "curve"
},
"id4" : {
"word1": "lark",
"word2": "lurk"
},
"id5" : {
"word1": "bard",
"word2": "bird"
},
"id6" : {
"word1": "far",
"word2": "fur"
},
"id7" : {
"word1": "park",
"word2": "perk"
}
},
"ash_e" : {
"id1" : {
"word1": "adapt",
"word2": "adept"
},
"id2" : {
"word1": "parish",
"word2": "perish"
},
"id3" : {
"word1": "marry",
"word2": "merry"
},
"id4" : {
"word1": "back",
"word2": "beck"
},
"id5" : {
"word1": "band",
"word2": "bend"
},
"id6" : {
"word1": "nat",
"word2": "net"
},
"id7" : {
"word1": "bag",
"word2": "beg"
},
"id8" : {
"word1": "hat",
"word2": "het"
}
},
"ou_oo-hschwa" : {
"id1" : {
"word1": "motor",
"word2": "mortar"
},
"id2" : {
"word1": "load",
"word2": "lord"
},
"id3" : {
"word1": "bode",
"word2": "board"
},
"id4" : {
"word1": "coat",
"word2": "court"
},
"id5" : {
"word1": "boa",
"word2": "bore"
},
"id6" : {
"word1": "hose",
"word2": "hoarse"
},
"id7" : {
"word1": "woe",
"word2": "war"
}
},
"oo-lvc_schwa-u" : {
"id1" : {
"word1": "walk",
"word2": "woke"
},
"id2" : {
"word1": "bought",
"word2": "boat"
},
"id3" : {
"word1": "cost",
"word2": "coast"
},
"id4" : {
"word1": "flaw",
"word2": "flow"
},
"id5" : {
"word1": "hall",
"word2": "whole"
},
"id6" : {
"word1": "nought",
"word2": "note"
}
},
"hschwa_lvc" : {
"id1" : {
"word1": "fort",
"word2": "fought"
},
"id2" : {
"word1": "sort",
"word2": "sought"
},
"id3" : {
"word1": "source",
"word2": "sauce"
},
"id4" : {
"word1": "lorn",
"word2": "lawn"
},
"id5" : {
"word1": "there",
"word2": "their"
},
"id6" : {
"word1": "court",
"word2": "caught"
}
},
"alfau_oo" : {
"id1" : {
"word1": "brown",
"word2": "brawn"
},
"id2" : {
"word1": "drown",
"word2": "drawn"
},
"id3" : {
"word1": "down",
"word2": "dawn"
},
"id4" : {
"word1": "sow",
"word2": "saw"
},
"id5" : {
"word1": "sough",
"word2": "saw"
},
"id6" : {
"word1": "tout",
"word2": "taught"
}
},
"alfa_e" : {
"id1" : {
"word1": "not",
"word2": "net"
},
"id2" : {
"word1": "adopt",
"word2": "adept"
},
"id3" : {
"word1": "bog",
"word2": "beg"
},
"id4" : {
"word1": "hot",
"word2": "het"
},
"id5" : {
"word1": "bock",
"word2": "beck"
},
"id6" : {
"word1": "bond",
"word2": "bend"
}
},
"s_esh" : {
"id1" : {
"word1": "seat",
"word2": "sheet"
},
"id2" : {
"word1": "see",
"word2": "she"
},
"id3" : {
"word1": "seep",
"word2": "sheep"
},
"id4" : {
"word1": "seer",
"word2": "sheer"
},
"id5" : {
"word1": "sip",
"word2": "ship"
}
},
"z_eth" : {
"id1" : {
"word1": "wiz",
"word2": "with"
},
"id2" : {
"word1": "zen",
"word2": "then"
},
"id3" : {
"word1": "breeze",
"word2": "breathe"
},
"id4" : {
"word1": "tease",
"word2": "teethe"
},
"id5" : {
"word1": "closing",
"word2": "clothing"
}
},
"alfa_a" : {
"id1" : {
"word1": "drier",
"word2": "dryer"
},
"id2" : {
"word1": "find",
"word2": "fined"
},
"id3" : {
"word1": "guise",
"word2": "guys"
},
"id4" : {
"word1": "lime",
"word2": "lyme"
}
},
"e_i" : {
"id1" : {
"word1": "wary",
"word2": "weary"
},
"id2" : {
"word1": "emigrant",
"word2": "immigrant"
},
"id3" : {
"word1": "desert",
"word2": "dessert"
},
"id4" : {
"word1": "tear",
"word2": "tier"
}
},
"schwa-u_oo-hschwa" : {
"id1" : {
"word1": "woe",
"word2": "war"
},
"id2" : {
"word1": "foam",
"word2": "form"
},
"id3" : {
"word1": "foe",
"word2": "four"
}
},
"alfa_o" : {
"id1" : {
"word1": "dow",
"word2": "dough"
},
"id2" : {
"word1": "wow",
"word2": "woe"
},
"id3" : {
"word1": "allow",
"word2": "alow"
}
},
"alfa_oo" : {
"id1" : {
"word1": "noun",
"word2": "known"
},
"id2" : {
"word1": "farm",
"word2": "form"
},
"id3" : {
"word1": "what",
"word2": "wat"
}
},
"oo-hschwa_hschwa-lvc" : {
"id1" : {
"word1": "warm",
"word2": "worm"
},
"id2" : {
"word1": "ward",
"word2": "word"
},
"id3" : {
"word1": "torn",
"word2": "turn"
}
},
"other" : {
"id1" : {
"word1": "with",
"word2": "width"
},
"id2" : {
"word1": "breathe",
"word2": "breadth"
},
"id3" : {
"word1": "father",
"word2": "further"
},
"id4" : {
"word1": "borrow",
"word2": "borough"
},
"id5" : {
"word1": "hole",
"word2": "whole"
},
"id6" : {
"word1": "toe",
"word2": "tow"
},
"id7" : {
"word1": "bill",
"word2": "beer"
},
"id8" : {
"word1": "all",
"word2": "oar"
},
"id9" : {
"word1": "shock",
"word2": "shook"
},
"id10" : {
"word1": "crock",
"word2": "crook"
},
"id11" : {
"word1": "aren't",
"word2": "ant"
},
"id12" : {
"word1": "parse",
"word2": "pass"
},
"id13" : {
"word1": "some",
"word2": "sum"
},
"id14" : {
"word1": "discus",
"word2": "discuss"
},
"id15" : {
"word1": "gall",
"word2": "girl"
},
"id16" : {
"word1": "walk",
"word2": "work"
}
}
}
}
Stored below. https://drive.google.com/open?id=1u4l5wo-6SC00Ys0xBZO_am1v2yPjb_NU
Actually, I think that management is efficient on Github without doing this. .. Since I am studying, I temporarily stored it in Google drive.
Download the file stored in the above drive locally, and change the directory described in .py as shown below according to the local location. (It's troublesome)
Place to put | Source changes |
---|---|
Audio file (mp3) | Directory on the right side of the variable "filename" |
json file | Directory on the right side of variable "f" |
Image file (png) | Directory on the right side of the variable "pngfile" |
As mentioned above, the json file is a collection of word pairs for each phonetic symbol. Since the phonetic symbols cannot be handled even if they are written as they are, they were written in English as shown below.
Phonetic symbols | name | How to write in json above |
---|---|---|
æ | Ash | ash |
ʃ | Esh | esh |
ə | Schwa | schwa |
ɚ | With hook(hooked)Schwa | hschwa |
ɔ | Open o | oo |
α | alpha | alfa |
ː | Long vowel colon | lvc |
ʌ | Caret, wedge, hat | crt |
ð | Eze | eth |
θ | Theta | th |
For example, in the case of a pair of "ɚ" and "ː", it is described as "hschwa_lvc".
By the way, a, r, v, etc. are described as they are.
Actually, I have created a similar application with C ++ / CLI which is an extension of C ++ for .NET, referring to the following book instead of python.
https://www.amazon.co.jp/%E3%82%A2%E3%83%97%E3%83%AA%E3%82%92%E4%BD%9C%E3%82%8D%E3%81%86-Visual-%E5%85%A5%E9%96%80-2015%E5%AF%BE%E5%BF%9C/dp/4822298760
However, I struggled in front of the difficult language that the specification of C ++ / CLR is complicated and lacks information, and although I managed to make something similar to this post, it became a difficult thing to handle because it lacked maintainability. I remade it with python and posted it in this article.
Special thanks to the following. I am very grateful to you for all the useful information.
Contents | Link destination |
---|---|
How to play audio files | https://qiita.com/kekeho/items/a0b93695d8a8ac6f1028 |
How to handle json | https://qiita.com/kikuchiTakuya/items/53990fca06fb9ba1d8a7 |
How to randomly access the dictionary type | https://teratail.com/questions/108589 |
Implementation of processing when the mouse pointer is placed on the widget | https://tutorialmore.com/questions-716474.htm |
Event sequence | http://www.rouge.gr.jp/~fuku/tips/python-tkinter/bind.shtml |
Change mouse icon | https://suzutaka-programming.com/tkinter-cursor/ https://anzeljg.github.io/rin2/book2/2405/docs/tkinter/cursors.html |
Displaying objects/Hide | https://www.delftstack.com/ja/howto/python-tkinter/how-to-hide-recover-and-delete-tkinter-widgets/ |
Radio button settings | https://pg-chain.com/python-radiobutton |
About grid | https://python.keicode.com/advanced/tkinter-grid.php |
About Text widget | https://www.shido.info/py/tkinter12.html |
Judgment of only letters | https://vatchlog.com/python-alnum/ |
Handling of global variables in functions | https://snowtree-injune.com/2018/07/29/post-734/ |
Name of each phonetic symbol | https://english-columns.weblio.jp/?p=1788 https://ja.wikipedia.org/wiki/%E5%9B%BD%E9%9A%9B%E9%9F%B3%E5%A3%B0%E8%A8%98%E5%8F%B7%E3%81%AE%E6%96%87%E5%AD%97%E4%B8%80%E8%A6%A7 https://eigonokai.jp/phonetics/7-%E6%AF%8D%E9%9F%B3%EF%BC%9A%CA%8C%E3%81%AE%E7%99%BA%E9%9F%B3/ |
We would be very grateful if you could give us feedback on GUI and source improvements! !!
Recommended Posts