Created
May 6, 2021 14:41
-
-
Save z-rui/81ff6da82b719ef796b492c5b5d4a8aa to your computer and use it in GitHub Desktop.
OsmAnd zh_tts: get rid of "tenths of a mile" and other fixes
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// IMPLEMENTED (X) or MISSING ( ) FEATURES, (N/A) if not needed in this language: | |
// | |
// (X) Basic navigation prompts: route (re)calculated (with distance and time support), turns, roundabouts, u-turns, straight/follow, arrival | |
// (X) Announce nearby point names (destination / intermediate / GPX waypoint / favorites / POI) | |
// (X) Attention prompts: SPEED_CAMERA; SPEED_LIMIT; BORDER_CONTROL; RAILWAY; TRAFFIC_CALMING; TOLL_BOOTH; STOP; PEDESTRIAN; MAXIMUM; TUNNEL | |
// (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) Support announcing highway exits | |
var metricConst; | |
var dictionary = {}; | |
var tts = true; | |
function populateDictionary(tts) { | |
} | |
//// COMMAND BUILDING / WORD ORDER | |
//////////////////////////////////////////////////////////////// | |
function setMetricConst(metrics) { | |
metricConst = metrics; | |
} | |
function setMode(mode) { | |
tts = true; | |
} | |
function route_new_calc(dist, timeVal) { | |
return "行驶距离" + distance(dist) + ",预计用时" + time(timeVal) + "。"; | |
} | |
function dist_to_str(dist, scale_down, scale_up) { | |
return (Math.round(dist / scale_down) * scale_up).toString() | |
} | |
function distance(dist) { | |
const meters = "米"; | |
const kilometers = "千米"; | |
const feet = "英尺"; | |
const miles = "英里"; | |
const yards = "码"; | |
const around = "大约"; | |
const _ft = 0.3048; | |
const _mi = 1609.34; | |
const _yd = 0.9144; | |
switch (metricConst) { | |
case "km-m": | |
if (dist < 17) | |
return dist_to_str(dist, 1.0, 1) + meters; | |
if (dist < 100) | |
return dist_to_str(dist, 10., 10) + meters; | |
if (dist < 1000) | |
return dist_to_str(dist, 50., 50) + meters; | |
if (dist < 1500) | |
return around + "1" + kilometers; | |
if (dist < 10000) | |
return around + dist_to_str(dist, 1000., 1) + kilometers; | |
return dist_to_str(dist, 1000., 1) + kilometers; | |
case "mi-f": | |
if (dist < 17 * _ft) | |
return dist_to_str(dist, 1.0*_ft, 1) + feet; | |
if (dist < 100 * _ft) | |
return dist_to_str(dist, 10.*_ft, 10) + feet; | |
if (dist < 1000 * _ft) | |
return dist_to_str(dist, 50.*_ft, 50) + feet; | |
if (dist < .4 * _mi) | |
return "1/4" + miles; | |
if (dist < .6 * _mi) | |
return "1/2" + miles; | |
if (dist < .8 * _mi) | |
return "3/4" + miles; | |
if (dist < 1.5 * _mi) | |
return around + "1" + miles; | |
if (dist < 10 * _mi) | |
return around + dist_to_str(dist, _mi, 1) + miles; | |
return dist_to_str(dist, _mi, 1) + miles; | |
case "mi-m": | |
if (dist < 17) | |
return dist_to_str(dist, 1.0, 1) + meters; | |
if (dist < 100) | |
return dist_to_str(dist, 10., 10) + meters; | |
if (dist < 1000) | |
return dist_to_str(dist, 50., 50) + meters; | |
if (dist < .8 * _mi) | |
return "3/4" + miles; | |
if (dist < 1.5 * _mi) | |
return around + "1" + miles; | |
if (dist < 10 * _mi) | |
return around + dist_to_str(dist, _mi, 1) + miles; | |
return dist_to_str(dist, _mi, 1) + miles; | |
case "mi-y": | |
if (dist < 17) | |
return dist_to_str(dist, _yd, 1) + yards; | |
if (dist < 100) | |
return dist_to_str(dist, 10*_yd, 10) + yards; | |
if (dist < 1300) | |
return dist_to_str(dist, 50*_yd, 50) + yards; | |
if (dist < 10 * _mi) | |
return around + dist_to_str(dist, _mi, 1) + miles; | |
return dist_to_str(dist, _mi, 1) + miles; | |
} | |
} | |
function time(seconds) { | |
var minutes = Math.round(seconds/60.0); | |
if (seconds < 30) | |
return "小于1分钟"; | |
if (minutes % 60 == 0) | |
return hours(minutes); | |
return hours(minutes) + (minutes % 60) + "分钟"; | |
} | |
function hours(minutes) { | |
if (minutes < 60) | |
return ""; | |
var hours = Math.floor(minutes / 60); | |
return hours.toString() + "小时"; | |
} | |
function route_recalc(dist, seconds) { | |
return "路线重新计算," + route_new_calc(dist, seconds); | |
} | |
function go_ahead(dist, streetName) { | |
var s = "向前行驶"; | |
if (dist != -1) | |
s += distance(dist) + "," + follow_street(streetName); | |
return s; | |
} | |
function towards(dest) { | |
return "前往" + dest; | |
} | |
function follow_street(streetName) { | |
var toDest = streetName["toDest"]; | |
var toStreetName = streetName["toStreetName"]; | |
var toRef = streetName["toRef"]; | |
if ((toDest === "" && toStreetName === "" && toRef === "") || Object.keys(streetName).length == 0) | |
return ""; | |
if (toStreetName === "" && toRef === "") | |
return towards(toDest); | |
var fromRef = streetName["fromRef"]; | |
var fromStreetName = streetName["fromStreetName"]; | |
if (toRef === fromRef && (toStreetName === fromStreetName || | |
toStreetName == "")) | |
return "在" + assemble_street_name(streetName); // on | |
return "到" + assemble_street_name(streetName); // to | |
} | |
function in_distance(dist, action) { | |
if (dist == -1) | |
return action; | |
return distance(dist) + "后," + action; | |
} | |
function turn(turnType, dist, streetName) { | |
return in_distance(dist, getTurnType(turnType) + turn_street(streetName)); | |
} | |
function take_exit(turnType, dist, exitString, exitInt, streetName) { | |
return in_distance(dist, | |
getTurnType(turnType) + "进入" + getExitNumber(exitString, exitInt) + take_exit_name(streetName)); | |
} | |
function take_exit_name(streetName) { | |
var toDest = streetName["toDest"]; | |
var toStreetName = streetName["toStreetName"]; | |
if (Object.keys(streetName).length == 0 || (toDest === "" && toStreetName === "")) | |
return ""; | |
if (toDest != "") | |
return "," + toStreetName + towards(streetName["toDest"]); | |
if (toStreetName != "") | |
return "," + toStreetName; | |
return ""; | |
} | |
function getExitNumber(exitString, exitInt) { | |
return exitString + " 出口"; | |
} | |
const _turnTypes = { | |
"left": "左转", | |
"left_sh": "向左急转", | |
"left_sl": "稍向左转", | |
"right": "右转", | |
"right_sh": "向右急转", | |
"right_sl": "稍向右转", | |
"left_keep": "靠左行驶", | |
"right_keep": "靠右行驶", | |
}; | |
function getTurnType(turnType) { | |
return _turnTypes[turnType]; | |
} | |
function then() { | |
return ",然后"; | |
} | |
function roundabout(dist, angle, exit, streetName) { | |
var s = "在第" + exit + "个出口驶出," + turn_street(streetName); | |
if (dist != -1) { | |
s = in_distance(dist, "进入环岛") + then() + s; | |
} | |
return s; | |
} | |
function turn_street(streetName) { | |
var toDest = streetName["toDest"]; | |
var toStreetName = streetName["toStreetName"]; | |
var toRef = streetName["toRef"]; | |
if ((toDest === "" && toStreetName === "" && toRef === "") || Object.keys(streetName).length == 0) | |
return ""; | |
if (toStreetName === "" && toRef === "") | |
return towards(toDest); | |
var fromRef = streetName["fromRef"]; | |
var fromStreetName = streetName["fromStreetName"]; | |
if (toRef === fromRef && (toStreetName === fromStreetName || | |
toStreetName === "")) | |
return "到" + assemble_street_name(streetName); // on | |
return "到" + assemble_street_name(streetName); // into | |
} | |
function assemble_street_name(streetName) { | |
var toDest = streetName["toDest"]; | |
var toStreetName = streetName["toStreetName"]; | |
var toRef = streetName["toRef"]; | |
if (toDest === "") | |
return toRef + " " + toStreetName; | |
if (toRef === "") | |
return toStreetName + towards(toDest); | |
return toRef + towards(toDest); | |
} | |
function make_ut(dist, streetName) { | |
return in_distance(dist, "调头," + turn_street(streetName)); | |
} | |
function bear_left(streetName) { | |
return "靠左"; | |
} | |
function bear_right(streetName) { | |
return "靠右"; | |
} | |
function after_distance(dist, action) { | |
return "继续行驶" + distance(dist) + ",然后" + action; | |
} | |
function prepare_make_ut(dist, streetName) { | |
return after_distance(dist, "调头," + turn_street(streetName)); | |
} | |
function prepare_turn(turnType, dist, streetName) { | |
return after_distance(dist, getTurnType(turnType) + turn_street(streetName)); | |
} | |
function prepare_roundabout(dist, exit, streetName) { | |
return after_distance(dist, "将进入环岛"); | |
} | |
function and_arrive_destination(dest) { | |
return "并到达终点 " + dest; | |
} | |
function and_arrive_intermediate(dest) { | |
return "并到达经停点 " + dest; | |
} | |
function and_arrive_waypoint(dest) { | |
return "并到达GPX航路点 " + dest; | |
} | |
function and_arrive_favorite(dest) { | |
return "并到达收藏点 " + dest; | |
} | |
function and_arrive_poi(dest) { | |
return "并到达兴趣点 " + dest; | |
} | |
function reached_destination(dest) { | |
return "已到达终点 " + dest; | |
} | |
function reached_waypoint(dest) { | |
return "已到达GPX航路点 " + dest; | |
} | |
function reached_intermediate(dest) { | |
return "已到达经停点 " + dest; | |
} | |
function reached_favorite(dest) { | |
return "已到达收藏点 " + dest; | |
} | |
function reached_poi(dest) { | |
return "已到达兴趣点 " + dest; | |
} | |
function location_lost() { | |
return "GPS信号丢失"; | |
} | |
function location_recovered() { | |
return "GPS信号已恢复"; | |
} | |
function off_route(dist) { | |
return "您已偏离路线 " + distance(dist); | |
} | |
function back_on_route() { | |
return "您已回到路线上"; | |
} | |
function make_ut_wp() { | |
return "条件允许时,调头"; | |
} | |
// // TRAFFIC WARNINGS | |
function speed_alarm(maxSpeed, speed) { | |
return "您已超速,限速" + maxSpeed.toString(); | |
} | |
function attention(type) { | |
return "注意," + getAttentionString(type); | |
} | |
const _attentionString = { | |
"SPEED_CAMERA": "测速拍照", | |
"SPEED_LIMIT": "", | |
"BORDER_CONTROL": "边境管理", | |
"RAILWAY": "铁路道口", | |
"TOLL_BOOTH": "收费站", | |
"TRAFFIC_CALMING": "减速带", | |
"STOP": "停止标志", | |
"PEDESTRIAN": "人行横道", | |
"MAXIMUM": "", | |
"TUNNEL": "隧道", | |
}; | |
function getAttentionString(type) { | |
return _attentionString[type] || ""; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment