Najbolja praksa za rad sa nizovima

Vidim da si resio, al svakako listam da procitam zanimljivosti.
A ako sam dobro shvatio izazov, zar nije moglo resenje da bude dvodimenzionalni array gde bi ovako nekako izgledao pseudo kod: (a,b,c,d,...(a_audioFile , b_audioFile) ,...)
gde bi array[x[y]] indeksirao slovo sa audio fajlom?
Svakako to ne bi bio veliki skup.

I onda samo uklapas po stringu.
Na pr u for lupu.
 
Ovako izgleda konačno rešenje, mada nisam koristio dictionary kao što sam ćaskao sa bmax-om.

Python:
from pydub import AudioSegment
from pydub import effects



# Silent space
space_silence = AudioSegment.silent(duration=200)
coma_silence = AudioSegment.silent(duration=500)
full_stop_silence = AudioSegment.silent(duration=800)



# MP3 audio files for letters

a_sound = AudioSegment.from_mp3(r"sounds\a.mp3")
b_sound = AudioSegment.from_mp3(r"sounds\b.mp3")
c_sound = AudioSegment.from_mp3(r"sounds\c.mp3")
d_sound = AudioSegment.from_mp3(r"sounds\d.mp3")
dj_sound = AudioSegment.from_mp3(r"sounds\dj.mp3")
dz_sound = AudioSegment.from_mp3(r"sounds\dž.mp3")
e_sound = AudioSegment.from_mp3(r"sounds\e.mp3")
f_sound = AudioSegment.from_mp3(r"sounds\f.mp3")
g_sound = AudioSegment.from_mp3(r"sounds\g.mp3")
h_sound = AudioSegment.from_mp3(r"sounds\h.mp3")
i_sound = AudioSegment.from_mp3(r"sounds\i.mp3")
j_sound = AudioSegment.from_mp3(r"sounds\j.mp3")
k_sound = AudioSegment.from_mp3(r"sounds\k.mp3")
l_sound = AudioSegment.from_mp3(r"sounds\l.mp3")
lj_sound = AudioSegment.from_mp3(r"sounds\lj.mp3")
m_sound = AudioSegment.from_mp3(r"sounds\m.mp3")
n_sound = AudioSegment.from_mp3(r"sounds\n.mp3")
nj_sound = AudioSegment.from_mp3(r"sounds\nj.mp3")
o_sound = AudioSegment.from_mp3(r"sounds\o.mp3")
p_sound = AudioSegment.from_mp3(r"sounds\p.mp3")
r_sound = AudioSegment.from_mp3(r"sounds\r.mp3")
s_sound = AudioSegment.from_mp3(r"sounds\s.mp3")
t_sound = AudioSegment.from_mp3(r"sounds\t.mp3")
u_sound = AudioSegment.from_mp3(r"sounds\u.mp3")
v_sound = AudioSegment.from_mp3(r"sounds\v.mp3")
z_sound = AudioSegment.from_mp3(r"sounds\z.mp3")
tj_sound = AudioSegment.from_mp3(r"sounds\ć.mp3")
ch_sound = AudioSegment.from_mp3(r"sounds\č.mp3")
sh_sound = AudioSegment.from_mp3(r"sounds\š.mp3")
zj_sound = AudioSegment.from_mp3(r"sounds\ž.mp3")


letter_sounds = [a_sound, b_sound, v_sound, g_sound, d_sound, dj_sound, e_sound, zj_sound, z_sound, i_sound, j_sound,
                 k_sound, l_sound, lj_sound, m_sound, n_sound, nj_sound, o_sound, p_sound, r_sound, s_sound,
                 t_sound, tj_sound, u_sound, f_sound, h_sound, c_sound, ch_sound, dz_sound, sh_sound]


def create_voice_audio(sample):
    letters = ['a', 'b', 'v', 'g', 'd', 'dj', 'e', 'ž', 'z', 'i', 'j', 'k', 'l', 'lj', 'm', 'n', 'nj', 'o', 'p', 'r',
               's', 't', 'ć', 'u', 'f', 'h', 'c', 'č', 'dž', 'š']
    # Starting empty audio file
    starting_audio = AudioSegment.empty()

    for letter in sample.lower():
        for i in range(len(letters)):
            if letter == letters[i]:
                starting_audio += letter_sounds[i]
            elif letter == ',':
                starting_audio += coma_silence
            elif letter == ' ':
                starting_audio += space_silence
            elif letter == '.':
                starting_audio += full_stop_silence
    starting_audio.export("finished/sample.mp3", format="mp3")


str = 'test'

create_voice_audio(str)
 
Ovako izgleda konačno rešenje, mada nisam koristio dictionary kao što sam ćaskao sa bmax-om.

Python:
from pydub import AudioSegment
from pydub import effects



# Silent space
space_silence = AudioSegment.silent(duration=200)
coma_silence = AudioSegment.silent(duration=500)
full_stop_silence = AudioSegment.silent(duration=800)



# MP3 audio files for letters

