diff --git a/voice/ca/ca_tts.js b/voice/ca/ca_tts.js index b5ac6c61a6..f86b63fcca 100644 --- a/voice/ca/ca_tts.js +++ b/voice/ca/ca_tts.js @@ -6,7 +6,11 @@ // (X) Other prompts: gps lost, off route, back to route // (X) Street name and prepositions (onto / on / to) and street destination (toward) support // (X) Distance unit support (meters / feet / yard) -// (N/A) Special grammar: (please specify which) +// (X) Special grammar: +// (X) Correct formation of numbers 21-29 +// (X) Gendered numbering ( 2 hours - dues hores / 2 km - dos km ) +// (X) Article for named exits +// (X) "and" between hours and minutes // (X) Support announcing highway exits var metricConst; @@ -18,97 +22,97 @@ var tts; function populateDictionary(tts) { // ROUTE CALCULATED dictionary["route_is"] = tts ? "La ruta té" : "route_is.ogg"; - dictionary["route_calculate"] = tts ? "Ruta recalculada" : "route_calculate.ogg"; + dictionary["route_calculate"] = tts ? "S'ha recalculat la ruta" : "route_calculate.ogg"; dictionary["distance"] = tts ? "distància" : "distance.ogg"; // LEFT/RIGHT - //dictionary["prepare"] = tts ? "Prepárate para" : "prepare.ogg"; + //dictionary["prepare"] = tts ? "Prepara't per a" : "prepare.ogg"; dictionary["after"] = tts ? "després de" : "after.ogg"; - dictionary["in"] = tts ? "en " : "in.ogg"; + dictionary["in"] = tts ? "d'aquí a " : "in.ogg"; - dictionary["left"] = tts ? "gira a l'esquerra" : "left.ogg"; - dictionary["left_sh"] = tts ? "fes un gir tancat a l'esquerra" : "left_sh.ogg"; - dictionary["left_sl"] = tts ? "gira lleument a l'esquerra" : "left_sl.ogg"; - dictionary["right"] = tts ? "gira a la dreta" : "right.ogg"; - dictionary["right_sh"] = tts ? "fes un gir tancat a la dreta" : "right_sh.ogg"; - dictionary["right_sl"] = tts ? "gira lleument a la dreta" : "right_sl.ogg"; + dictionary["left"] = tts ? "gireu a l'esquerra" : "left.ogg"; + dictionary["left_sh"] = tts ? "feu un gir tancat a l'esquerra" : "left_sh.ogg"; + dictionary["left_sl"] = tts ? "gireu lleugerament a l'esquerra" : "left_sl.ogg"; + dictionary["right"] = tts ? "gireu a la dreta" : "right.ogg"; + dictionary["right_sh"] = tts ? "feu un gir tancat a la dreta" : "right_sh.ogg"; + dictionary["right_sl"] = tts ? "gireu lleugerament a la dreta" : "right_sl.ogg"; // Note: "left_keep"/"right_keep" is a turn type aiding lane selection, while "left_bear"/"right_bear" is as brief "then..." preparation for the turn-after-next. In some languages l/r_keep may not differ from l/r_bear. - dictionary["left_keep"] = tts ? "estigues a l'esquerra" : "left_keep.ogg"; - dictionary["right_keep"] = tts ? "estigues a la dreta" : "right_keep.ogg"; - dictionary["left_bear"] = tts ? "estigues a l'esquerra" : "left_bear.ogg"; // in English the same as left_keep, may be different in other languages - dictionary["right_bear"] = tts ? "estigues a la dreta" : "right_bear.ogg"; // in English the same as right_keep, may be different in other languages + dictionary["left_keep"] = tts ? "manteniu-vos a l'esquerra" : "left_keep.ogg"; + dictionary["right_keep"] = tts ? "manteniu-vos a la dreta" : "right_keep.ogg"; + dictionary["left_bear"] = tts ? "continueu per l'esquerra" : "left_bear.ogg"; // in English the same as left_keep, may be different in other languages + dictionary["right_bear"] = tts ? "continueu per la dreta" : "right_bear.ogg"; // in English the same as right_keep, may be different in other languages // U-TURNS - dictionary["make_uturn"] = tts ? "Dóna la volta" : "make_uturn.ogg"; - dictionary["make_uturn_wp"] = tts ? "Quan puguis dóna la volta" : "make_uturn_wp.ogg"; + dictionary["make_uturn"] = tts ? "feu mitja volta" : "make_uturn.ogg"; + dictionary["make_uturn_wp"] = tts ? "quan pugueu, feu mitja volta" : "make_uturn_wp.ogg"; // ROUNDABOUTS - //dictionary["prepare_roundabout"] = tts ? "Prepárate para entrar en la rotonda después de" : "prepare_roundabout.ogg"; - dictionary["prepare_roundabout"] = tts ? "entra a la rotonda" : "prepare_roundabout.ogg"; - dictionary["roundabout"] = tts ? "entra a la rotonda" : "roundabout.ogg"; - dictionary["then"] = tts ? "llavors" : "then.ogg"; + dictionary["prepare_roundabout"] = tts ? "entreu a la rotonda" : "prepare_roundabout.ogg"; + dictionary["roundabout"] = tts ? "entreu a la rotonda" : "roundabout.ogg"; + dictionary["then"] = tts ? "i" : "then.ogg"; dictionary["and"] = tts ? "i" : "and.ogg"; - dictionary["take"] = tts ? "agafa la" : "take.ogg"; + dictionary["take"] = tts ? "agafeu" : "take.ogg"; dictionary["exit"] = tts ? "sortida" : "exit.ogg"; + dictionary["the_exit"] = tts ? "la sortida" : "the_exit.ogg"; - dictionary["1st"] = tts ? "primera" : "1st.ogg"; - dictionary["2nd"] = tts ? "segona" : "2nd.ogg"; - dictionary["3rd"] = tts ? "tercera" : "3rd.ogg"; - dictionary["4th"] = tts ? "quarta" : "4th.ogg"; - dictionary["5th"] = tts ? "cinquena" : "5th.ogg"; - dictionary["6th"] = tts ? "sisena" : "6th.ogg"; - dictionary["7th"] = tts ? "setena" : "7th.ogg"; - dictionary["8th"] = tts ? "vuitena" : "8th.ogg"; - dictionary["9th"] = tts ? "novena" : "9th.ogg"; - dictionary["10th"] = tts ? "desena" : "10th.ogg"; - dictionary["11th"] = tts ? "onzena" : "11th.ogg"; - dictionary["12th"] = tts ? "dotzena" : "12th.ogg"; - dictionary["13th"] = tts ? "tretzena" : "13th.ogg"; - dictionary["14th"] = tts ? "catorzena" : "14th.ogg"; - dictionary["15th"] = tts ? "quinzena" : "15th.ogg"; - dictionary["16th"] = tts ? "setzena" : "16th.ogg"; - dictionary["17th"] = tts ? "dissetena" : "17th.ogg"; + dictionary["1st"] = tts ? "la primera" : "1st.ogg"; + dictionary["2nd"] = tts ? "la segona" : "2nd.ogg"; + dictionary["3rd"] = tts ? "la tercera" : "3rd.ogg"; + dictionary["4th"] = tts ? "la quarta" : "4th.ogg"; + dictionary["5th"] = tts ? "la cinquena" : "5th.ogg"; + dictionary["6th"] = tts ? "la sisena" : "6th.ogg"; + dictionary["7th"] = tts ? "la setena" : "7th.ogg"; + dictionary["8th"] = tts ? "la vuitena" : "8th.ogg"; + dictionary["9th"] = tts ? "la novena" : "9th.ogg"; + dictionary["10th"] = tts ? "la desena" : "10th.ogg"; + dictionary["11th"] = tts ? "l'onzena" : "11th.ogg"; + dictionary["12th"] = tts ? "la dotzena" : "12th.ogg"; + dictionary["13th"] = tts ? "la tretzena" : "13th.ogg"; + dictionary["14th"] = tts ? "la catorzena" : "14th.ogg"; + dictionary["15th"] = tts ? "la quinzena" : "15th.ogg"; + dictionary["16th"] = tts ? "la setzena" : "16th.ogg"; + dictionary["17th"] = tts ? "la dissetena" : "17th.ogg"; // STRAIGHT/FOLLOW - dictionary["go_ahead"] = tts ? "Continua recte" : "go_ahead.ogg"; - dictionary["follow"] = tts ? "Segueix la via durant" : "follow.ogg"; + dictionary["go_ahead"] = tts ? "continueu recte" : "go_ahead.ogg"; + dictionary["follow"] = tts ? "continueu per la via durant" : "follow.ogg"; // ARRIVE - dictionary["and_arrive_destination"] = tts ? "i arribaràs a la teva destinació" : "and_arrive_destination.ogg"; - dictionary["reached_destination"] = tts ? "has arribat a la teva destinació" : "reached_destination.ogg"; - dictionary["and_arrive_intermediate"] = tts ? "i arribaràs al teu punt intermig" : "and_arrive_intermediate.ogg"; - dictionary["reached_intermediate"] = tts ? "has arribat al teu punt intermig" : "reached_intermediate.ogg"; + dictionary["and_arrive_destination"] = tts ? "i arribareu a la vostra destinació" : "and_arrive_destination.ogg"; + dictionary["reached_destination"] = tts ? "heu arribat a la vostra destinació" : "reached_destination.ogg"; + dictionary["and_arrive_intermediate"] = tts ? "i arribareu al vostre punt intermedi" : "and_arrive_intermediate.ogg"; + dictionary["reached_intermediate"] = tts ? "heu arribat al vostre punt intermedi" : "reached_intermediate.ogg"; // NEARBY POINTS - dictionary["and_arrive_waypoint"] = tts ? "i passaràs pel teu punt G P X intermig" : "and_arrive_waypoint.ogg"; - dictionary["reached_waypoint"] = tts ? "estàs passant el teu punt G P X intermig" : "reached_waypoint.ogg"; - dictionary["and_arrive_favorite"] = tts ? "i passaràs el teu favorit" : "and_arrive_favorite.ogg"; - dictionary["reached_favorite"] = tts ? "estás passant el teu punt favorit" : "reached_favorite.ogg"; - dictionary["and_arrive_poi"] = tts ? "i passaràs el P D I" : "and_arrive_poi.ogg"; - dictionary["reached_poi"] = tts ? "estàs passant el P D I" : "reached_poi.ogg"; + dictionary["and_arrive_waypoint"] = tts ? "i passareu pel vostre punt G P X intermedi" : "and_arrive_waypoint.ogg"; + dictionary["reached_waypoint"] = tts ? "esteu passant pel vostre punt G P X intermedi" : "reached_waypoint.ogg"; + dictionary["and_arrive_favorite"] = tts ? "i passareu pel vostre punt preferit" : "and_arrive_favorite.ogg"; + dictionary["reached_favorite"] = tts ? "esteu passant pel vostre punt preferit" : "reached_favorite.ogg"; + dictionary["and_arrive_poi"] = tts ? "i passareu pel P D I" : "and_arrive_poi.ogg"; + dictionary["reached_poi"] = tts ? "esteu passant pel P D I" : "reached_poi.ogg"; // ATTENTION //dictionary["exceed_limit"] = tts ? "estás excediendo el límite de velocidad" : "exceed_limit.ogg"; dictionary["exceed_limit"] = tts ? "límit de velocitat" : "exceed_limit.ogg"; - dictionary["attention"] = tts ? "Atenció" : "attention.ogg"; + dictionary["attention"] = tts ? "atenció" : "attention.ogg"; dictionary["speed_camera"] = tts ? "radar de velocitat" : "speed_camera.ogg"; dictionary["border_control"] = tts ? "control fronterer" : "border_control.ogg"; dictionary["railroad_crossing"] = tts ? "pas a nivell" : "railroad_crossing.ogg"; dictionary["traffic_calming"] = tts ? "ressalt" : "traffic_calming.ogg"; - dictionary["toll_booth"] = tts ? "guixeta de peatge" : "toll_booth.ogg"; - dictionary["stop"] = tts ? "senyal d'ESTOP" : "stop.ogg"; + dictionary["toll_booth"] = tts ? "barrera de peatge" : "toll_booth.ogg"; + dictionary["stop"] = tts ? "senyal d'estop" : "stop.ogg"; dictionary["pedestrian_crosswalk"] = tts ? "pas de vianants" : "pedestrian_crosswalk.ogg"; dictionary["tunnel"] = tts ? "túnel" : "tunnel.ogg"; // OTHER PROMPTS - dictionary["location_lost"] = tts ? "senyal g p s perduda" : "location_lost.ogg"; - dictionary["location_recovered"] = tts ? "senyal g p s trobada" : "location_recovered.ogg"; - dictionary["off_route"] = tts ? "t'has desviat de la ruta" : "off_route.ogg"; - dictionary["back_on_route"] = tts ? "has tornat a la ruta" : "back_on_route.ogg"; + dictionary["location_lost"] = tts ? "s'ha perdut el senyal del G P S" : "location_lost.ogg"; + dictionary["location_recovered"] = tts ? "s'ha recuperat el senyal del G P S" : "location_recovered.ogg"; + dictionary["off_route"] = tts ? "us heu desviat de la ruta" : "off_route.ogg"; + dictionary["back_on_route"] = tts ? "heu tornat a la ruta" : "back_on_route.ogg"; // STREET NAME PREPOSITIONS dictionary["onto"] = tts ? "en direcció a" : "onto.ogg"; - dictionary["on"] = tts ? "en" : "on.ogg"; + dictionary["on"] = tts ? "per" : "on.ogg"; dictionary["to"] = tts ? "cap a" : "to.ogg"; dictionary["toward"] = tts ? "cap a" : "toward.ogg"; @@ -118,7 +122,7 @@ function populateDictionary(tts) { dictionary["around"] = tts ? "aproximadament" : "around.ogg"; dictionary["kilometers"] = tts ? "quilòmetres" : "kilometers.ogg"; - dictionary["feet"] = tts ? "pies" : "feet.ogg"; + dictionary["feet"] = tts ? "peus" : "feet.ogg"; dictionary["tenths_of_a_mile"] = tts ? "dècimes de milla" : "tenths_of_a_mile.ogg"; dictionary["around_1_mile"] = tts ? "aproximadament una milla" : "around_1_mile.ogg"; dictionary["miles"] = tts ? "milles" : "miles.ogg"; @@ -132,8 +136,64 @@ function populateDictionary(tts) { dictionary["1_minute"] = tts ? "un minut" : "1_minute.ogg"; dictionary["minutes"] = tts ? "minuts" : "minutes.ogg"; + // NUMBERS + dictionary["1_masc"] = tts ? "un" : "1_masc.ogg"; + dictionary["1_fem"] = tts ? "una" : "1_fem.ogg"; + dictionary["2_masc"] = tts ? "dos" : "2_masc.ogg"; + dictionary["2_fem"] = tts ? "dues" : "2_fem.ogg"; + dictionary["3"] = tts ? "tres" : "3.ogg"; + dictionary["4"] = tts ? "quatre" : "4.ogg"; + dictionary["5"] = tts ? "cinc" : "5.ogg"; + dictionary["6"] = tts ? "sis" : "6.ogg"; + dictionary["7"] = tts ? "set" : "7.ogg"; + dictionary["8"] = tts ? "vuit" : "8.ogg"; + dictionary["9"] = tts ? "nou" : "9.ogg"; + dictionary["10"] = tts ? "deu" : "10.ogg"; + dictionary["11"] = tts ? "onze" : "11.ogg"; + dictionary["12"] = tts ? "dotze" : "12.ogg"; + dictionary["13"] = tts ? "tretze" : "13.ogg"; + dictionary["14"] = tts ? "catorze" : "14.ogg"; + dictionary["15"] = tts ? "quinze" : "15.ogg"; + dictionary["16"] = tts ? "setze" : "16.ogg"; + dictionary["17"] = tts ? "disset" : "17.ogg"; + dictionary["18"] = tts ? "divuit" : "18.ogg"; + dictionary["19"] = tts ? "dinou" : "19.ogg"; + dictionary["20"] = tts ? "vint" : "20.ogg"; + dictionary["30"] = tts ? "trenta" : "30.ogg"; + dictionary["40"] = tts ? "quaranta" : "40.ogg"; + dictionary["50"] = tts ? "cinquanta" : "50.ogg"; + dictionary["60"] = tts ? "seixanta" : "60.ogg"; + dictionary["70"] = tts ? "setanta" : "70.ogg"; + dictionary["80"] = tts ? "vuitanta" : "80.ogg"; + dictionary["90"] = tts ? "noranta" : "90.ogg"; + dictionary["100"] = tts ? "cent" : "100.ogg"; + dictionary["200_masc"] = tts ? "dos-cents" : "200_masc.ogg"; + dictionary["200_fem"] = tts ? "dues-centes" : "200_fem.ogg"; + dictionary["300_masc"] = tts ? "tres-cents" : "300_masc.ogg"; + dictionary["300_fem"] = tts ? "tres-centes" : "300_fem.ogg"; + dictionary["400_masc"] = tts ? "quatre-cents" : "400_masc.ogg"; + dictionary["400_fem"] = tts ? "quatre-centes" : "400_fem.ogg"; + dictionary["500_masc"] = tts ? "cinc-cents" : "500_masc.ogg"; + dictionary["500_fem"] = tts ? "cinc-centes" : "500_fem.ogg"; + dictionary["600_masc"] = tts ? "sis-cents" : "600_masc.ogg"; + dictionary["600_fem"] = tts ? "sis-centes" : "600_fem.ogg"; + dictionary["700_masc"] = tts ? "set-cents" : "700_masc.ogg"; + dictionary["700_fem"] = tts ? "set-centes" : "700_fem.ogg"; + dictionary["800_masc"] = tts ? "vuit-cents" : "800_masc.ogg"; + dictionary["800_fem"] = tts ? "vuit-centes" : "800_fem.ogg"; + dictionary["900_masc"] = tts ? "nou-cents" : "900_masc.ogg"; + dictionary["900_fem"] = tts ? "nou-centes" : "900_fem.ogg"; + dictionary["1000"] = tts ? "mil" : "1000.ogg"; + // SPECIAL NUMBERS - dictionary["20_and"] = tts ? "vint-i-" : "20_and.ogg"; + dictionary["20_and"] = tts ? "vint-i-" : "20_and.ogg "; + dictionary["30_and"] = tts ? "trenta-" : "30.ogg "; + dictionary["40_and"] = tts ? "quaranta-" : "40.ogg "; + dictionary["50_and"] = tts ? "cinquanta-" : "50.ogg "; + dictionary["60_and"] = tts ? "seixanta-" : "60.ogg "; + dictionary["70_and"] = tts ? "setanta-" : "70.ogg "; + dictionary["80_and"] = tts ? "vuitanta-" : "80.ogg "; + dictionary["90_and"] = tts ? "noranta-" : "90.ogg "; } @@ -149,69 +209,69 @@ function setMode(mode) { } function route_new_calc(dist, timeVal) { - return dictionary["route_is"] + " " + distance(dist) + " " + dictionary["time"] + " " + time(timeVal) + (tts ? ". " : " "); + return dictionary["route_is"] + (tts ? ": " : " ") + distance(dist) + (tts ? ". " : " ") + dictionary["time"] + (tts ? ": " : " ") + time(timeVal) + (tts ? ". " : " "); } function distance(dist) { switch (metricConst) { case "km-m": if (dist < 17 ) { - return (tts ? Math.round(dist).toString() : ogg_dist(Math.round(dist))) + " " + dictionary["meters"]; + return number_form(Math.round(dist), "m") + " " + dictionary["meters"]; } else if (dist < 100) { - return (tts ? Math.round((dist/10.0)*10).toString() : ogg_dist((dist/10.0)*10)) + " " + dictionary["meters"]; + return number_form(Math.round(dist/10.0)*10, "m") + " " + dictionary["meters"]; } else if (dist < 1000) { - return (tts ? Math.round((2*dist/100.0)*50).toString() : ogg_dist((2*dist/100.0)*50)) + " " + dictionary["meters"]; + return number_form(Math.round(2*dist/100.0)*50, "m") + " " + dictionary["meters"]; } else if (dist < 1500) { return dictionary["around_1_kilometer"]; } else if (dist < 10000) { - return dictionary["around"] + " " + (tts ? Math.round(dist/1000.0).toString() : ogg_dist(Math.round(dist/1000.0))) + " " + dictionary["kilometers"]; + return dictionary["around"] + " " + number_form(Math.round(dist/1000.0), "m") + " " + dictionary["kilometers"]; } else { - return (tts ? Math.round(dist/1000.0).toString() : ogg_dist(Math.round(dist/1000.0))) + " " + dictionary["kilometers"]; + return number_form(Math.round(dist/1000.0), "m") + " " + dictionary["kilometers"]; } break; case "mi-f": if (dist < 91) { - return (tts ? Math.round((2*dist/100.0/0.3048)*50).toString() : ogg_dist(Math.round(2*dist/100.0/0.3048)*50)) + " " + dictionary["feet"]; + return number_form(Math.round(2*dist/100.0/0.3048)*50, "m") + " " + dictionary["feet"]; } else if (dist < 320) { - return (tts ? (Math.round(dist/100.0/0.3048)*100).toString() : ogg_dist(Math.round(dist/100.0/0.3048)*100)) + " " + dictionary["feet"]; + return number_form(Math.round(dist/100.0/0.3048)*100, "m") + " " + dictionary["feet"]; } else if (dist < 1367) { - return (tts ? Math.round(dist/161.0).toString() : ogg_dist(Math.round(dist/161.0))) + " " + dictionary["tenths_of_a_mile"]; + return number_form(Math.round(dist/161.0), "f") + " " + dictionary["tenths_of_a_mile"]; } else if (dist < 2414) { return dictionary["around_1_mile"]; } else if (dist < 16093) { - return dictionary["around"] + " " + (tts ? Math.round(dist/1609.3).toString() : ogg_dist(Math.round(dist/1609.3))) + " " + dictionary["miles"]; + return dictionary["around"] + " " + number_form(Math.round(dist/1609.3), "f") + " " + dictionary["miles"]; } else { - return (tts ? Math.round(dist/1609.3).toString() : ogg_dist(Math.round(dist/1609.3))) + " " + dictionary["miles"]; + return number_form(Math.round(dist/1609.3), "f") + " " + dictionary["miles"]; } break; case "mi-m": if (dist < 17) { - return (tts ? Math.round(dist).toString() : ogg_dist(Math.round(dist))) + " " + dictionary["meters"]; + return number_form(Math.round(dist), "m") + " " + dictionary["meters"]; } else if (dist < 100) { - return (tts ? Math.round((dist/10.0)*10).toString() : ogg_dist((dist/10.0)*10)) + " " + dictionary["meters"]; + return number_form(Math.round(dist/10.0)*10, "m") + " " + dictionary["meters"]; } else if (dist < 1300) { - return (tts ? Math.round((2*dist/100.0)*50).toString() : ogg_dist((2*dist/100.0)*50)) + " " + dictionary["meters"]; + return number_form(Math.round(2*dist/100.0)*50, "m") + " " + dictionary["meters"]; } else if (dist < 2414) { return dictionary["around_1_mile"]; } else if (dist < 16093) { - return dictionary["around"] + " " + (tts ? Math.round(dist/1609.3).toString() : ogg_dist(Math.round(dist/1609.3))) + " " + dictionary["miles"]; + return dictionary["around"] + " " + number_form(Math.round(dist/1609.3), "f") + " " + dictionary["miles"]; } else { - return (tts ? Math.round(dist/1609.3).toString() : ogg_dist(Math.round(dist/1609.3))) + " " + dictionary["miles"]; + return number_form(Math.round(dist/1609.3), "f") + " " + dictionary["miles"]; } break; case "mi-y": if (dist < 17) { - return (tts ? Math.round(dist/0.9144).toString() : ogg_dist(Math.round(dist/0.9144))) + " " + dictionary["yards"]; + return number_form(Math.round(dist/0.9144), "f") + " " + dictionary["yards"]; } else if (dist < 100) { - return (tts ? Math.round((dist/10.0/0.9144)*10).toString() : ogg_dist(Math.round(dist/10.0/0.9144)*10)) + " " + dictionary["yards"]; + return number_form(Math.round(dist/10.0/0.9144)*10, "f") + " " + dictionary["yards"]; } else if (dist < 1300) { - return (tts ? Math.round((2*dist/100.0/0.9144)*50).toString() : ogg_dist(Math.round(2*dist/100.0/0.9144)*50)) + " " + dictionary["yards"]; + return number_form(Math.round(2*dist/100.0/0.9144)*50, "f") + " " + dictionary["yards"]; } else if (dist < 2414) { - return tts ? dictionary["around_1_mile"] : "around_1_mile.ogg"; + return dictionary["around_1_mile"]; } else if (dist < 16093) { - return dictionary["around"] + " " + (tts ? Math.round(dist/1609.3).toString() : ogg_dist(Math.round(dist/1609.3))) + " " + dictionary["miles"]; + return dictionary["around"] + " " + number_form(Math.round(dist/1609.3), "f") + " " + dictionary["miles"]; } else { - return (tts ? Math.round(dist/1609.3).toString() : ogg_dist(Math.round(dist/1609.3))) + " " + dictionary["miles"]; + return number_form(Math.round(dist/1609.3), "f") + " " + dictionary["miles"]; } break; } @@ -222,18 +282,14 @@ function time(seconds) { var oggMinutes = Math.round(((seconds/300.0) * 5)); if (seconds < 30) { return dictionary["less_a_minute"]; - } else if (minutes % 60 == 0 && tts) { - return hours(minutes); - } else if (minutes % 60 == 1 && tts) { - return hours(minutes) + " " + dictionary["1_minute"]; - } else if (tts) { - return hours(minutes) + " " + (minutes % 60).toString() + " " + dictionary["minutes"]; - } else if (!tts && seconds < 300) { - return minutes.toString() + ".ogg " + dictionary["minutes"]; - } else if (!tts && oggMinutes % 60 > 0) { - return hours(oggMinutes) + " " + (oggMinutes % 60).toString() + ".ogg " + dictionary["minutes"]; - } else if (!tts) { - return hours(oggMinutes); + } else if (seconds <= 60) { + return dictionary["1_minute"]; + } else if (minutes < 60) { + return number_form(minutes % 60, "m") + " " + dictionary["minutes"] + } else if (minutes % 60 == 1) { + return hours(minutes) + " " + dictionary["and"] + " " + dictionary["1_minute"]; + } else { + return hours(minutes) + " " + dictionary["and"] + " " + number_form(minutes % 60, "m") + " " + dictionary["minutes"] } } @@ -243,18 +299,18 @@ function hours(minutes) { } else if (minutes < 120) { return dictionary["1_hour"]; } else { - var hours = minutes / 60; - return Math.floor(hours).toString() + (!tts ? ".ogg " : " ") + dictionary["hours"]; + var hours = Math.floor(minutes / 60); + return number_form(hours, "f") + " " + dictionary["hours"]; } } function route_recalc(dist, seconds) { - return dictionary["route_calculate"] + " " + distance(dist) + " " + dictionary["time"] + " " + time(seconds) + (tts ? ". " : " "); + return dictionary["route_calculate"] + (tts ? ": " : " ") + distance(dist) + (tts ? ". " : " ") + dictionary["time"] + (tts ? ": " : " ") + time(seconds) + (tts ? ". " : " "); } function go_ahead(dist, streetName) { if (dist == -1) { - return dictionary["go_ahead"]; + return dictionary["go_ahead"] + (tts ? ". " : " "); } else { return dictionary["follow"] + " " + distance(dist) + " " + follow_street(streetName); } @@ -306,9 +362,9 @@ function getExitNumber(exitString, exitInt) { if (!tts && exitInt > 0 && exitInt < 18) { return nth(exitInt) + " " + dictionary["exit"]; } else if (tts) { - return dictionary["exit"] + " " + exitString; + return dictionary["the_exit"] + " " + exitString; } else { - return dictionary["exit"]; + return dictionary["the_exit"]; } } @@ -419,6 +475,91 @@ function nth(exit) { } } +//This function should be used whenever you need to insert a number into the sentence +function number_form(number, nounGender) { + if (number == 0) { + return ""; + } else if (number == 1) { + return nounGender == "f" ? dictionary["1_fem"] : dictionary["1_masc"]; + } else if (number == 2) { + return nounGender == "f" ? dictionary["2_fem"] : dictionary["2_masc"]; + } else if (number < 20) { + return dictionary[number]; + } else if (number == 20) { + return dictionary["20"]; + } else if (number < 30) { + return dictionary["20_and"] + number_form(number - 20, nounGender); + } else if (number == 30) { + return dictionary["30"]; + } else if (number < 40) { + return dictionary["30_and"] + number_form(number - 30, nounGender); + } else if (number == 40) { + return dictionary["40"]; + } else if (number < 50) { + return dictionary["40_and"] + number_form(number - 40, nounGender); + } else if (number == 50) { + return dictionary["50"]; + } else if (number < 60) { + return dictionary["50_and"] + number_form(number - 50, nounGender); + } else if (number == 60) { + return dictionary["60"]; + } else if (number < 70) { + return dictionary["60_and"] + number_form(number - 60, nounGender); + } else if (number == 70) { + return dictionary["70"]; + } else if (number < 80) { + return dictionary["70_and"] + number_form(number - 70, nounGender); + } else if (number == 80) { + return dictionary["80"]; + } else if (number < 90) { + return dictionary["80_and"] + number_form(number - 80, nounGender); + } else if (number == 90) { + return dictionary["90"]; + } else if (number < 100) { + return dictionary["90_and"] + number_form(number - 90, nounGender); + } else if (number == 100) { + return dictionary["100"]; + } else if (number < 200) { + return dictionary["100"] + " " + number_form(number - 100, nounGender); + } else if (number == 200) { + return (nounGender == "f" ? dictionary["200_fem"] : dictionary["200_masc"]); + } else if (number < 300) { + return (nounGender == "f" ? dictionary["200_fem"] : dictionary["200_masc"]) + " " + number_form(number - 200, nounGender); + } else if (number == 300) { + return (nounGender == "f" ? dictionary["300_fem"] : dictionary["300_masc"]); + } else if (number < 400) { + return (nounGender == "f" ? dictionary["300_fem"] : dictionary["300_masc"]) + " " + number_form(number - 300, nounGender); + } else if (number == 400) { + return (nounGender == "f" ? dictionary["400_fem"] : dictionary["400_masc"]); + } else if (number < 500) { + return (nounGender == "f" ? dictionary["400_fem"] : dictionary["400_masc"]) + " " + number_form(number - 400, nounGender); + } else if (number == 500) { + return (nounGender == "f" ? dictionary["500_fem"] : dictionary["500_masc"]); + } else if (number < 600) { + return (nounGender == "f" ? dictionary["500_fem"] : dictionary["500_masc"]) + " " + number_form(number - 500, nounGender); + } else if (number == 600) { + return (nounGender == "f" ? dictionary["600_fem"] : dictionary["600_masc"]); + } else if (number < 700) { + return (nounGender == "f" ? dictionary["600_fem"] : dictionary["600_masc"]) + " " + number_form(number - 600, nounGender); + } else if (number == 700) { + return (nounGender == "f" ? dictionary["700_fem"] : dictionary["700_masc"]); + } else if (number < 800) { + return (nounGender == "f" ? dictionary["700_fem"] : dictionary["700_masc"]) + " " + number_form(number - 700, nounGender); + } else if (number == 800) { + return (nounGender == "f" ? dictionary["800_fem"] : dictionary["800_masc"]); + } else if (number < 900) { + return (nounGender == "f" ? dictionary["800_fem"] : dictionary["800_masc"]) + " " + number_form(number - 800, nounGender); + } else if (number == 900) { + return (nounGender == "f" ? dictionary["900_fem"] : dictionary["900_masc"]); + } else if (number < 1000) { + return (nounGender == "f" ? dictionary["900_fem"] : dictionary["900_masc"]) + " " + number_form(number - 900, nounGender); + } else if (number < 2000) { + return dictionary["1000"] + " " + number_form(number % 1000, nounGender); + } else { + return number_form(Math.floor(number/1000), nounGender) + " " + dictionary["1000"] + " " + number_form(number % 1000, nounGender); + } +} + function make_ut(dist, streetName) { if (dist == -1) { return dictionary["make_uturn"] + " " + turn_street(streetName); @@ -428,92 +569,92 @@ function make_ut(dist, streetName) { } function bear_left(streetName) { - return dictionary["left_bear"]; + return dictionary["left_bear"] + (tts ? ". " : " "); } function bear_right(streetName) { - return dictionary["right_bear"]; + return dictionary["right_bear"] + (tts ? ". " : " "); } function prepare_make_ut(dist, streetName) { - return dictionary["after"] + " " + distance(dist) + " " + dictionary["make_uturn"] + " " + turn_street(streetName); + return dictionary["after"] + " " + distance(dist) + (tts ? ", " : " ") + dictionary["make_uturn"] + " " + turn_street(streetName); } function prepare_turn(turnType, dist, streetName) { - return dictionary["after"] + " " + distance(dist) + " " + getTurnType(turnType) + " " + turn_street(streetName); + return dictionary["after"] + " " + distance(dist) + (tts ? ", " : " ") + getTurnType(turnType) + " " + turn_street(streetName); } function prepare_roundabout(dist, exit, streetName) { - return dictionary["after"] + " " + distance(dist) + " " + dictionary["prepare_roundabout"]; + return dictionary["after"] + " " + distance(dist) + (tts ? ", " : " ") + dictionary["prepare_roundabout"]; } function and_arrive_destination(dest) { - return dictionary["and_arrive_destination"] + " " + dest; + return dictionary["and_arrive_destination"] + " " + dest + (tts ? ". " : " "); } function and_arrive_intermediate(dest) { - return dictionary["and_arrive_intermediate"] + " " + dest; + return dictionary["and_arrive_intermediate"] + " " + dest + (tts ? ". " : " "); } function and_arrive_waypoint(dest) { - return dictionary["and_arrive_waypoint"] + " " + dest; + return dictionary["and_arrive_waypoint"] + " " + dest + (tts ? ". " : " "); } function and_arrive_favorite(dest) { - return dictionary["and_arrive_favorite"] + " " + dest; + return dictionary["and_arrive_favorite"] + " " + dest + (tts ? ". " : " "); } function and_arrive_poi(dest) { - return dictionary["and_arrive_poi"] + " " + dest; + return dictionary["and_arrive_poi"] + " " + dest + (tts ? ". " : " "); } function reached_destination(dest) { - return dictionary["reached_destination"] + " " + dest; + return dictionary["reached_destination"] + " " + dest + (tts ? ". " : " "); } function reached_waypoint(dest) { - return dictionary["reached_waypoint"] + " " + dest; + return dictionary["reached_waypoint"] + " " + dest + (tts ? ". " : " "); } function reached_intermediate(dest) { - return dictionary["reached_intermediate"] + " " + dest; + return dictionary["reached_intermediate"] + " " + dest + (tts ? ". " : " "); } function reached_favorite(dest) { - return dictionary["reached_favorite"] + " " + dest; + return dictionary["reached_favorite"] + " " + dest + (tts ? ". " : " "); } function reached_poi(dest) { - return dictionary["reached_poi"] + " " + dest; + return dictionary["reached_poi"] + " " + dest + (tts ? ". " : " "); } function location_lost() { - return dictionary["location_lost"]; + return dictionary["location_lost"] + (tts ? ". " : " "); } function location_recovered() { - return dictionary["location_recovered"]; + return dictionary["location_recovered"] + (tts ? ". " : " "); } function off_route(dist) { - return dictionary["off_route"] + " " + distance(dist); + return dictionary["off_route"] + " " + distance(dist) + (tts ? ". " : " "); } function back_on_route() { - return dictionary["back_on_route"]; + return dictionary["back_on_route"] + (tts ? ". " : " "); } function make_ut_wp() { - return dictionary["make_uturn_wp"]; + return dictionary["make_uturn_wp"] + (tts ? ". " : " "); } // TRAFFIC WARNINGS function speed_alarm(maxSpeed, speed) { - return dictionary["exceed_limit"] + " " + maxSpeed.toString(); + return dictionary["exceed_limit"] + (tts ? ": " : " ") + number_form(maxSpeed) + (tts ? ". " : " "); } function attention(type) { - return dictionary["attention"] + (tts ? ", " : " ") + getAttentionString(type); + return dictionary["attention"] + (tts ? ", " : " ") + getAttentionString(type) + (tts ? ". " : " ") ; } function getAttentionString(type) { @@ -553,65 +694,3 @@ function getAttentionString(type) { break; } } - -function ogg_dist(distance) { - if (distance == 0) { - return ""; - } else if (distance < 20) { - return Math.floor(distance).toString() + ".ogg "; - } else if (distance < 1000 && (distance % 50) == 0) { - return distance.toString() + ".ogg "; - } else if (distance == 20) { - return "20.ogg "; - } else if (distance < 30) { - return "20.ogg " + dictionary["and"] + " " + ogg_dist(distance - 20); - } else if (distance == 30) { - return "30.ogg "; - } else if (distance < 40) { - return "30.ogg " + dictionary["and"] + " " + ogg_dist(distance - 30); - } else if (distance == 40) { - return "40.ogg "; - } else if (distance < 50) { - return "40.ogg " + dictionary["and"] + " " + ogg_dist(distance - 40); - } else if (distance == 50) { - return "50.ogg "; - } else if (distance < 60) { - return "50.ogg " + dictionary["and"] + " " + ogg_dist(distance - 50); - } else if (distance == 60) { - return "60.ogg "; - } else if (distance < 70) { - return "60.ogg " + dictionary["and"] + " " + ogg_dist(distance - 60); - } else if (distance == 70) { - return "70.ogg "; - } else if (distance < 80) { - return "70.ogg " + dictionary["and"] + " " + ogg_dist(distance - 70); - } else if (distance == 80) { - return "80.ogg "; - } else if (distance < 90) { - return "80.ogg " + dictionary["and"] + " " + ogg_dist(distance - 80); - } else if (distance == 90) { - return "90.ogg "; - } else if (distance < 100) { - return "90.ogg " + dictionary["and"] + " " + ogg_dist(distance - 90); - } else if (distance < 200) { - return "100.ogg " + ogg_dist(distance - 100); - } else if (distance < 300) { - return "200.ogg " + ogg_dist(distance - 200); - } else if (distance < 400) { - return "300.ogg " + ogg_dist(distance - 300); - } else if (distance < 500) { - return "400.ogg " + ogg_dist(distance - 400); - } else if (distance < 600) { - return "500.ogg " + ogg_dist(distance - 500); - } else if (distance < 700) { - return "600.ogg " + ogg_dist(distance - 600); - } else if (distance < 800) { - return "700.ogg " + ogg_dist(distance - 700); - } else if (distance < 900) { - return "800.ogg " + ogg_dist(distance - 800); - } else if (distance < 1000) { - return "900.ogg " + ogg_dist(distance - 900); - } else { - return ogg_dist(distance/1000) + "1000.ogg " + ogg_dist(distance % 1000); - } -} \ No newline at end of file diff --git a/voice/ca/record.sh b/voice/ca/record.sh new file mode 100755 index 0000000000..8acd3338bf --- /dev/null +++ b/voice/ca/record.sh @@ -0,0 +1,16 @@ +#!/usr/bin/env bash + +# Recording requires the following: +# - Festival TTS +# - FestCat voices (https://festcat.talp.cat/) +# - SoX + +while read line; do + filename=$(echo $line | cut -d ";" -f 1) + tempfile=$(mktemp) + echo $line | cut -d ";" -f 2 | iconv -f utf8 -t ISO-8859-15 > $tempfile + text2wave $tempfile -o "voice/$filename.wav" -eval '(voice_upc_ca_ona_hts)' + sox "voice/$filename.wav" "voice/$filename.ogg" silence 1 0.1 1% reverse silence 1 0.1 0.25% reverse + rm $tempfile + rm "voice/$filename.wav" +done < recording_sentences.txt diff --git a/voice/ca/recording_sentences.txt b/voice/ca/recording_sentences.txt new file mode 100644 index 0000000000..95b4306ef1 --- /dev/null +++ b/voice/ca/recording_sentences.txt @@ -0,0 +1,134 @@ +route_is;La ruta té +route_calculate;S'ha recalculat la ruta +distance;distància +after;després de +in;d'aquí a +left;gireu a l'esquerra +left_sh;feu un gir tancat a l'esquerra +left_sl;gireu lleugerament a l'esquerra +right;gireu a la dreta +right_sh;feu un gir tancat a la dreta +right_sl;gireu lleugerament a la dreta +left_keep;manteniu-vos a l'esquerra +right_keep;manteniu-vos a la dreta +left_bear;continueu per l'esquerra +right_bear;continueu per la dreta +make_uturn;feu mitja volta +make_uturn_wp;quan pugueu, feu mitja volta +prepare_roundabout;entreu a la rotonda +roundabout;entreu a la rotonda +then;i... +and;i... +take;agafeu +exit;sortida +the_exit;la sortida +1st;la primera +2nd;la segona +3rd;la tercera +4th;la quarta +5th;la cinquena +6th;la sisena +7th;la setena +8th;la vuitena +9th;la novena +10th;la desena +11th;l'onzena +12th;la dotzena +13th;la tretzena +14th;la catorzena +15th;la quinzena +16th;la setzena +17th;la dissetena +go_ahead;continueu recte +follow;continueu per la via durant +and_arrive_destination;i arribareu a la vostra destinació +reached_destination;heu arribat a la vostra destinació +and_arrive_intermediate;i arribareu al vostre punt intermedi +reached_intermediate;heu arribat al vostre punt intermedi +and_arrive_waypoint;i passareu pel vostre punt G P ics intermedi +reached_waypoint;esteu passant pel vostre punt G P ics intermedi +and_arrive_favorite;i passareu pel vostre punt preferit +reached_favorite;esteu passant pel vostre punt preferit +and_arrive_poi;i passareu pel P D I +reached_poi;esteu passant pel P D I +exceed_limit;límit de velocitat +attention;atenció +speed_camera;radar de velocitat +border_control;control fronterer +railroad_crossing;pas a nivell +traffic_calming;ressalt +toll_booth;barrera de peatge +stop;senyal d'estop +pedestrian_crosswalk;pas de vianants +tunnel;túnel +location_lost;s'ha perdut el senyal del G P S +location_recovered;s'ha recuperat el senyal del G P S +off_route;us heu desviat de la ruta +back_on_route;heu tornat a la ruta +onto;en direcció a +on;per +to;cap a +toward;cap a +meters;metres +around_1_kilometer;aproximadament un quilòmetre +around;aproximadament +kilometers;quilòmetres +feet;peus +tenths_of_a_mile;dècimes de milla +around_1_mile;aproximadament una milla +miles;milles +yards;iardes +time;temps necessari +1_hour;una hora +hours;hores +less_a_minute;menys d'un minut +1_minute;un minut +minutes;minuts +1_masc;un +1_fem;una +2_masc;dos +2_fem;dues +3;tres +4;quatre +5;cinc +6;sis +7;set +8;vuit +9;nou +10;deu +11;onze +12;dotze +13;tretze +14;catorze +15;quinze +16;setze +17;disset +18;divuit +19;dinou +20;vint +20_and;vinti +30;trenta +40;quaranta +50;cinquanta +60;seixanta +70;setanta +80;vuitanta +90;noranta +100;cent +200_masc;dos-cents +200_fem;dues-centes +300_masc;tres-cents +300_fem;tres-centes +400_masc;quatre-cents +400_fem;quatre-centes +500_masc;cinc-cents +500_fem;cinc-centes +600_masc;sis-cents +600_fem;sis-centes +700_masc;set-cents +700_fem;set-centes +800_masc;vuit-cents +800_fem;vuit-centes +900_masc;nou-cents +900_fem;nou-centes +1000;mil diff --git a/voice/ca/voice/1.ogg b/voice/ca/voice/1.ogg deleted file mode 100644 index 1424043133..0000000000 Binary files a/voice/ca/voice/1.ogg and /dev/null differ diff --git a/voice/ca/voice/10.ogg b/voice/ca/voice/10.ogg index 876b91b176..350dfdac76 100644 Binary files a/voice/ca/voice/10.ogg and b/voice/ca/voice/10.ogg differ diff --git a/voice/ca/voice/100.ogg b/voice/ca/voice/100.ogg index 2ad6ed8394..9164c0f508 100644 Binary files a/voice/ca/voice/100.ogg and b/voice/ca/voice/100.ogg differ diff --git a/voice/ca/voice/1000.ogg b/voice/ca/voice/1000.ogg index 6ddc485cba..3d89c21798 100644 Binary files a/voice/ca/voice/1000.ogg and b/voice/ca/voice/1000.ogg differ diff --git a/voice/ca/voice/10th.ogg b/voice/ca/voice/10th.ogg index 1174502fa5..ae5d88b811 100644 Binary files a/voice/ca/voice/10th.ogg and b/voice/ca/voice/10th.ogg differ diff --git a/voice/ca/voice/11.ogg b/voice/ca/voice/11.ogg index 2d3bce8258..5cd3e84147 100644 Binary files a/voice/ca/voice/11.ogg and b/voice/ca/voice/11.ogg differ diff --git a/voice/ca/voice/110.ogg b/voice/ca/voice/110.ogg deleted file mode 100644 index d5a4f1b067..0000000000 Binary files a/voice/ca/voice/110.ogg and /dev/null differ diff --git a/voice/ca/voice/11th.ogg b/voice/ca/voice/11th.ogg index 86c203ce8a..6274112f65 100644 Binary files a/voice/ca/voice/11th.ogg and b/voice/ca/voice/11th.ogg differ diff --git a/voice/ca/voice/12.ogg b/voice/ca/voice/12.ogg index 76d99a1776..47f319fff6 100644 Binary files a/voice/ca/voice/12.ogg and b/voice/ca/voice/12.ogg differ diff --git a/voice/ca/voice/120.ogg b/voice/ca/voice/120.ogg deleted file mode 100644 index bb271ff65e..0000000000 Binary files a/voice/ca/voice/120.ogg and /dev/null differ diff --git a/voice/ca/voice/12th.ogg b/voice/ca/voice/12th.ogg index 731c7f2a92..d4d38e6254 100644 Binary files a/voice/ca/voice/12th.ogg and b/voice/ca/voice/12th.ogg differ diff --git a/voice/ca/voice/13.ogg b/voice/ca/voice/13.ogg index 8eb7308503..e3c66ddf1c 100644 Binary files a/voice/ca/voice/13.ogg and b/voice/ca/voice/13.ogg differ diff --git a/voice/ca/voice/130.ogg b/voice/ca/voice/130.ogg deleted file mode 100644 index 875b5f3c3d..0000000000 Binary files a/voice/ca/voice/130.ogg and /dev/null differ diff --git a/voice/ca/voice/13th.ogg b/voice/ca/voice/13th.ogg index 4b99eeaaa3..6ed155a8ca 100644 Binary files a/voice/ca/voice/13th.ogg and b/voice/ca/voice/13th.ogg differ diff --git a/voice/ca/voice/14.ogg b/voice/ca/voice/14.ogg index 338427f235..52b5e10483 100644 Binary files a/voice/ca/voice/14.ogg and b/voice/ca/voice/14.ogg differ diff --git a/voice/ca/voice/140.ogg b/voice/ca/voice/140.ogg deleted file mode 100644 index fc7af8d20c..0000000000 Binary files a/voice/ca/voice/140.ogg and /dev/null differ diff --git a/voice/ca/voice/14th.ogg b/voice/ca/voice/14th.ogg index f60f07b370..b0942ae3f4 100644 Binary files a/voice/ca/voice/14th.ogg and b/voice/ca/voice/14th.ogg differ diff --git a/voice/ca/voice/15.ogg b/voice/ca/voice/15.ogg index f4f8fa953a..babfb8bf0f 100644 Binary files a/voice/ca/voice/15.ogg and b/voice/ca/voice/15.ogg differ diff --git a/voice/ca/voice/150.ogg b/voice/ca/voice/150.ogg deleted file mode 100644 index b106729c24..0000000000 Binary files a/voice/ca/voice/150.ogg and /dev/null differ diff --git a/voice/ca/voice/15th.ogg b/voice/ca/voice/15th.ogg index d4efcb0df8..ce4023a917 100644 Binary files a/voice/ca/voice/15th.ogg and b/voice/ca/voice/15th.ogg differ diff --git a/voice/ca/voice/16.ogg b/voice/ca/voice/16.ogg index ceccc0546b..e295ab717f 100644 Binary files a/voice/ca/voice/16.ogg and b/voice/ca/voice/16.ogg differ diff --git a/voice/ca/voice/16th.ogg b/voice/ca/voice/16th.ogg index 0c0992ad08..af49911456 100644 Binary files a/voice/ca/voice/16th.ogg and b/voice/ca/voice/16th.ogg differ diff --git a/voice/ca/voice/17.ogg b/voice/ca/voice/17.ogg index 54a5783ded..2872e9b6a9 100644 Binary files a/voice/ca/voice/17.ogg and b/voice/ca/voice/17.ogg differ diff --git a/voice/ca/voice/17th.ogg b/voice/ca/voice/17th.ogg index e75724d5ff..5d6d7c4a55 100644 Binary files a/voice/ca/voice/17th.ogg and b/voice/ca/voice/17th.ogg differ diff --git a/voice/ca/voice/18.ogg b/voice/ca/voice/18.ogg index 0541011739..3425af6943 100644 Binary files a/voice/ca/voice/18.ogg and b/voice/ca/voice/18.ogg differ diff --git a/voice/ca/voice/19.ogg b/voice/ca/voice/19.ogg index 6370fdeca8..33848956fe 100644 Binary files a/voice/ca/voice/19.ogg and b/voice/ca/voice/19.ogg differ diff --git a/voice/ca/voice/1_fem.ogg b/voice/ca/voice/1_fem.ogg new file mode 100644 index 0000000000..e57e63d49a Binary files /dev/null and b/voice/ca/voice/1_fem.ogg differ diff --git a/voice/ca/voice/1_hour.ogg b/voice/ca/voice/1_hour.ogg index b53df23656..07dca9ee7f 100644 Binary files a/voice/ca/voice/1_hour.ogg and b/voice/ca/voice/1_hour.ogg differ diff --git a/voice/ca/voice/1_masc.ogg b/voice/ca/voice/1_masc.ogg new file mode 100644 index 0000000000..6cf76eb442 Binary files /dev/null and b/voice/ca/voice/1_masc.ogg differ diff --git a/voice/ca/voice/1_minute.ogg b/voice/ca/voice/1_minute.ogg index ba755e5260..c7f78fb9e6 100644 Binary files a/voice/ca/voice/1_minute.ogg and b/voice/ca/voice/1_minute.ogg differ diff --git a/voice/ca/voice/1_tenth_of_a_mile.ogg b/voice/ca/voice/1_tenth_of_a_mile.ogg deleted file mode 100644 index d93a155615..0000000000 Binary files a/voice/ca/voice/1_tenth_of_a_mile.ogg and /dev/null differ diff --git a/voice/ca/voice/1st.ogg b/voice/ca/voice/1st.ogg index a02d4b72d8..930a3f57b4 100644 Binary files a/voice/ca/voice/1st.ogg and b/voice/ca/voice/1st.ogg differ diff --git a/voice/ca/voice/2.ogg b/voice/ca/voice/2.ogg deleted file mode 100644 index 9a11728acf..0000000000 Binary files a/voice/ca/voice/2.ogg and /dev/null differ diff --git a/voice/ca/voice/20.ogg b/voice/ca/voice/20.ogg index ad3ecf98c3..323adf31d9 100644 Binary files a/voice/ca/voice/20.ogg and b/voice/ca/voice/20.ogg differ diff --git a/voice/ca/voice/200.ogg b/voice/ca/voice/200.ogg deleted file mode 100644 index 1c3e4983ca..0000000000 Binary files a/voice/ca/voice/200.ogg and /dev/null differ diff --git a/voice/ca/voice/2000.ogg b/voice/ca/voice/2000.ogg deleted file mode 100644 index 47eb44a8c5..0000000000 Binary files a/voice/ca/voice/2000.ogg and /dev/null differ diff --git a/voice/ca/voice/200_fem.ogg b/voice/ca/voice/200_fem.ogg new file mode 100644 index 0000000000..20432db443 Binary files /dev/null and b/voice/ca/voice/200_fem.ogg differ diff --git a/voice/ca/voice/200_masc.ogg b/voice/ca/voice/200_masc.ogg new file mode 100644 index 0000000000..e9d39c930e Binary files /dev/null and b/voice/ca/voice/200_masc.ogg differ diff --git a/voice/ca/voice/20_and.ogg b/voice/ca/voice/20_and.ogg index d0b461d07c..e8235af04b 100644 Binary files a/voice/ca/voice/20_and.ogg and b/voice/ca/voice/20_and.ogg differ diff --git a/voice/ca/voice/25.ogg b/voice/ca/voice/25.ogg deleted file mode 100644 index a2354929bf..0000000000 Binary files a/voice/ca/voice/25.ogg and /dev/null differ diff --git a/voice/ca/voice/250.ogg b/voice/ca/voice/250.ogg deleted file mode 100644 index 739131a287..0000000000 Binary files a/voice/ca/voice/250.ogg and /dev/null differ diff --git a/voice/ca/voice/2_fem.ogg b/voice/ca/voice/2_fem.ogg new file mode 100644 index 0000000000..0e74bb7e61 Binary files /dev/null and b/voice/ca/voice/2_fem.ogg differ diff --git a/voice/ca/voice/2_masc.ogg b/voice/ca/voice/2_masc.ogg new file mode 100644 index 0000000000..773bf2b3fe Binary files /dev/null and b/voice/ca/voice/2_masc.ogg differ diff --git a/voice/ca/voice/2nd.ogg b/voice/ca/voice/2nd.ogg index 8b5a43f50c..32e240a45f 100644 Binary files a/voice/ca/voice/2nd.ogg and b/voice/ca/voice/2nd.ogg differ diff --git a/voice/ca/voice/3.ogg b/voice/ca/voice/3.ogg index 0384c020a1..60013d9bef 100644 Binary files a/voice/ca/voice/3.ogg and b/voice/ca/voice/3.ogg differ diff --git a/voice/ca/voice/30.ogg b/voice/ca/voice/30.ogg index 31b486e5ef..9661ffde8c 100644 Binary files a/voice/ca/voice/30.ogg and b/voice/ca/voice/30.ogg differ diff --git a/voice/ca/voice/300.ogg b/voice/ca/voice/300.ogg deleted file mode 100644 index 959da6d261..0000000000 Binary files a/voice/ca/voice/300.ogg and /dev/null differ diff --git a/voice/ca/voice/3000.ogg b/voice/ca/voice/3000.ogg deleted file mode 100644 index 4b5280798b..0000000000 Binary files a/voice/ca/voice/3000.ogg and /dev/null differ diff --git a/voice/ca/voice/300_fem.ogg b/voice/ca/voice/300_fem.ogg new file mode 100644 index 0000000000..9bd2f9ae89 Binary files /dev/null and b/voice/ca/voice/300_fem.ogg differ diff --git a/voice/ca/voice/300_masc.ogg b/voice/ca/voice/300_masc.ogg new file mode 100644 index 0000000000..a2763d1d65 Binary files /dev/null and b/voice/ca/voice/300_masc.ogg differ diff --git a/voice/ca/voice/35.ogg b/voice/ca/voice/35.ogg deleted file mode 100644 index 5bd08a68a9..0000000000 Binary files a/voice/ca/voice/35.ogg and /dev/null differ diff --git a/voice/ca/voice/350.ogg b/voice/ca/voice/350.ogg deleted file mode 100644 index 2f4d85b094..0000000000 Binary files a/voice/ca/voice/350.ogg and /dev/null differ diff --git a/voice/ca/voice/3rd.ogg b/voice/ca/voice/3rd.ogg index 38bd99d63f..e78fe41e71 100644 Binary files a/voice/ca/voice/3rd.ogg and b/voice/ca/voice/3rd.ogg differ diff --git a/voice/ca/voice/4.ogg b/voice/ca/voice/4.ogg index db8ae15c0a..cfbe6609ed 100644 Binary files a/voice/ca/voice/4.ogg and b/voice/ca/voice/4.ogg differ diff --git a/voice/ca/voice/40.ogg b/voice/ca/voice/40.ogg index adbb215418..daf574acba 100644 Binary files a/voice/ca/voice/40.ogg and b/voice/ca/voice/40.ogg differ diff --git a/voice/ca/voice/400.ogg b/voice/ca/voice/400.ogg deleted file mode 100644 index 0b76dd007e..0000000000 Binary files a/voice/ca/voice/400.ogg and /dev/null differ diff --git a/voice/ca/voice/4000.ogg b/voice/ca/voice/4000.ogg deleted file mode 100644 index cdb053df99..0000000000 Binary files a/voice/ca/voice/4000.ogg and /dev/null differ diff --git a/voice/ca/voice/400_fem.ogg b/voice/ca/voice/400_fem.ogg new file mode 100644 index 0000000000..5a462d26b4 Binary files /dev/null and b/voice/ca/voice/400_fem.ogg differ diff --git a/voice/ca/voice/400_masc.ogg b/voice/ca/voice/400_masc.ogg new file mode 100644 index 0000000000..a6df2c3dfa Binary files /dev/null and b/voice/ca/voice/400_masc.ogg differ diff --git a/voice/ca/voice/45.ogg b/voice/ca/voice/45.ogg deleted file mode 100644 index 81c84e23a0..0000000000 Binary files a/voice/ca/voice/45.ogg and /dev/null differ diff --git a/voice/ca/voice/450.ogg b/voice/ca/voice/450.ogg deleted file mode 100644 index ead38475cd..0000000000 Binary files a/voice/ca/voice/450.ogg and /dev/null differ diff --git a/voice/ca/voice/4th.ogg b/voice/ca/voice/4th.ogg index 85ab296c00..9f046fcfaa 100644 Binary files a/voice/ca/voice/4th.ogg and b/voice/ca/voice/4th.ogg differ diff --git a/voice/ca/voice/5.ogg b/voice/ca/voice/5.ogg index d7ff8b4bf9..af40de0b37 100644 Binary files a/voice/ca/voice/5.ogg and b/voice/ca/voice/5.ogg differ diff --git a/voice/ca/voice/50.ogg b/voice/ca/voice/50.ogg index 31700de78f..2c6aeac964 100644 Binary files a/voice/ca/voice/50.ogg and b/voice/ca/voice/50.ogg differ diff --git a/voice/ca/voice/500.ogg b/voice/ca/voice/500.ogg deleted file mode 100644 index b555ec548d..0000000000 Binary files a/voice/ca/voice/500.ogg and /dev/null differ diff --git a/voice/ca/voice/5000.ogg b/voice/ca/voice/5000.ogg deleted file mode 100644 index 4a48315767..0000000000 Binary files a/voice/ca/voice/5000.ogg and /dev/null differ diff --git a/voice/ca/voice/500_fem.ogg b/voice/ca/voice/500_fem.ogg new file mode 100644 index 0000000000..6ea06d2c1e Binary files /dev/null and b/voice/ca/voice/500_fem.ogg differ diff --git a/voice/ca/voice/500_masc.ogg b/voice/ca/voice/500_masc.ogg new file mode 100644 index 0000000000..bdbd1c3dad Binary files /dev/null and b/voice/ca/voice/500_masc.ogg differ diff --git a/voice/ca/voice/55.ogg b/voice/ca/voice/55.ogg deleted file mode 100644 index 836de81373..0000000000 Binary files a/voice/ca/voice/55.ogg and /dev/null differ diff --git a/voice/ca/voice/550.ogg b/voice/ca/voice/550.ogg deleted file mode 100644 index a8d3e7ca7d..0000000000 Binary files a/voice/ca/voice/550.ogg and /dev/null differ diff --git a/voice/ca/voice/5th.ogg b/voice/ca/voice/5th.ogg index 58876eb54b..c8fc627f97 100644 Binary files a/voice/ca/voice/5th.ogg and b/voice/ca/voice/5th.ogg differ diff --git a/voice/ca/voice/6.ogg b/voice/ca/voice/6.ogg index fb2a339f39..b204469d71 100644 Binary files a/voice/ca/voice/6.ogg and b/voice/ca/voice/6.ogg differ diff --git a/voice/ca/voice/60.ogg b/voice/ca/voice/60.ogg index 7741603dc0..e25ceb879e 100644 Binary files a/voice/ca/voice/60.ogg and b/voice/ca/voice/60.ogg differ diff --git a/voice/ca/voice/600.ogg b/voice/ca/voice/600.ogg deleted file mode 100644 index 117968696d..0000000000 Binary files a/voice/ca/voice/600.ogg and /dev/null differ diff --git a/voice/ca/voice/6000.ogg b/voice/ca/voice/6000.ogg deleted file mode 100644 index 5a49524a7d..0000000000 Binary files a/voice/ca/voice/6000.ogg and /dev/null differ diff --git a/voice/ca/voice/600_fem.ogg b/voice/ca/voice/600_fem.ogg new file mode 100644 index 0000000000..ef68792529 Binary files /dev/null and b/voice/ca/voice/600_fem.ogg differ diff --git a/voice/ca/voice/600_masc.ogg b/voice/ca/voice/600_masc.ogg new file mode 100644 index 0000000000..84767449c1 Binary files /dev/null and b/voice/ca/voice/600_masc.ogg differ diff --git a/voice/ca/voice/65.ogg b/voice/ca/voice/65.ogg deleted file mode 100644 index 1419d9b782..0000000000 Binary files a/voice/ca/voice/65.ogg and /dev/null differ diff --git a/voice/ca/voice/650.ogg b/voice/ca/voice/650.ogg deleted file mode 100644 index 30afcf7597..0000000000 Binary files a/voice/ca/voice/650.ogg and /dev/null differ diff --git a/voice/ca/voice/6th.ogg b/voice/ca/voice/6th.ogg index a469f63469..10440fe3b9 100644 Binary files a/voice/ca/voice/6th.ogg and b/voice/ca/voice/6th.ogg differ diff --git a/voice/ca/voice/7.ogg b/voice/ca/voice/7.ogg index 871fcb1bc9..6fa02cea52 100644 Binary files a/voice/ca/voice/7.ogg and b/voice/ca/voice/7.ogg differ diff --git a/voice/ca/voice/70.ogg b/voice/ca/voice/70.ogg index 2023ec41cc..20d0b630a8 100644 Binary files a/voice/ca/voice/70.ogg and b/voice/ca/voice/70.ogg differ diff --git a/voice/ca/voice/700.ogg b/voice/ca/voice/700.ogg deleted file mode 100644 index fb464c9e24..0000000000 Binary files a/voice/ca/voice/700.ogg and /dev/null differ diff --git a/voice/ca/voice/7000.ogg b/voice/ca/voice/7000.ogg deleted file mode 100644 index 05dda066bd..0000000000 Binary files a/voice/ca/voice/7000.ogg and /dev/null differ diff --git a/voice/ca/voice/700_fem.ogg b/voice/ca/voice/700_fem.ogg new file mode 100644 index 0000000000..9efc219008 Binary files /dev/null and b/voice/ca/voice/700_fem.ogg differ diff --git a/voice/ca/voice/700_masc.ogg b/voice/ca/voice/700_masc.ogg new file mode 100644 index 0000000000..fc0fb24af0 Binary files /dev/null and b/voice/ca/voice/700_masc.ogg differ diff --git a/voice/ca/voice/75.ogg b/voice/ca/voice/75.ogg deleted file mode 100644 index ca0d81aad4..0000000000 Binary files a/voice/ca/voice/75.ogg and /dev/null differ diff --git a/voice/ca/voice/750.ogg b/voice/ca/voice/750.ogg deleted file mode 100644 index ca5d31c93c..0000000000 Binary files a/voice/ca/voice/750.ogg and /dev/null differ diff --git a/voice/ca/voice/7th.ogg b/voice/ca/voice/7th.ogg index c45a5f42f9..c37b55e86d 100644 Binary files a/voice/ca/voice/7th.ogg and b/voice/ca/voice/7th.ogg differ diff --git a/voice/ca/voice/8.ogg b/voice/ca/voice/8.ogg index bcb2230c7c..9fc149cfe5 100644 Binary files a/voice/ca/voice/8.ogg and b/voice/ca/voice/8.ogg differ diff --git a/voice/ca/voice/80.ogg b/voice/ca/voice/80.ogg index f2f60cc5ff..049a668df2 100644 Binary files a/voice/ca/voice/80.ogg and b/voice/ca/voice/80.ogg differ diff --git a/voice/ca/voice/800.ogg b/voice/ca/voice/800.ogg deleted file mode 100644 index b81bb15a71..0000000000 Binary files a/voice/ca/voice/800.ogg and /dev/null differ diff --git a/voice/ca/voice/8000.ogg b/voice/ca/voice/8000.ogg deleted file mode 100644 index 049cadb9e4..0000000000 Binary files a/voice/ca/voice/8000.ogg and /dev/null differ diff --git a/voice/ca/voice/800_fem.ogg b/voice/ca/voice/800_fem.ogg new file mode 100644 index 0000000000..1fb1cfcef7 Binary files /dev/null and b/voice/ca/voice/800_fem.ogg differ diff --git a/voice/ca/voice/800_masc.ogg b/voice/ca/voice/800_masc.ogg new file mode 100644 index 0000000000..7679b2b907 Binary files /dev/null and b/voice/ca/voice/800_masc.ogg differ diff --git a/voice/ca/voice/85.ogg b/voice/ca/voice/85.ogg deleted file mode 100644 index 0710fe2f8a..0000000000 Binary files a/voice/ca/voice/85.ogg and /dev/null differ diff --git a/voice/ca/voice/850.ogg b/voice/ca/voice/850.ogg deleted file mode 100644 index 6d4051a8f2..0000000000 Binary files a/voice/ca/voice/850.ogg and /dev/null differ diff --git a/voice/ca/voice/8th.ogg b/voice/ca/voice/8th.ogg index 365e024a8b..f758eb4df5 100644 Binary files a/voice/ca/voice/8th.ogg and b/voice/ca/voice/8th.ogg differ diff --git a/voice/ca/voice/9.ogg b/voice/ca/voice/9.ogg index 6a6e4b2ee6..8b8a932c73 100644 Binary files a/voice/ca/voice/9.ogg and b/voice/ca/voice/9.ogg differ diff --git a/voice/ca/voice/90.ogg b/voice/ca/voice/90.ogg index 4f1ebe4008..46b5ae8ae8 100644 Binary files a/voice/ca/voice/90.ogg and b/voice/ca/voice/90.ogg differ diff --git a/voice/ca/voice/900.ogg b/voice/ca/voice/900.ogg deleted file mode 100644 index 747c49cfb1..0000000000 Binary files a/voice/ca/voice/900.ogg and /dev/null differ diff --git a/voice/ca/voice/9000.ogg b/voice/ca/voice/9000.ogg deleted file mode 100644 index 5daae93d27..0000000000 Binary files a/voice/ca/voice/9000.ogg and /dev/null differ diff --git a/voice/ca/voice/900_fem.ogg b/voice/ca/voice/900_fem.ogg new file mode 100644 index 0000000000..a03ea2d83f Binary files /dev/null and b/voice/ca/voice/900_fem.ogg differ diff --git a/voice/ca/voice/900_masc.ogg b/voice/ca/voice/900_masc.ogg new file mode 100644 index 0000000000..d034ffedd5 Binary files /dev/null and b/voice/ca/voice/900_masc.ogg differ diff --git a/voice/ca/voice/95.ogg b/voice/ca/voice/95.ogg deleted file mode 100644 index cf40984a40..0000000000 Binary files a/voice/ca/voice/95.ogg and /dev/null differ diff --git a/voice/ca/voice/950.ogg b/voice/ca/voice/950.ogg deleted file mode 100644 index 948d20310e..0000000000 Binary files a/voice/ca/voice/950.ogg and /dev/null differ diff --git a/voice/ca/voice/9th.ogg b/voice/ca/voice/9th.ogg index 7d77f9cffd..4c49f4e778 100644 Binary files a/voice/ca/voice/9th.ogg and b/voice/ca/voice/9th.ogg differ diff --git a/voice/ca/voice/after.ogg b/voice/ca/voice/after.ogg index 891da70b93..7ddc8eb045 100644 Binary files a/voice/ca/voice/after.ogg and b/voice/ca/voice/after.ogg differ diff --git a/voice/ca/voice/and.ogg b/voice/ca/voice/and.ogg index f444089a56..117ebdbb07 100644 Binary files a/voice/ca/voice/and.ogg and b/voice/ca/voice/and.ogg differ diff --git a/voice/ca/voice/and_arrive_destination.ogg b/voice/ca/voice/and_arrive_destination.ogg index 577b624115..55e1e22a42 100644 Binary files a/voice/ca/voice/and_arrive_destination.ogg and b/voice/ca/voice/and_arrive_destination.ogg differ diff --git a/voice/ca/voice/and_arrive_favorite.ogg b/voice/ca/voice/and_arrive_favorite.ogg index da93c297ea..ca28b195f7 100644 Binary files a/voice/ca/voice/and_arrive_favorite.ogg and b/voice/ca/voice/and_arrive_favorite.ogg differ diff --git a/voice/ca/voice/and_arrive_intermediate.ogg b/voice/ca/voice/and_arrive_intermediate.ogg index b7d964e857..ede0e82703 100644 Binary files a/voice/ca/voice/and_arrive_intermediate.ogg and b/voice/ca/voice/and_arrive_intermediate.ogg differ diff --git a/voice/ca/voice/and_arrive_poi.ogg b/voice/ca/voice/and_arrive_poi.ogg index 1b36aaf68e..825bd477d4 100644 Binary files a/voice/ca/voice/and_arrive_poi.ogg and b/voice/ca/voice/and_arrive_poi.ogg differ diff --git a/voice/ca/voice/and_arrive_waypoint.ogg b/voice/ca/voice/and_arrive_waypoint.ogg index 3d6b4fbb58..ecbc591093 100644 Binary files a/voice/ca/voice/and_arrive_waypoint.ogg and b/voice/ca/voice/and_arrive_waypoint.ogg differ diff --git a/voice/ca/voice/around.ogg b/voice/ca/voice/around.ogg index 46ac50cbf2..92da36c313 100644 Binary files a/voice/ca/voice/around.ogg and b/voice/ca/voice/around.ogg differ diff --git a/voice/ca/voice/around_1_kilometer.ogg b/voice/ca/voice/around_1_kilometer.ogg index 7dd918ff35..32e7bac94e 100644 Binary files a/voice/ca/voice/around_1_kilometer.ogg and b/voice/ca/voice/around_1_kilometer.ogg differ diff --git a/voice/ca/voice/around_1_mile.ogg b/voice/ca/voice/around_1_mile.ogg index d2bfbb6fce..94ca4b3d21 100644 Binary files a/voice/ca/voice/around_1_mile.ogg and b/voice/ca/voice/around_1_mile.ogg differ diff --git a/voice/ca/voice/attention.ogg b/voice/ca/voice/attention.ogg index 288895ca3e..5a177e1101 100644 Binary files a/voice/ca/voice/attention.ogg and b/voice/ca/voice/attention.ogg differ diff --git a/voice/ca/voice/back_on_route.ogg b/voice/ca/voice/back_on_route.ogg index 75a3e12cbc..aa37ee3c07 100644 Binary files a/voice/ca/voice/back_on_route.ogg and b/voice/ca/voice/back_on_route.ogg differ diff --git a/voice/ca/voice/border_control.ogg b/voice/ca/voice/border_control.ogg index ca7b33cba9..cf058c4a53 100644 Binary files a/voice/ca/voice/border_control.ogg and b/voice/ca/voice/border_control.ogg differ diff --git a/voice/ca/voice/distance.ogg b/voice/ca/voice/distance.ogg index 6bb8912352..fe43516f7f 100644 Binary files a/voice/ca/voice/distance.ogg and b/voice/ca/voice/distance.ogg differ diff --git a/voice/ca/voice/exceed_limit.ogg b/voice/ca/voice/exceed_limit.ogg index 5f6c5919a2..e3c90c4a4d 100644 Binary files a/voice/ca/voice/exceed_limit.ogg and b/voice/ca/voice/exceed_limit.ogg differ diff --git a/voice/ca/voice/exit.ogg b/voice/ca/voice/exit.ogg index e87df97597..793436b59a 100644 Binary files a/voice/ca/voice/exit.ogg and b/voice/ca/voice/exit.ogg differ diff --git a/voice/ca/voice/feet.ogg b/voice/ca/voice/feet.ogg index 4d57444b2a..f5afd4a075 100644 Binary files a/voice/ca/voice/feet.ogg and b/voice/ca/voice/feet.ogg differ diff --git a/voice/ca/voice/follow.ogg b/voice/ca/voice/follow.ogg index ff8dce0423..a4f4d4ba14 100644 Binary files a/voice/ca/voice/follow.ogg and b/voice/ca/voice/follow.ogg differ diff --git a/voice/ca/voice/go_ahead.ogg b/voice/ca/voice/go_ahead.ogg index 3799859789..311465bbe4 100644 Binary files a/voice/ca/voice/go_ahead.ogg and b/voice/ca/voice/go_ahead.ogg differ diff --git a/voice/ca/voice/hours.ogg b/voice/ca/voice/hours.ogg index d73e16df27..ff38354fb7 100644 Binary files a/voice/ca/voice/hours.ogg and b/voice/ca/voice/hours.ogg differ diff --git a/voice/ca/voice/in.ogg b/voice/ca/voice/in.ogg index 93ac0e9dbb..900e57388f 100644 Binary files a/voice/ca/voice/in.ogg and b/voice/ca/voice/in.ogg differ diff --git a/voice/ca/voice/kilometers.ogg b/voice/ca/voice/kilometers.ogg index 8d43ac6f5f..f88fc826a1 100644 Binary files a/voice/ca/voice/kilometers.ogg and b/voice/ca/voice/kilometers.ogg differ diff --git a/voice/ca/voice/left.ogg b/voice/ca/voice/left.ogg index d1e7bf449c..e0e58335a9 100644 Binary files a/voice/ca/voice/left.ogg and b/voice/ca/voice/left.ogg differ diff --git a/voice/ca/voice/left_bear.ogg b/voice/ca/voice/left_bear.ogg index 2b3600e11a..8a6192d8a7 100644 Binary files a/voice/ca/voice/left_bear.ogg and b/voice/ca/voice/left_bear.ogg differ diff --git a/voice/ca/voice/left_keep.ogg b/voice/ca/voice/left_keep.ogg index 2e1475069d..a17b99a3e6 100644 Binary files a/voice/ca/voice/left_keep.ogg and b/voice/ca/voice/left_keep.ogg differ diff --git a/voice/ca/voice/left_sh.ogg b/voice/ca/voice/left_sh.ogg index 669d45f4ef..768ae494f8 100644 Binary files a/voice/ca/voice/left_sh.ogg and b/voice/ca/voice/left_sh.ogg differ diff --git a/voice/ca/voice/left_sl.ogg b/voice/ca/voice/left_sl.ogg index 5ac3d986d5..807e4224b5 100644 Binary files a/voice/ca/voice/left_sl.ogg and b/voice/ca/voice/left_sl.ogg differ diff --git a/voice/ca/voice/less_a_minute.ogg b/voice/ca/voice/less_a_minute.ogg index 532203d05b..fa77a32001 100644 Binary files a/voice/ca/voice/less_a_minute.ogg and b/voice/ca/voice/less_a_minute.ogg differ diff --git a/voice/ca/voice/location_lost.ogg b/voice/ca/voice/location_lost.ogg index 82da5b9f89..46e918aacc 100644 Binary files a/voice/ca/voice/location_lost.ogg and b/voice/ca/voice/location_lost.ogg differ diff --git a/voice/ca/voice/location_recovered.ogg b/voice/ca/voice/location_recovered.ogg index 6b1e491e2c..034ef4fb3d 100644 Binary files a/voice/ca/voice/location_recovered.ogg and b/voice/ca/voice/location_recovered.ogg differ diff --git a/voice/ca/voice/make_uturn.ogg b/voice/ca/voice/make_uturn.ogg index 60568b1b0f..a9e5898957 100644 Binary files a/voice/ca/voice/make_uturn.ogg and b/voice/ca/voice/make_uturn.ogg differ diff --git a/voice/ca/voice/make_uturn_wp.ogg b/voice/ca/voice/make_uturn_wp.ogg index 9b95035f75..1ec70de1d1 100644 Binary files a/voice/ca/voice/make_uturn_wp.ogg and b/voice/ca/voice/make_uturn_wp.ogg differ diff --git a/voice/ca/voice/meters.ogg b/voice/ca/voice/meters.ogg index 70b6dcdf21..80e97a5344 100644 Binary files a/voice/ca/voice/meters.ogg and b/voice/ca/voice/meters.ogg differ diff --git a/voice/ca/voice/miles.ogg b/voice/ca/voice/miles.ogg index a5ae493348..3dd63e39e5 100644 Binary files a/voice/ca/voice/miles.ogg and b/voice/ca/voice/miles.ogg differ diff --git a/voice/ca/voice/minutes.ogg b/voice/ca/voice/minutes.ogg index d2f30b88e7..5a8a8a60c2 100644 Binary files a/voice/ca/voice/minutes.ogg and b/voice/ca/voice/minutes.ogg differ diff --git a/voice/ca/voice/off_route.ogg b/voice/ca/voice/off_route.ogg index 8f3271be4d..8bff202036 100644 Binary files a/voice/ca/voice/off_route.ogg and b/voice/ca/voice/off_route.ogg differ diff --git a/voice/ca/voice/on.ogg b/voice/ca/voice/on.ogg index c266540692..5d6d469aa7 100644 Binary files a/voice/ca/voice/on.ogg and b/voice/ca/voice/on.ogg differ diff --git a/voice/ca/voice/onto.ogg b/voice/ca/voice/onto.ogg new file mode 100644 index 0000000000..a183ead4e7 Binary files /dev/null and b/voice/ca/voice/onto.ogg differ diff --git a/voice/ca/voice/pedestrian_crosswalk.ogg b/voice/ca/voice/pedestrian_crosswalk.ogg index d0f4aa4798..cb11f24b46 100644 Binary files a/voice/ca/voice/pedestrian_crosswalk.ogg and b/voice/ca/voice/pedestrian_crosswalk.ogg differ diff --git a/voice/ca/voice/prepare_roundabout.ogg b/voice/ca/voice/prepare_roundabout.ogg index 42865637a6..1216ea414b 100644 Binary files a/voice/ca/voice/prepare_roundabout.ogg and b/voice/ca/voice/prepare_roundabout.ogg differ diff --git a/voice/ca/voice/railroad_crossing.ogg b/voice/ca/voice/railroad_crossing.ogg index 27806fab88..b051afbe89 100644 Binary files a/voice/ca/voice/railroad_crossing.ogg and b/voice/ca/voice/railroad_crossing.ogg differ diff --git a/voice/ca/voice/reached_destination.ogg b/voice/ca/voice/reached_destination.ogg index 0d94ccdc04..a65233b0a3 100644 Binary files a/voice/ca/voice/reached_destination.ogg and b/voice/ca/voice/reached_destination.ogg differ diff --git a/voice/ca/voice/reached_favorite.ogg b/voice/ca/voice/reached_favorite.ogg index b1aae2fbad..9357023487 100644 Binary files a/voice/ca/voice/reached_favorite.ogg and b/voice/ca/voice/reached_favorite.ogg differ diff --git a/voice/ca/voice/reached_intermediate.ogg b/voice/ca/voice/reached_intermediate.ogg index 37f519b8e8..0aad66d362 100644 Binary files a/voice/ca/voice/reached_intermediate.ogg and b/voice/ca/voice/reached_intermediate.ogg differ diff --git a/voice/ca/voice/reached_poi.ogg b/voice/ca/voice/reached_poi.ogg index 066c6b381e..7f0befa8e9 100644 Binary files a/voice/ca/voice/reached_poi.ogg and b/voice/ca/voice/reached_poi.ogg differ diff --git a/voice/ca/voice/reached_waypoint.ogg b/voice/ca/voice/reached_waypoint.ogg index 8ff7eb6b67..046f8296c2 100644 Binary files a/voice/ca/voice/reached_waypoint.ogg and b/voice/ca/voice/reached_waypoint.ogg differ diff --git a/voice/ca/voice/right.ogg b/voice/ca/voice/right.ogg index 92b8c96edb..e5236cd641 100644 Binary files a/voice/ca/voice/right.ogg and b/voice/ca/voice/right.ogg differ diff --git a/voice/ca/voice/right_bear.ogg b/voice/ca/voice/right_bear.ogg index ef01b59ccb..aaf8cce37d 100644 Binary files a/voice/ca/voice/right_bear.ogg and b/voice/ca/voice/right_bear.ogg differ diff --git a/voice/ca/voice/right_keep.ogg b/voice/ca/voice/right_keep.ogg index 3256ed9373..2e66e32343 100644 Binary files a/voice/ca/voice/right_keep.ogg and b/voice/ca/voice/right_keep.ogg differ diff --git a/voice/ca/voice/right_sh.ogg b/voice/ca/voice/right_sh.ogg index 579ed35bf1..7eafa7f2cf 100644 Binary files a/voice/ca/voice/right_sh.ogg and b/voice/ca/voice/right_sh.ogg differ diff --git a/voice/ca/voice/right_sl.ogg b/voice/ca/voice/right_sl.ogg index 865c294a18..ce5c911760 100644 Binary files a/voice/ca/voice/right_sl.ogg and b/voice/ca/voice/right_sl.ogg differ diff --git a/voice/ca/voice/roundabout.ogg b/voice/ca/voice/roundabout.ogg index 4b4c45b734..68226dc8f4 100644 Binary files a/voice/ca/voice/roundabout.ogg and b/voice/ca/voice/roundabout.ogg differ diff --git a/voice/ca/voice/route_calculate.ogg b/voice/ca/voice/route_calculate.ogg index 593c9b0b8d..8f097d6fbd 100644 Binary files a/voice/ca/voice/route_calculate.ogg and b/voice/ca/voice/route_calculate.ogg differ diff --git a/voice/ca/voice/route_is.ogg b/voice/ca/voice/route_is.ogg index 9cb75741fc..50ae42f106 100644 Binary files a/voice/ca/voice/route_is.ogg and b/voice/ca/voice/route_is.ogg differ diff --git a/voice/ca/voice/speed_camera.ogg b/voice/ca/voice/speed_camera.ogg index b2c15c7bd3..40aebb5ce3 100644 Binary files a/voice/ca/voice/speed_camera.ogg and b/voice/ca/voice/speed_camera.ogg differ diff --git a/voice/ca/voice/stop.ogg b/voice/ca/voice/stop.ogg index a1bdaf0c8d..a8f0331bfc 100644 Binary files a/voice/ca/voice/stop.ogg and b/voice/ca/voice/stop.ogg differ diff --git a/voice/ca/voice/take.ogg b/voice/ca/voice/take.ogg index 26519b53c8..a55a2df3cc 100644 Binary files a/voice/ca/voice/take.ogg and b/voice/ca/voice/take.ogg differ diff --git a/voice/ca/voice/tenths_of_a_mile.ogg b/voice/ca/voice/tenths_of_a_mile.ogg index 2ea59ed0ca..9e4d71adc3 100644 Binary files a/voice/ca/voice/tenths_of_a_mile.ogg and b/voice/ca/voice/tenths_of_a_mile.ogg differ diff --git a/voice/ca/voice/the_exit.ogg b/voice/ca/voice/the_exit.ogg new file mode 100644 index 0000000000..df68f33d1c Binary files /dev/null and b/voice/ca/voice/the_exit.ogg differ diff --git a/voice/ca/voice/then.ogg b/voice/ca/voice/then.ogg index 3dcc0133aa..40f0c815f8 100644 Binary files a/voice/ca/voice/then.ogg and b/voice/ca/voice/then.ogg differ diff --git a/voice/ca/voice/time.ogg b/voice/ca/voice/time.ogg index 74d741fd63..fd5bac3456 100644 Binary files a/voice/ca/voice/time.ogg and b/voice/ca/voice/time.ogg differ diff --git a/voice/ca/voice/to.ogg b/voice/ca/voice/to.ogg index 9e41d89a4e..f11df152a6 100644 Binary files a/voice/ca/voice/to.ogg and b/voice/ca/voice/to.ogg differ diff --git a/voice/ca/voice/toll_booth.ogg b/voice/ca/voice/toll_booth.ogg index 18cfc09657..814b22e2e9 100644 Binary files a/voice/ca/voice/toll_booth.ogg and b/voice/ca/voice/toll_booth.ogg differ diff --git a/voice/ca/voice/toward.ogg b/voice/ca/voice/toward.ogg index 777ab62021..2cded6e298 100644 Binary files a/voice/ca/voice/toward.ogg and b/voice/ca/voice/toward.ogg differ diff --git a/voice/ca/voice/traffic_calming.ogg b/voice/ca/voice/traffic_calming.ogg index 154865f46d..c830ba8700 100644 Binary files a/voice/ca/voice/traffic_calming.ogg and b/voice/ca/voice/traffic_calming.ogg differ diff --git a/voice/ca/voice/tunnel.ogg b/voice/ca/voice/tunnel.ogg new file mode 100644 index 0000000000..94c699d4c8 Binary files /dev/null and b/voice/ca/voice/tunnel.ogg differ diff --git a/voice/ca/voice/yards.ogg b/voice/ca/voice/yards.ogg index c2ed6c48c1..947daa3eac 100644 Binary files a/voice/ca/voice/yards.ogg and b/voice/ca/voice/yards.ogg differ