Skip to content

Instantly share code, notes, and snippets.

@z-rui
Created May 6, 2021 14:41
Show Gist options
  • Save z-rui/81ff6da82b719ef796b492c5b5d4a8aa to your computer and use it in GitHub Desktop.
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
// 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