a_sound = AudioSegment.from_mp3(r"sounds\a.mp3")
b_sound = AudioSegment.from_mp3(r"sounds\b.mp3")
c_sound = AudioSegment.from_mp3(r"sounds\c.mp3")
d_sound = AudioSegment.from_mp3(r"sounds\d.mp3")
dj_sound = AudioSegment.from_mp3(r"sounds\dj.mp3")
dz_sound = AudioSegment.from_mp3(r"sounds\dž.mp3")
e_sound = AudioSegment.from_mp3(r"sounds\e.mp3")
f_sound = AudioSegment.from_mp3(r"sounds\f.mp3")
g_sound = AudioSegment.from_mp3(r"sounds\g.mp3")
h_sound = AudioSegment.from_mp3(r"sounds\h.mp3")
i_sound = AudioSegment.from_mp3(r"sounds\i.mp3")
j_sound = AudioSegment.from_mp3(r"sounds\j.mp3")
k_sound = AudioSegment.from_mp3(r"sounds\k.mp3")
l_sound = AudioSegment.from_mp3(r"sounds\l.mp3")
lj_sound = AudioSegment.from_mp3(r"sounds\lj.mp3")
m_sound = AudioSegment.from_mp3(r"sounds\m.mp3")
n_sound = AudioSegment.from_mp3(r"sounds\n.mp3")
nj_sound = AudioSegment.from_mp3(r"sounds\nj.mp3")
o_sound = AudioSegment.from_mp3(r"sounds\o.mp3")
p_sound = AudioSegment.from_mp3(r"sounds\p.mp3")
r_sound = AudioSegment.from_mp3(r"sounds\r.mp3")
s_sound = AudioSegment.from_mp3(r"sounds\s.mp3")
t_sound = AudioSegment.from_mp3(r"sounds\t.mp3")
u_sound = AudioSegment.from_mp3(r"sounds\u.mp3")
v_sound = AudioSegment.from_mp3(r"sounds\v.mp3")
z_sound = AudioSegment.from_mp3(r"sounds\z.mp3")
tj_sound = AudioSegment.from_mp3(r"sounds\ć.mp3")
ch_sound = AudioSegment.from_mp3(r"sounds\č.mp3")
sh_sound = AudioSegment.from_mp3(r"sounds\š.mp3")
zj_sound = AudioSegment.from_mp3(r"sounds\ž.mp3")


letter_sounds = [a_sound, b_sound, v_sound, g_sound, d_sound, dj_sound, e_sound, zj_sound, z_sound, i_sound, j_sound,
                 k_sound, l_sound, lj_sound, m_sound, n_sound, nj_sound, o_sound, p_sound, r_sound, s_sound,
                 t_sound, tj_sound, u_sound, f_sound, h_sound, c_sound, ch_sound, dz_sound, sh_sound]


def create_voice_audio(sample):
    letters = ['a', 'b', 'v', 'g', 'd', 'dj', 'e', 'ž', 'z', 'i', 'j', 'k', 'l', 'lj', 'm', 'n', 'nj', 'o', 'p', 'r',
               's', 't', 'ć', 'u', 'f', 'h', 'c', 'č', 'dž', 'š']
    # Starting empty audio file
    starting_audio = AudioSegment.empty()

    for letter in sample.lower():
        for i in range(len(letters)):
            if letter == letters[i]:
                starting_audio += letter_sounds[i]
            elif letter == ',':
                starting_audio += coma_silence
            elif letter == ' ':
                starting_audio += space_silence
            elif letter == '.':
                starting_audio += full_stop_silence
    starting_audio.export("finished/sample.mp3", format="mp3")


str = 'test'

create_voice_audio(str)
Taj letter_sounds array bih ja napravio u vidu niza objekata npr {"a": a_sound, "b": b_sound... itd}
Pa za sample samo preko for ili foreach petlje za svako slovo trazis vrednost key-a
 
Ok, shvatio sam kako da uradim na jedan pomalo čudan način. Napisaću listu svih slova azbuke, a zatim, kada pretražujem string, samo ću porediti i naći indeks gde se nalazi dato slovo. Pošto je svaki audio fajl takođe na istom indeksu u nekoj drugoj listi, onda ću se voditi tim indeksom i sve će biti sasvim okej.

U principu, nije ovo bilo tako teško skontati, nego me je mrzelo da razmišljam, pogledao 2 minuta i odustao. Hahahah. Sada sam pogledao 5 i jasno mi je. :mrgreen:
Ovo je naivan pristup problemu. Radiće ti bez problema za jednu rečenicu. Ako je to ono što ti je potrebno, onda je u redu. Ali zamisli da imaš tekst od 20 strana koji ima hiljadu rečenica. U tom slučaju ovaj tvoj koncept će se raspasti.

Zašto? Zato što se za svako slovo u hiljadu rečenica u najgorem slučaju vrši 26 poredjenja (za engleska slova). Sada pomnozi 26 puta 1000 rečenica pa puta u proseku recimo 50 slova u rečenici, i shvatićeš da je programu potrebno dosta vremena da izvrši toliki broj operacija.

Ako želiš da optimiziraš pretragu potraži na netu koncept divide and conquer, i binary search algoritam.
 
I dalje dosta neefikasnije nego hash tabela.
Moze se iskombinovati sa hash tabelom, posto je hash tabela struktura podataka, a binary search je algoritam. U ovom slučaju nije problem u strukturi podataka, vec u algoritmu. U samom kodu se prolazi kroz dve for petlje, sto znaci da je BigO notacija N2. Sa velikim nizom podataka, program ce se srusiti. Tu kao resenje upada binary search algoritam.
 
Moze se iskombinovati sa hash tabelom, posto je hash tabela struktura podataka, a binary search je algoritam. U ovom slučaju nije problem u strukturi podataka, vec u algoritmu. U samom kodu se prolazi kroz dve for petlje, sto znaci da je BigO notacija N2. Sa velikim nizom podataka, program ce se srusiti. Tu kao resenje upada binary search algoritam.
Pa binary search mora nad nekom strukturom podataka, stablom ili sortiranim nizom.0
Hash tabele podrazumeva niz sa hash funkcijom koja mapira kljuc u index u nizu tj O(1).
Binary search je potpuno drugi algoritam koji je O(log n).
Predlozio sam vec prirodno resenje sa dictionary, koje O(1) tj hash tabela.
 

Back
Top