{"id":18687,"date":"2026-10-27T23:20:56","date_gmt":"2026-10-27T15:20:56","guid":{"rendered":"https:\/\/tiffanysmandarin.com\/?p=18687"},"modified":"2026-10-27T23:20:59","modified_gmt":"2026-10-27T15:20:59","slug":"for-cantonese-speakers","status":"publish","type":"post","link":"https:\/\/tiffanysmandarin.com\/index.php\/2026\/10\/27\/for-cantonese-speakers\/","title":{"rendered":"\u7cb5\u8a9e\u5b78\u751f\u5c08\u7528"},"content":{"rendered":"<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_89 ez-toc-wrap-left counter-hierarchy ez-toc-counter ez-toc-white ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Table of Contents<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 eztoc-toggle-hide-by-default' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/tiffanysmandarin.com\/index.php\/2026\/10\/27\/for-cantonese-speakers\/#%E7%94%A8%E7%B2%B5%E8%AA%9E%E8%81%B2%E8%AA%BF%E6%89%BE%E8%8F%AF%E8%AA%9E%E5%9B%9B%E8%81%B2\" >\u7528\u7cb5\u8a9e\u8072\u8abf\u627e\u83ef\u8a9e\u56db\u8072<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/tiffanysmandarin.com\/index.php\/2026\/10\/27\/for-cantonese-speakers\/#%E4%BA%8C%E8%81%B2%E8%88%87%E4%B8%89%E8%81%B2%E5%B0%8D%E6%AF%94\" >\u4e8c\u8072\u8207\u4e09\u8072\u5c0d\u6bd4<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/tiffanysmandarin.com\/index.php\/2026\/10\/27\/for-cantonese-speakers\/#%E8%AE%8A%E8%AA%BF%E8%A6%8F%E5%89%87\" >\u8b8a\u8abf\u898f\u5247<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/tiffanysmandarin.com\/index.php\/2026\/10\/27\/for-cantonese-speakers\/#%E7%B9%9E%E5%8F%A3%E4%BB%A4%E8%88%87%E9%8C%84%E9%9F%B3%E7%B7%B4%E7%BF%92\" >\u7e5e\u53e3\u4ee4\u8207\u9304\u97f3\u7df4\u7fd2<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/tiffanysmandarin.com\/index.php\/2026\/10\/27\/for-cantonese-speakers\/#_utitle\" >' + u.title + '<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/tiffanysmandarin.com\/index.php\/2026\/10\/27\/for-cantonese-speakers\/#%E8%80%B3%E5%8A%9B%E8%81%BD%E8%BE%A8%E6%B8%AC%E9%A9%97\" >\u8033\u529b\u807d\u8fa8\u6e2c\u9a57<\/a><\/li><\/ul><\/nav><\/div>\n\n<div style=\"height:3px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<!DOCTYPE html>\n<html lang=\"zh-Hant\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>\u7cb5\u8a9e\u6bcd\u8a9e\u8005\u83ef\u8a9e\u767c\u97f3\u8a13\u7df4 | OneDotDot Chinese<\/title>\n<\/head>\n<body>\n<!-- ===== \u5f9e\u9019\u88e1\u958b\u59cb\u8907\u88fd\u5230 WordPress\u300c\u81ea\u8a02 HTML\u300d\u5340\u584a ===== -->\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Fraunces:ital,wght@0,500;0,600;1,400;1,500&#038;family=IBM+Plex+Mono:wght@400;500&#038;family=Noto+Sans:wght@400;500&#038;family=Noto+Sans+TC:wght@400;500;700&#038;family=Noto+Serif+TC:wght@600;700&#038;display=swap\" rel=\"stylesheet\">\n<style>\n#oddy{\n  --ink:#22303C; --indigo:#2E4A62; --verm:#C1440E; --seal:#8B1E3F;\n  --line:#E3DFD6; --white:#FFFFFF; --cream:#FAF7F1; --brass:#B8933E;\n  --muted:#6B7178; --indigo-soft:#EEF2F5; --verm-soft:#FBF1EC;\n  font-family:'Noto Sans TC',sans-serif; color:var(--ink); background:var(--white);\n  max-width:980px; margin:0 auto; padding:0 16px 32px; line-height:1.65; font-size:15px;\n  box-sizing:border-box;\n}\n#oddy *{box-sizing:border-box;}\n#oddy h1,#oddy h2,#oddy h3,#oddy h4{font-family:'Noto Serif TC',serif; color:var(--ink); margin:0; line-height:1.35;}\n#oddy p{margin:0;}\n#oddy a{color:var(--indigo);}\n#oddy button{font-family:inherit; cursor:pointer; border:1px solid var(--line); background:var(--white) !important; color:var(--ink) !important; border-radius:4px; padding:6px 12px; font-size:14px; line-height:1.4; transition:background .15s,border-color .15s; text-transform:none; letter-spacing:0; box-shadow:none; margin:0;}\n#oddy button:hover{border-color:var(--indigo); background:var(--indigo-soft) !important;}\n#oddy .oy-pin{font-family:'Noto Sans',sans-serif; color:var(--muted); font-size:12.5px;}\n#oddy .oy-mono{font-family:'IBM Plex Mono',monospace; text-transform:uppercase; letter-spacing:.14em; font-size:10.5px; color:var(--brass);}\n\n\/* brand bar *\/\n#oddy .oy-brand{display:flex; justify-content:space-between; align-items:center; gap:12px; flex-wrap:wrap; padding:18px 0 14px; border-bottom:1px solid var(--line);}\n#oddy .oy-mark{display:flex; align-items:center; gap:10px; text-decoration:none;}\n#oddy .oy-seal{width:38px; height:38px; border-radius:50%; background:var(--verm); color:#fff; display:flex; align-items:center; justify-content:center; font-family:'Noto Serif TC',serif; font-weight:700; font-size:17px;}\n#oddy .oy-word{font-family:'Fraunces',serif; font-style:italic; font-size:20px; color:var(--indigo); line-height:1.1;}\n#oddy .oy-word small{display:block; font-family:'IBM Plex Mono',monospace; font-style:normal; font-size:9.5px; letter-spacing:.16em; text-transform:uppercase; color:var(--brass); margin-top:3px;}\n#oddy .oy-settings{display:flex; gap:10px; flex-wrap:wrap; align-items:center;}\n#oddy .oy-seg{display:inline-flex; border:1px solid var(--line); border-radius:4px; overflow:hidden;}\n#oddy .oy-seg button{border:0; border-radius:0; padding:5px 10px; font-size:12.5px;}\n#oddy .oy-seg button.on{background:var(--indigo) !important; color:#fff !important;}\n#oddy .oy-voice-note{display:none; margin-top:10px; padding:10px 12px; background:var(--verm-soft); border-left:3px solid var(--verm); font-size:13px;}\n#oddy .oy-voice-note.show{display:block;}\n\n\/* hero *\/\n#oddy .oy-hero{padding:34px 0 26px; text-align:center;}\n#oddy .oy-hero h1{font-size:30px; margin:10px 0 8px;}\n#oddy .oy-hero .oy-sub{font-family:'Fraunces',serif; font-style:italic; font-size:17px; color:var(--indigo);}\n#oddy .oy-hero .oy-lede{max-width:620px; margin:14px auto 0; color:#4A535C; font-size:14.5px;}\n#oddy .oy-steps{display:grid; grid-template-columns:repeat(3,1fr); gap:10px; max-width:640px; margin:22px auto 0;}\n#oddy .oy-step{border:1px solid var(--line); background:var(--cream); border-radius:6px; padding:12px 10px;}\n#oddy .oy-step b{display:block; font-family:'Fraunces',serif; font-style:italic; color:var(--verm); font-size:20px;}\n#oddy .oy-step span{font-size:13px;}\n\n\/* tabs *\/\n#oddy .oy-tabs{display:flex; gap:6px; flex-wrap:wrap; border-bottom:1px solid var(--line); padding-bottom:12px; margin-bottom:22px;}\n#oddy .oy-tabs button{border-radius:999px; padding:6px 14px;}\n#oddy .oy-tabs button.on{background:var(--indigo) !important; color:#fff !important; border-color:var(--indigo);}\n#oddy .oy-pane{display:none;}\n#oddy .oy-pane.on{display:block;}\n\n\/* index grid *\/\n#oddy .oy-index{display:grid; grid-template-columns:repeat(3,1fr); gap:10px;}\n#oddy .oy-idx{text-align:left; padding:14px !important; border-radius:6px !important; background:var(--cream) !important;}\n#oddy .oy-idx .n{font-family:'Fraunces',serif; font-style:italic; color:var(--verm); font-size:18px; display:block;}\n#oddy .oy-idx .t{font-family:'Noto Serif TC',serif; font-weight:700; font-size:15px; display:block;}\n#oddy .oy-idx .e{font-size:12px; color:var(--muted); display:block;}\n\n\/* unit *\/\n#oddy .oy-filter{display:flex; gap:6px; flex-wrap:wrap; margin-bottom:16px;}\n#oddy .oy-filter button{font-size:12.5px; padding:4px 10px;}\n#oddy .oy-filter button.on{background:var(--indigo) !important; color:#fff !important; border-color:var(--indigo);}\n#oddy .oy-unit{border:1px solid var(--line); background:var(--cream); border-radius:8px; padding:22px; margin-bottom:18px;}\n#oddy .oy-unit-hd{display:flex; gap:14px; align-items:center; border-bottom:1px solid var(--line); padding-bottom:12px; margin-bottom:14px;}\n#oddy .oy-badge{flex:0 0 46px; width:46px; height:46px; border-radius:50%; border:1.5px solid var(--verm); color:var(--verm); display:flex; align-items:center; justify-content:center; font-family:'Noto Serif TC',serif; font-weight:700; font-size:18px; background:var(--white);}\n#oddy .oy-unit-hd h2{font-size:20px;}\n#oddy .oy-trap{background:var(--white); border:1px solid var(--line); border-left:3px solid var(--verm); border-radius:4px; padding:12px 14px; margin-bottom:12px;}\n#oddy .oy-trap h4,#oddy .oy-tip h4{font-size:14px; margin-bottom:4px;}\n#oddy .oy-trap h4{color:var(--verm);}\n#oddy .oy-tip{background:var(--white); border:1px solid var(--line); border-left:3px solid var(--indigo); border-radius:4px; padding:12px 14px; margin-bottom:14px;}\n#oddy .oy-tip h4{color:var(--indigo);}\n#oddy .oy-trap p,#oddy .oy-tip p{font-size:14px;}\n#oddy .oy-maps{display:flex; flex-wrap:wrap; gap:6px; margin-top:10px;}\n#oddy .oy-map{display:inline-flex; align-items:baseline; gap:6px; padding:5px 10px !important;}\n#oddy .oy-map b{font-family:'Noto Serif TC',serif; font-size:17px;}\n#oddy .oy-map i{font-style:normal; font-family:'IBM Plex Mono',monospace; font-size:11.5px; color:var(--verm);}\n#oddy .oy-map em{font-style:normal; color:var(--muted); font-size:12px;}\n#oddy .oy-map u{text-decoration:none; font-family:'Noto Sans',sans-serif; font-size:13px; color:var(--indigo); font-weight:500;}\n#oddy .oy-glabel{font-family:'IBM Plex Mono',monospace; font-size:11px; letter-spacing:.12em; text-transform:uppercase; color:var(--brass); margin:16px 0 8px;}\n#oddy .oy-glabel span{font-family:'Noto Sans TC',sans-serif; letter-spacing:0; text-transform:none; color:var(--ink); font-size:13.5px; font-weight:700; margin-left:6px;}\n#oddy .oy-sets{display:grid; grid-template-columns:repeat(auto-fill,minmax(220px,1fr)); gap:8px;}\n#oddy .oy-set{display:flex; align-items:center; gap:6px; background:var(--white); border:1px solid var(--line); border-radius:6px; padding:8px;}\n#oddy .oy-set .oy-tile{flex:1; text-align:center; padding:6px 4px !important; border-color:transparent;}\n#oddy .oy-tile b{display:block; font-family:'Noto Serif TC',serif; font-size:20px; font-weight:600;}\n#oddy .oy-set .vs{color:var(--muted); font-size:11px; font-family:'IBM Plex Mono',monospace;}\n#oddy .oy-set .oy-both{flex:0 0 auto; font-size:11.5px; padding:4px 7px !important; color:var(--indigo) !important;}\n#oddy .oy-words{display:flex; flex-wrap:wrap; gap:6px;}\n#oddy .oy-word-chip{text-align:center; padding:6px 12px !important;}\n#oddy .oy-word-chip b{display:block; font-family:'Noto Serif TC',serif; font-size:17px; font-weight:600;}\n#oddy .oy-sent{display:flex; justify-content:space-between; align-items:center; gap:10px; background:var(--white); border:1px solid var(--line); border-radius:6px; padding:10px 12px; margin-bottom:6px;}\n#oddy .oy-sent .zh{font-family:'Noto Serif TC',serif; font-size:17px; font-weight:600; display:block;}\n#oddy .oy-play{flex:0 0 auto; background:var(--indigo) !important; color:#fff !important; border-color:var(--indigo) !important; border-radius:999px !important; padding:5px 14px !important; font-size:13px !important;}\n#oddy .oy-play:hover{opacity:.88;}\n#oddy .oy-tgroups{display:grid; grid-template-columns:repeat(2,1fr); gap:10px;}\n#oddy .oy-tg{background:var(--white); border:1px solid var(--line); border-radius:6px; padding:10px 12px;}\n#oddy .oy-tg h5{margin:0 0 6px; font-size:13.5px; font-family:'Noto Sans TC',sans-serif; color:var(--indigo);}\n\n\n\/* tongue diagram *\/\n#oddy .oy-dg{background:var(--white); border:1px solid var(--line); border-radius:6px; padding:14px; margin-bottom:14px;}\n#oddy .oy-dg-hd{font-family:'Noto Serif TC',serif; font-weight:700; color:var(--indigo); font-size:14.5px; margin-bottom:10px;}\n#oddy .oy-dg-hd span{font-family:'Noto Sans TC',sans-serif; font-weight:400; color:var(--muted); font-size:12.5px; margin-left:6px;}\n#oddy .oy-dg-body{display:flex; gap:16px; align-items:flex-start;}\n#oddy .oy-dg canvas{flex:0 0 auto; width:380px; max-width:100%; height:auto; aspect-ratio:380\/300; border:1px solid var(--line); border-radius:4px; background:#FFFFFF; display:block;}\n#oddy .oy-dg-side{flex:1; min-width:0;}\n#oddy .oy-dg-row{display:flex; align-items:center; gap:6px; margin-bottom:6px; flex-wrap:wrap;}\n#oddy .oy-dg-row .lb{font-family:'IBM Plex Mono',monospace; font-size:10.5px; letter-spacing:.1em; color:var(--brass); width:54px;}\n#oddy .oy-dg-row button{min-width:62px; text-align:center; padding:5px 8px !important;}\n#oddy .oy-dg-row button b{display:block; font-family:'Noto Serif TC',serif; font-size:17px; font-weight:600;}\n#oddy .oy-dg-row button.on{background:var(--indigo) !important; color:#fff !important; border-color:var(--indigo) !important;}\n#oddy .oy-dg-row button.on .oy-pin{color:#E3E9EE !important;}\n#oddy .oy-dg-step{margin-top:10px; min-height:24px; font-size:14px; font-weight:700; color:var(--verm);}\n#oddy .oy-dg-desc{font-size:13.5px; color:#3E4852; margin-top:4px;}\n#oddy .oy-dg-key{display:flex; gap:12px; flex-wrap:wrap; font-size:11.5px; color:var(--muted); margin-top:10px;}\n#oddy .oy-dg-key i{display:inline-block; width:10px; height:10px; border-radius:50%; margin-right:4px; vertical-align:-1px;}\n\n\/* tones *\/\n#oddy .oy-card{border:1px solid var(--line); background:var(--cream); border-radius:8px; padding:22px; margin-bottom:18px;}\n#oddy .oy-card > h2{font-size:20px; margin-bottom:4px;}\n#oddy .oy-card > .oy-note{font-size:13.5px; color:#4A535C; margin-bottom:14px;}\n#oddy .oy-tones{display:grid; grid-template-columns:repeat(4,1fr); gap:8px;}\n#oddy .oy-tone{background:var(--white); border:1px solid var(--line); border-radius:6px; padding:12px; text-align:center;}\n#oddy .oy-tone .tn{font-family:'Fraunces',serif; font-style:italic; color:var(--verm); font-size:15px;}\n#oddy .oy-tone .shape{font-family:'IBM Plex Mono',monospace; font-size:22px; color:var(--indigo); letter-spacing:.05em; margin:4px 0;}\n#oddy .oy-tone .yue{font-size:12.5px; color:#4A535C; min-height:38px;}\n#oddy .oy-tone .yue b{color:var(--verm); font-weight:500;}\n#oddy .oy-tone button{margin-top:8px; width:100%;}\n#oddy .oy-warn{margin-top:12px; font-size:13px; background:var(--white); border:1px dashed var(--brass); padding:10px 12px; border-radius:4px;}\n#oddy .oy-rule{background:var(--white); border:1px solid var(--line); border-radius:6px; padding:12px 14px; margin-bottom:8px;}\n#oddy .oy-rule h4{font-size:14.5px; margin-bottom:6px; color:var(--indigo);}\n#oddy .oy-sandhi{display:inline-flex; flex-direction:column; align-items:center; padding:6px 12px !important;}\n#oddy .oy-sandhi b{font-family:'Noto Serif TC',serif; font-size:17px; font-weight:600;}\n#oddy .oy-sandhi s{color:#A9AEB3; font-size:11.5px; font-family:'Noto Sans',sans-serif;}\n#oddy .oy-sandhi .now{color:var(--verm); font-size:13px; font-family:'Noto Sans',sans-serif; font-weight:500;}\n\n\/* quiz *\/\n#oddy .oy-quiz{max-width:620px; margin:0 auto;}\n#oddy .oy-qcats{display:flex; flex-wrap:wrap; gap:6px; justify-content:center; margin:14px 0;}\n#oddy .oy-qcats button{font-size:12.5px; padding:4px 10px;}\n#oddy .oy-qcats button.on{background:var(--indigo) !important; color:#fff !important; border-color:var(--indigo);}\n#oddy .oy-qtop{display:flex; justify-content:space-between; align-items:center; margin-bottom:12px; font-size:13px;}\n#oddy .oy-qbar{height:4px; background:var(--line); border-radius:2px; overflow:hidden; margin-bottom:16px;}\n#oddy .oy-qbar i{display:block; height:100%; background:var(--verm);}\n#oddy .oy-big{width:76px; height:76px; border-radius:50% !important; background:var(--indigo) !important; color:#fff !important; font-size:28px !important; border:0 !important; display:block; margin:6px auto 8px;}\n#oddy .oy-qopts{display:grid; grid-template-columns:repeat(2,1fr); gap:8px; margin-top:16px;}\n#oddy .oy-qopt{padding:12px !important; border-radius:6px !important;}\n#oddy .oy-qopt b{display:block; font-family:'Noto Serif TC',serif; font-size:22px; font-weight:600;}\n#oddy .oy-qopt.ok{background:#E7F0EA !important; border-color:#4F7A5E !important;}\n#oddy .oy-qopt.bad{background:var(--verm-soft) !important; border-color:var(--verm) !important;}\n#oddy .oy-qfb{margin-top:14px; padding:12px; border-radius:6px; font-size:14px; text-align:center;}\n#oddy .oy-qfb.ok{background:#E7F0EA; color:#2F5A3E;}\n#oddy .oy-qfb.bad{background:var(--verm-soft); color:#8A2F0A;}\n#oddy .oy-center{text-align:center;}\n#oddy .oy-primary{background:var(--verm) !important; color:#fff !important; border-color:var(--verm) !important; padding:8px 22px !important; border-radius:999px !important;}\n\n\/* twisters *\/\n#oddy .oy-tws{display:grid; grid-template-columns:repeat(2,1fr); gap:12px;}\n#oddy .oy-tw{background:var(--white); border:1px solid var(--line); border-radius:8px; padding:16px; display:flex; flex-direction:column; gap:8px;}\n#oddy .oy-tw h3{font-size:17px;}\n#oddy .oy-tw .zh{font-family:'Noto Serif TC',serif; font-size:16px; line-height:1.8;}\n#oddy .oy-tw-btns{display:flex; gap:6px; flex-wrap:wrap; margin-top:auto;}\n#oddy .oy-tw-btns button{font-size:12.5px; padding:5px 10px;}\n#oddy .oy-rec.recording{background:var(--verm) !important; color:#fff !important; border-color:var(--verm) !important;}\n#oddy .oy-tw audio{width:100%; height:36px; display:none;}\n#oddy .oy-tw audio.show{display:block;}\n#oddy .oy-dl{display:none; font-size:12.5px;}\n#oddy .oy-dl.show{display:inline;}\n#oddy .oy-line{margin-top:16px; text-align:center; font-size:14px; background:var(--white); border:1px solid var(--line); border-left:3px solid var(--brass); padding:12px; border-radius:4px;}\n\n\/* footer *\/\n#oddy .oy-foot{margin-top:34px; padding-top:18px; border-top:1px solid var(--line); text-align:center;}\n#oddy .oy-foot .w{font-family:'Fraunces',serif; font-style:italic; color:var(--indigo); font-size:17px;}\n#oddy .oy-foot p{font-size:12.5px; color:var(--muted); margin-top:4px;}\n#oddy .oy-back{display:inline-block; margin-top:10px; font-family:'IBM Plex Mono',monospace; font-size:11px; letter-spacing:.12em; text-transform:uppercase; text-decoration:none; border:1px solid var(--indigo); color:var(--indigo) !important; padding:6px 14px; border-radius:2px;}\n#oddy .oy-back:hover{background:var(--indigo); color:#fff !important;}\n\n@media (max-width:700px){\n  #oddy .oy-dg-body{flex-direction:column;}\n  #oddy .oy-dg canvas{width:100%;}\n  #oddy{padding:0 5px 24px; font-size:14.5px;}\n  #oddy .oy-hero h1{font-size:24px;}\n  #oddy .oy-steps{grid-template-columns:1fr;}\n  #oddy .oy-index{grid-template-columns:repeat(2,1fr);}\n  #oddy .oy-unit,#oddy .oy-card{padding:12px;}\n  #oddy .oy-tones{grid-template-columns:repeat(2,1fr);}\n  #oddy .oy-tgroups,#oddy .oy-tws{grid-template-columns:1fr;}\n  #oddy .oy-sent{flex-direction:column; align-items:flex-start;}\n  #oddy .oy-brand{justify-content:center;}\n}\n<\/style>\n\n<div id=\"oddy\">\n\n  <div class=\"oy-brand\">\n    <a class=\"oy-mark\" href=\"https:\/\/www.tiffanysmandarin.com\/\">\n      <span class=\"oy-seal\">\u9ede<\/span>\n      <span class=\"oy-word\">OneDotDot Chinese<small>by Tiffany Huang<\/small><\/span>\n    <\/a>\n    <div class=\"oy-settings\">\n      <div class=\"oy-seg\" aria-label=\"\u8a9e\u901f\">\n        <button data-act=\"rate\" data-v=\"0.6\">\u6162\u901f<\/button>\n        <button class=\"on\" data-act=\"rate\" data-v=\"0.85\">\u6b63\u5e38<\/button>\n      <\/div>\n    <\/div>\n  <\/div>\n  <div class=\"oy-voice-note\" id=\"oy-voice-note\">\n    \u4f60\u7684\u88dd\u7f6e\u76ee\u524d\u627e\u4e0d\u5230<strong>\u83ef\u8a9e\u8a9e\u97f3<\/strong>\uff0c\u53ef\u80fd\u6703\u7528\u7cb5\u8a9e\u6216\u5176\u4ed6\u8a9e\u97f3\u6717\u8b80\u3002\u8acb\u5230\u624b\u6a5f\u6216\u96fb\u8166\u7684\u300c\u8a2d\u5b9a \u2192 \u8a9e\u8a00\uff0f\u6587\u5b57\u8f49\u8a9e\u97f3\u300d\u52a0\u5165\u300c\u4e2d\u6587\uff08\u53f0\u7063\uff09\u300d\u8a9e\u97f3\u5f8c\u91cd\u65b0\u6574\u7406\u9801\u9762\u3002\n  <\/div>\n\n  <div class=\"oy-hero\">\n    <div class=\"oy-mono\">Pronunciation Lab \u00b7 For Cantonese Speakers<\/div>\n    <h1>\u7cb5\u8a9e\u6bcd\u8a9e\u8005\u7684\u83ef\u8a9e\u767c\u97f3\u8a13\u7df4<\/h1>\n    <div class=\"oy-sub\">From Cantonese to Mandarin \u2014 fix the sounds you were never taught to hear.<\/div>\n    <div class=\"oy-steps\">\n      <div class=\"oy-step\"><b>1<\/b><span>\u770b\u300c\u7cb5\u8a9e\u9677\u9631\u300d\uff0c\u627e\u51fa\u81ea\u5df1\u7684\u7fd2\u6163<\/span><\/div>\n      <div class=\"oy-step\"><b>2<\/b><span>\u9ede\u64ca\u5b57\u8a5e\u807d\u6a19\u6e96\u97f3\uff0c\u505a\u5c0d\u6bd4\u7df4\u7fd2<\/span><\/div>\n      <div class=\"oy-step\"><b>3<\/b><span>\u807d\u8fa8\u6e2c\u9a57\uff0b\u9304\u97f3\uff0c\u50b3\u7d66\u8001\u5e2b<\/span><\/div>\n    <\/div>\n  <\/div>\n\n  <div class=\"oy-tabs\">\n    <button class=\"on\" data-tab=\"home\">\u8ab2\u7a0b\u5c0e\u89bd<\/button>\n    <button data-tab=\"units\">\u4e5d\u5927\u767c\u97f3\u55ae\u5143<\/button>\n    <button data-tab=\"tones\">\u8072\u8abf\u8207\u8b8a\u8abf<\/button>\n    <button data-tab=\"quiz\">\u807d\u8fa8\u6e2c\u9a57<\/button>\n    <button data-tab=\"twister\">\u7e5e\u53e3\u4ee4\u9304\u97f3<\/button>\n  <\/div>\n\n  <!-- HOME -->\n  <div class=\"oy-pane on\" id=\"oy-pane-home\">\n    <div class=\"oy-index\" id=\"oy-index\"><\/div>\n    <div class=\"oy-warn\" style=\"margin-top:16px;\">\n      <strong>\u5c0f\u63d0\u793a\uff1a<\/strong>\u7d05\u8272\u7684 <span style=\"font-family:'IBM Plex Mono',monospace;color:#C1440E;\">jat1<\/span> \u662f\u7cb5\u8a9e\u62fc\u97f3\uff08\u7cb5\u62fc\uff09\uff0c\u85cd\u8272\u7684 <span style=\"color:#2E4A62;font-weight:500;\">y\u012b<\/span> \u662f\u83ef\u8a9e\u62fc\u97f3\u3002\u6240\u6709\u5b57\u8a5e\u90fd\u53ef\u4ee5\u9ede\u64ca\u8046\u807d\uff1b\u53f3\u4e0a\u89d2\u53ef\u5207\u63db\u8a9e\u901f\u3002\n    <\/div>\n  <\/div>\n\n  <!-- UNITS -->\n  <div class=\"oy-pane\" id=\"oy-pane-units\">\n    <div class=\"oy-filter\" id=\"oy-filter\"><\/div>\n    <div id=\"oy-units\"><\/div>\n  <\/div>\n\n  <!-- TONES -->\n  <div class=\"oy-pane\" id=\"oy-pane-tones\">\n    <div class=\"oy-card\">\n      <div class=\"oy-mono\">Tone shapes<\/div>\n      <h2><span class=\"ez-toc-section\" id=\"%E7%94%A8%E7%B2%B5%E8%AA%9E%E8%81%B2%E8%AA%BF%E6%89%BE%E8%8F%AF%E8%AA%9E%E5%9B%9B%E8%81%B2\"><\/span>\u7528\u7cb5\u8a9e\u8072\u8abf\u627e\u83ef\u8a9e\u56db\u8072<span class=\"ez-toc-section-end\"><\/span><\/h2>\n      <p class=\"oy-note\">\u7cb5\u8a9e\u6709\u516d\u500b\u8072\u8abf\uff0c\u5176\u4e2d\u4e09\u500b\u7684\u300c\u97f3\u9ad8\u8d70\u5411\u300d\u548c\u83ef\u8a9e\u5f88\u63a5\u8fd1\u3002\u5148\u7528\u4f60\u719f\u6089\u7684\u7cb5\u8a9e\u97f3\u9ad8\u627e\u5230\u611f\u89ba\uff0c\u518d\u7df4\u552f\u4e00\u7684\u65b0\u8072\u8abf\u2014\u2014\u7b2c\u56db\u8072\u3002<\/p>\n      <div class=\"oy-tones\">\n        <div class=\"oy-tone\"><div class=\"tn\">\u7b2c\u4e00\u8072<\/div><div class=\"shape\">5 \u2192 5<\/div><div class=\"yue\">\u9ad8\u5e73\uff0c\u50cf\u7cb5\u8a9e<br>\u300c\u8a69 <b>si1<\/b>\u300d<\/div><button data-say=\"\u8a69\">\u8a69 sh\u012b \u25b6<\/button><\/div>\n        <div class=\"oy-tone\"><div class=\"tn\">\u7b2c\u4e8c\u8072<\/div><div class=\"shape\">3 \u2197 5<\/div><div class=\"yue\">\u4e0a\u63da\uff0c\u50cf\u7cb5\u8a9e<br>\u300c\u53f2 <b>si2<\/b>\u300d<\/div><button data-say=\"\u6642\">\u6642 sh\u00ed \u25b6<\/button><\/div>\n        <div class=\"oy-tone\"><div class=\"tn\">\u7b2c\u4e09\u8072<\/div><div class=\"shape\">2 \u2198 1<\/div><div class=\"yue\">\u4f4e\u6c89\uff08\u534a\u4e09\u8072\uff09\uff0c\u50cf\u7cb5\u8a9e<br>\u300c\u6642 <b>si4<\/b>\u300d<\/div><button data-say=\"\u53f2\">\u53f2 sh\u01d0 \u25b6<\/button><\/div>\n        <div class=\"oy-tone\"><div class=\"tn\">\u7b2c\u56db\u8072<\/div><div class=\"shape\">5 \u2198 1<\/div><div class=\"yue\">\u5f9e\u6700\u9ad8\u76f4\u843d\u5230\u6700\u4f4e<br><b>\u7cb5\u8a9e\u6c92\u6709<\/b>\uff0c\u8981\u591a\u7df4<\/div><button data-say=\"\u662f\">\u662f sh\u00ec \u25b6<\/button><\/div>\n      <\/div>\n      <div class=\"oy-warn\">\n        <strong>\u6ce8\u610f\uff1a<\/strong>\u9019\u662f\u300c\u97f3\u9ad8\u8d70\u5411\u300d\u7684\u5c0d\u7167\uff0c\u4e0d\u662f\u300c\u5b57\u300d\u7684\u5c0d\u7167\u3002\u7cb5\u8a9e\u300c\u6642 si4\u300d\u662f\u4f4e\u97f3\uff0c\u4f46\u83ef\u8a9e\u300c\u6642 sh\u00ed\u300d\u537b\u662f\u7b2c\u4e8c\u8072\u4e0a\u63da\u3002\u4e0d\u8981\u7528\u7cb5\u8a9e\u7684\u5b57\u8abf\u53bb\u63a8\u83ef\u8a9e\u7684\u5b57\u8abf\uff0c\u8981\u4e00\u500b\u4e00\u500b\u8a18\u3002\n      <\/div>\n    <\/div>\n\n    <div class=\"oy-card\">\n      <div class=\"oy-mono\">Tone 2 vs Tone 3<\/div>\n      <h2><span class=\"ez-toc-section\" id=\"%E4%BA%8C%E8%81%B2%E8%88%87%E4%B8%89%E8%81%B2%E5%B0%8D%E6%AF%94\"><\/span>\u4e8c\u8072\u8207\u4e09\u8072\u5c0d\u6bd4<span class=\"ez-toc-section-end\"><\/span><\/h2>\n      <p class=\"oy-note\">\u7cb5\u8a9e\u5b78\u7fd2\u8005\u6700\u5e38\u628a\u7b2c\u4e09\u8072\u8b80\u6210\u7b2c\u4e8c\u8072\uff08\u90fd\u5f80\u4e0a\u63da\uff09\u3002\u7b2c\u4e09\u8072\u5728\u53e5\u4e2d\u8981<strong>\u58d3\u4f4e<\/strong>\uff0c\u4e0d\u8981\u63da\u4e0a\u53bb\u3002<\/p>\n      <div class=\"oy-sets\" id=\"oy-t23\"><\/div>\n    <\/div>\n\n    <div class=\"oy-card\">\n      <div class=\"oy-mono\">Tone sandhi<\/div>\n      <h2><span class=\"ez-toc-section\" id=\"%E8%AE%8A%E8%AA%BF%E8%A6%8F%E5%89%87\"><\/span>\u8b8a\u8abf\u898f\u5247<span class=\"ez-toc-section-end\"><\/span><\/h2>\n      <p class=\"oy-note\">\u7cb5\u8a9e\u6c92\u6709\u8b8a\u8abf\uff0c\u6240\u4ee5\u7cb5\u8a9e\u5b78\u7fd2\u8005\u5e38\u5e38\u6bcf\u500b\u5b57\u90fd\u7167\u539f\u8abf\u8b80\u3002\u83ef\u8a9e\u6709\u4e09\u500b\u4e00\u5b9a\u8981\u6703\u7684\u8b8a\u8abf\u898f\u5247\u3002<\/p>\n      <div id=\"oy-sandhi\"><\/div>\n    <\/div>\n  <\/div>\n\n  <!-- QUIZ -->\n  <div class=\"oy-pane\" id=\"oy-pane-quiz\">\n    <div class=\"oy-card oy-quiz\" id=\"oy-quiz\"><\/div>\n  <\/div>\n\n  <!-- TWISTERS -->\n  <div class=\"oy-pane\" id=\"oy-pane-twister\">\n    <div class=\"oy-card\">\n      <div class=\"oy-mono\">Tongue twisters \u00b7 Record yourself<\/div>\n      <h2><span class=\"ez-toc-section\" id=\"%E7%B9%9E%E5%8F%A3%E4%BB%A4%E8%88%87%E9%8C%84%E9%9F%B3%E7%B7%B4%E7%BF%92\"><\/span>\u7e5e\u53e3\u4ee4\u8207\u9304\u97f3\u7df4\u7fd2<span class=\"ez-toc-section-end\"><\/span><\/h2>\n      <p class=\"oy-note\">\u5148\u807d\u6a19\u6e96\u97f3\uff0c\u518d\u6309\u300c\u9304\u97f3\u300d\u8b80\u4e00\u6b21\uff0c\u64ad\u653e\u81ea\u5df1\u7684\u9304\u97f3\u548c\u6a19\u6e96\u97f3\u5c0d\u6bd4\u3002\u6eff\u610f\u5f8c\u4e0b\u8f09\u9304\u97f3\u6a94\uff0c\u7528 LINE \u50b3\u7d66\u8001\u5e2b\u3002<\/p>\n      <div class=\"oy-tws\" id=\"oy-tws\"><\/div>\n      <div class=\"oy-line\">\ud83d\udcf1 \u5b8c\u6210\u5f8c\u8acb\u628a\u9304\u97f3\u7528 <strong>LINE<\/strong> \u50b3\u7d66 Tiffany \u8001\u5e2b\uff0c\u8001\u5e2b\u6703\u9010\u53e5\u56de\u994b\u4f60\u7684\u767c\u97f3\u3002<\/div>\n    <\/div>\n  <\/div>\n\n  <div class=\"oy-foot\">\n    <div class=\"w\">OneDotDot Chinese<\/div>\n    <p>Written &amp; designed by Tiffany Huang \u00b7 <a href=\"https:\/\/www.tiffanysmandarin.com\/\">www.tiffanysmandarin.com<\/a><\/p>\n    <p>\u00a9 2026 OneDotDot Chinese. All rights reserved.<\/p>\n    <a class=\"oy-back\" href=\"https:\/\/www.tiffanysmandarin.com\/index.php\/tools\/\">\u2190 More learning tools<\/a>\n  <\/div>\n<\/div>\n\n<script>\n(function(){\n  var root = document.getElementById('oddy');\n  if (!root) { return; }\n\n  \/* ---------- \u55ae\u5143\u8cc7\u6599\uff08\u53ef\u76f4\u63a5\u4fee\u6539\uff09 ---------- *\/\n  var UNITS = [\n    { id:'u1', no:'\u4e00', dg:'zhi', title:'\u6372\u820c\u97f3 zh \u00b7 ch \u00b7 sh', en:'Retroflex initials',\n      trap:'\u7cb5\u8a9e\u88e1\u300c\u77e5\u300d\u548c\u300c\u8cc7\u300d\u540c\u97f3\uff08\u90fd\u662f zi1\uff09\uff0c\u300c\u8a69\u300d\u548c\u300c\u7d72\u300d\u540c\u97f3\uff08\u90fd\u662f si1\uff09\uff0c\u6240\u4ee5\u7cb5\u8a9e\u6bcd\u8a9e\u8005\u5f88\u96e3\u807d\u51fa\u3001\u4e5f\u5f88\u96e3\u767c\u51fa\u6372\u820c\u97f3\u3002\u83ef\u8a9e\u537b\u8981\u5206\u6210\u4e09\u7d44\uff1aj q x\u3001zh ch sh\u3001z c s\u3002',\n      maps:[['\u77e5','zi1','zh\u012b'],['\u8cc7','zi1','z\u012b'],['\u8a69','si1','sh\u012b'],['\u7d72','si1','s\u012b'],['\u66f8','syu1','sh\u016b'],['\u8607','sou1','s\u016b']],\n      tip:'\u820c\u5c16\u5f80\u4e0a\u7ff9\uff0c\u62b5\u4f4f\u4e0a\u7259\u9f66\u5f8c\u9762\u518d\u5f80\u5f8c\u4e00\u9ede\u7684\u4f4d\u7f6e\uff08\u786c\u984e\u524d\u90e8\uff09\uff0c\u5634\u5507\u4e0d\u8981\u5713\u3002zh \u4e0d\u9001\u6c23\u3001ch \u9001\u6c23\u3001sh \u820c\u5c16\u4e0d\u78b0\u5230\u3001\u7559\u4e00\u689d\u7e2b\u8b93\u6c23\u51fa\u4f86\u3002',\n      groups:[\n        {label:'Three-way', cn:'\u4e09\u7d44\u5c0d\u6bd4\uff1aj \uff5c zh \uff5c z', type:'sets', items:[\n          [['\u96de','j\u012b'],['\u77e5','zh\u012b'],['\u8cc7','z\u012b']], [['\u4e03','q\u012b'],['\u5403','ch\u012b'],['\u96cc','c\u012b']],\n          [['\u897f','x\u012b'],['\u8a69','sh\u012b'],['\u7d72','s\u012b']], [['\u5c0f','xi\u01ceo'],['\u5c11','sh\u01ceo'],['\u6383','s\u01ceo']] ]},\n        {label:'Pairs', cn:'\u6372\u820c vs \u5e73\u820c', type:'sets', items:[\n          [['\u4e3b','zh\u01d4'],['\u7d44','z\u01d4']], [['\u627e','zh\u01ceo'],['\u65e9','z\u01ceo']], [['\u5435','ch\u01ceo'],['\u8349','c\u01ceo']],\n          [['\u5c71','sh\u0101n'],['\u4e09','s\u0101n']], [['\u8a69\u4eba','sh\u012br\u00e9n'],['\u79c1\u4eba','s\u012br\u00e9n']], [['\u9b5a\u7fc5','y\u00fach\u00ec'],['\u9b5a\u523a','y\u00fac\u00ec']] ]},\n        {label:'Words', cn:'\u8a5e\u8a9e', type:'words', items:[\n          ['\u8001\u5e2b','l\u01ceosh\u012b'],['\u4e8b\u5be6','sh\u00ecsh\u00ed'],['\u652f\u6301','zh\u012bch\u00ed'],['\u5403\u98ef','ch\u012bf\u00e0n'],['\u8aaa\u8a71','shu\u014dhu\u00e0'],['\u57ce\u5e02','ch\u00e9ngsh\u00ec'],\n          ['\u77e5\u8b58','zh\u012bsh\u00ec'],['\u6ce8\u610f','zh\u00f9y\u00ec'],['\u51fa\u5dee','ch\u016bch\u0101i'],['\u5546\u5834','sh\u0101ngch\u01ceng'],['\u5341\u56db','sh\u00eds\u00ec'],['\u56db\u5341','s\u00ecsh\u00ed'] ]},\n        {label:'Sentences', cn:'\u53e5\u5b50', type:'sents', items:[\n          ['\u8001\u5e2b\u8aaa\u4eca\u5929\u662f\u661f\u671f\u56db\u3002','L\u01ceosh\u012b shu\u014d j\u012bnti\u0101n sh\u00ec x\u012bngq\u00eds\u00ec.'],\n          ['\u6211\u77e5\u9053\u9019\u662f\u4e8b\u5be6\u3002','W\u01d2 zh\u012bd\u00e0o zh\u00e8 sh\u00ec sh\u00ecsh\u00ed.'],\n          ['\u4ed6\u5728\u4e0a\u6d77\u5403\u4e86\u5341\u56db\u500b\u5305\u5b50\u3002','T\u0101 z\u00e0i Sh\u00e0ngh\u01cei ch\u012ble sh\u00eds\u00ec ge b\u0101ozi.'] ]}\n      ]},\n    { id:'u2', no:'\u4e8c', dg:'ji', title:'j \u00b7 q \u00b7 x \u4e0d\u662f g \u00b7 k \u00b7 h', en:'Palatal initials',\n      trap:'\u5f88\u591a\u7cb5\u8a9e\u8b80 g-\u3001k-\u3001h- \u7684\u5b57\uff0c\u83ef\u8a9e\u8981\u8b80\u6210 j\u3001q\u3001x\u3002\u300c\u5bb6\u300d\u4e0d\u662f gaa\uff0c\u300c\u53bb\u300d\u4e0d\u662f heoi\uff0c\u300c\u9999\u6e2f\u300d\u7684\u300c\u9999\u300d\u4e5f\u4e0d\u662f hoeng\u3002',\n      maps:[['\u5bb6','gaa1','ji\u0101'],['\u8857','gaai1','ji\u0113'],['\u4e5d','gau2','ji\u01d4'],['\u6559','gaau3','ji\u00e0o'],['\u6a4b','kiu4','qi\u00e1o'],['\u53bb','heoi3','q\u00f9'],['\u8d77','hei2','q\u01d0'],['\u6c23','hei3','q\u00ec'],['\u4e0b','haa6','xi\u00e0'],['\u978b','haai4','xi\u00e9'],['\u9999','hoeng1','xi\u0101ng'],['\u559c','hei2','x\u01d0']],\n      tip:'\u820c\u982d\u524d\u534a\u90e8\u62ac\u8d77\u8cbc\u8fd1\u4e0a\u984e\uff0c\u5634\u89d2\u5f80\u5169\u908a\u62c9\u958b\uff0c\u50cf\u5728\u5fae\u7b11\u3002\u8a18\u4f4f\uff1aj q x \u5f8c\u9762\u53ea\u6703\u63a5 i \u6216 \u00fc\uff0c\u6240\u4ee5\u770b\u5230 ji\u3001qi\u3001xi\u3001ju\u3001qu\u3001xu\uff0c\u820c\u6839\u5b8c\u5168\u4e0d\u7528\u529b\u3002',\n      groups:[\n        {label:'Words', cn:'\u8a5e\u8a9e', type:'words', items:[\n          ['\u9999\u6e2f','Xi\u0101ngg\u01ceng'],['\u5b78\u6821','xu\u00e9xi\u00e0o'],['\u559c\u6b61','x\u01d0hu\u0101n'],['\u8d77\u5e8a','q\u01d0chu\u00e1ng'],['\u59d0\u59d0','ji\u011bjie'],['\u8b1d\u8b1d','xi\u00e8xie'],\n          ['\u4f11\u606f','xi\u016bx\u00ed'],['\u4ea4\u901a','ji\u0101ot\u014dng'],['\u56de\u5bb6','hu\u00ed ji\u0101'],['\u4e0b\u5348','xi\u00e0w\u01d4'],['\u6559\u5ba4','ji\u00e0osh\u00ec'],['\u978b\u5b50','xi\u00e9zi'] ]},\n        {label:'Sentences', cn:'\u53e5\u5b50', type:'sents', items:[\n          ['\u59d0\u59d0\u4e5d\u9ede\u8d77\u5e8a\u53bb\u5b78\u6821\u3002','Ji\u011bjie ji\u01d4 di\u01cen q\u01d0chu\u00e1ng q\u00f9 xu\u00e9xi\u00e0o.'],\n          ['\u9999\u6e2f\u7684\u4ea4\u901a\u5f88\u65b9\u4fbf\u3002','Xi\u0101ngg\u01ceng de ji\u0101ot\u014dng h\u011bn f\u0101ngbi\u00e0n.'],\n          ['\u4e0b\u5348\u6211\u60f3\u56de\u5bb6\u4f11\u606f\u3002','Xi\u00e0w\u01d4 w\u01d2 xi\u01ceng hu\u00ed ji\u0101 xi\u016bx\u00ed.'] ]}\n      ]},\n    { id:'u3', no:'\u4e09', title:'r \u97f3', en:'The retroflex r',\n      trap:'\u7cb5\u8a9e\u7684\u300c\u4eba jan4\u3001\u65e5 jat6\u3001\u71b1 jit6\u3001\u8089 juk6\u3001\u7136 jin4\u300d\u90fd\u7528 y- \u958b\u982d\uff0c\u6240\u4ee5\u5f88\u5bb9\u6613\u628a r\u00e9n \u8aaa\u6210\u300cy\u00e9n\u300d\uff0c\u628a r\u00e8 \u8aaa\u6210\u300cy\u00e8\u300d\uff08\u591c\uff09\u3002',\n      maps:[['\u4eba','jan4','r\u00e9n'],['\u65e5','jat6','r\u00ec'],['\u71b1','jit6','r\u00e8'],['\u8089','juk6','r\u00f2u'],['\u7136','jin4','r\u00e1n'],['\u8b93','joeng6','r\u00e0ng']],\n      tip:'\u5148\u767c sh \u7684\u4f4d\u7f6e\uff08\u820c\u5c16\u4e0a\u7ff9\uff09\uff0c\u7136\u5f8c\u8b93\u8072\u5e36\u632f\u52d5\uff0c\u5c31\u662f r\u3002\u820c\u5c16\u4e0d\u78b0\u4e0a\u984e\uff0c\u5634\u5507\u4e0d\u8981\u64ae\u5713\uff0c\u4e5f\u4e0d\u8981\u8b8a\u6210 l \u6216 y\u3002',\n      groups:[\n        {label:'Pairs', cn:'r vs y', type:'sets', items:[\n          [['\u71b1','r\u00e8'],['\u591c','y\u00e8']], [['\u8089','r\u00f2u'],['\u53f3','y\u00f2u']], [['\u4eba','r\u00e9n'],['\u9280','y\u00edn']],\n          [['\u8b93','r\u00e0ng'],['\u6a23','y\u00e0ng']], [['\u7136','r\u00e1n'],['\u8a00','y\u00e1n']] ]},\n        {label:'Words', cn:'\u8a5e\u8a9e', type:'words', items:[\n          ['\u65e5\u672c','R\u00ecb\u011bn'],['\u8a8d\u771f','r\u00e8nzh\u0113n'],['\u5bb9\u6613','r\u00f3ngy\u00ec'],['\u5982\u679c','r\u00fagu\u01d2'],['\u7136\u5f8c','r\u00e1nh\u00f2u'],['\u71b1\u9b27','r\u00e8n\u00e0o'],\n          ['\u5de5\u4eba','g\u014dngr\u00e9n'],['\u751f\u65e5','sh\u0113ngr\u00ec'],['\u725b\u8089','ni\u00far\u00f2u'],['\u4ecd\u7136','r\u00e9ngr\u00e1n'] ]},\n        {label:'Sentences', cn:'\u53e5\u5b50', type:'sents', items:[\n          ['\u4eca\u5929\u5f88\u71b1\uff0c\u6211\u60f3\u5403\u725b\u8089\u9eb5\u3002','J\u012bnti\u0101n h\u011bn r\u00e8, w\u01d2 xi\u01ceng ch\u012b ni\u00far\u00f2umi\u00e0n.'],\n          ['\u5982\u679c\u4f60\u8a8d\u771f\u7df4\u7fd2\uff0c\u5c31\u5f88\u5bb9\u6613\u9032\u6b65\u3002','R\u00fagu\u01d2 n\u01d0 r\u00e8nzh\u0113n li\u00e0nx\u00ed, ji\u00f9 h\u011bn r\u00f3ngy\u00ec j\u00ecnb\u00f9.'],\n          ['\u751f\u65e5\u90a3\u5929\uff0c\u65e5\u672c\u670b\u53cb\u90fd\u4f86\u4e86\u3002','Sh\u0113ngr\u00ec n\u00e0 ti\u0101n, R\u00ecb\u011bn p\u00e9ngy\u01d2u d\u014du l\u00e1i le.'] ]}\n      ]},\n    { id:'u4', no:'\u56db', title:'n \u8207 l', en:'Nasal vs lateral',\n      trap:'\u9999\u6e2f\u53e3\u8a9e\u5e38\u6709\u300c\u61f6\u97f3\u300d\uff1a\u628a\u300c\u4f60 nei5\u300d\u8aaa\u6210 lei5\u3001\u300c\u7537 naam4\u300d\u8aaa\u6210 laam4\u3002\u5728\u83ef\u8a9e\u88e1 n \u548c l \u6703\u6539\u8b8a\u610f\u601d\uff1a\u7537\u8932 \u2260 \u85cd\u8932\uff0c\u5973\u5ba2 \u2260 \u65c5\u5ba2\u3002',\n      maps:[['\u4f60','nei5','n\u01d0'],['\u7537','naam4','n\u00e1n'],['\u5973','neoi5','n\u01da'],['\u5e74','nin4','ni\u00e1n'],['\u725b','ngau4','ni\u00fa'],['\u8166','nou5','n\u01ceo']],\n      tip:'\u634f\u9f3b\u5b50\u6e2c\u8a66\uff1an \u7684\u6c23\u5f9e\u9f3b\u5b50\u51fa\u53bb\uff0c\u634f\u4f4f\u9f3b\u5b50\u5c31\u767c\u4e0d\u51fa\u4f86\uff1bl \u7684\u6c23\u5f9e\u820c\u982d\u5169\u5074\u51fa\u53bb\uff0c\u634f\u4f4f\u9f3b\u5b50\u7167\u6a23\u767c\u5f97\u51fa\u4f86\u3002\u5169\u500b\u97f3\u820c\u5c16\u90fd\u9802\u5728\u4e0a\u7259\u9f66\u3002',\n      groups:[\n        {label:'Pairs', cn:'n vs l', type:'sets', items:[\n          [['\u7537','n\u00e1n'],['\u85cd','l\u00e1n']], [['\u5973','n\u01da'],['\u65c5','l\u01da']], [['\u725b','ni\u00fa'],['\u6d41','li\u00fa']], [['\u4f60','n\u01d0'],['\u674e','l\u01d0']],\n          [['\u8166','n\u01ceo'],['\u8001','l\u01ceo']], [['\u5e74','ni\u00e1n'],['\u9023','li\u00e1n']], [['\u5357\u90e8','n\u00e1nb\u00f9'],['\u85cd\u5e03','l\u00e1nb\u00f9']], [['\u7559\u5ff5','li\u00fani\u00e0n'],['\u7559\u6200','li\u00fali\u00e0n']] ]},\n        {label:'Words', cn:'\u8a5e\u8a9e', type:'words', items:[\n          ['\u725b\u5976','ni\u00fan\u01cei'],['\u80fd\u529b','n\u00e9ngl\u00ec'],['\u52aa\u529b','n\u01d4l\u00ec'],['\u6d41\u5229','li\u00fal\u00ec'],['\u5e74\u8f15','ni\u00e1nq\u012bng'],['\u8001\u5e74','l\u01ceoni\u00e1n'],\n          ['\u51b7\u6696','l\u011bngnu\u01cen'],['\u5973\u5152','n\u01da\\'\u00e9r'],['\u7537\u5973','n\u00e1nn\u01da'],['\u4f86\u5e74','l\u00e1ini\u00e1n'] ]},\n        {label:'Sentences', cn:'\u53e5\u5b50', type:'sents', items:[\n          ['\u5289\u8001\u5e2b\u7684\u5976\u5976\u559c\u6b61\u559d\u725b\u5976\u3002','Li\u00fa l\u01ceosh\u012b de n\u01ceinai x\u01d0hu\u0101n h\u0113 ni\u00fan\u01cei.'],\n          ['\u4f60\u52aa\u529b\u7df4\u7fd2\uff0c\u5c31\u80fd\u8aaa\u5f97\u5f88\u6d41\u5229\u3002','N\u01d0 n\u01d4l\u00ec li\u00e0nx\u00ed, ji\u00f9 n\u00e9ng shu\u014d de h\u011bn li\u00fal\u00ec.'],\n          ['\u5357\u65b9\u7684\u51ac\u5929\u4e0d\u592a\u51b7\u3002','N\u00e1nf\u0101ng de d\u014dngti\u0101n b\u00fa t\u00e0i l\u011bng.'] ]}\n      ]},\n    { id:'u5', no:'\u4e94', title:'h \u00b7 k \u4e0d\u662f f', en:'h \/ k vs f',\n      trap:'\u7cb5\u8a9e\u628a\u5f88\u591a\u83ef\u8a9e h-\u3001k- \u958b\u982d\u7684\u5b57\u8b80\u6210 f-\uff1a\u300c\u82b1 faa1\u3001\u5a5a fan1\u3001\u6b61 fun1\u3001\u706b fo2\u3001\u82e6 fu2\u3001\u5feb faai3\u3001\u8932 fu3\u3001\u79d1 fo1\u300d\u3002\u5e36\u9032\u83ef\u8a9e\uff0c\u300c\u958b\u82b1\u300d\u5c31\u8b8a\u6210\u300c\u958b\u767c\u300d\u4e86\u3002',\n      maps:[['\u82b1','faa1','hu\u0101'],['\u5a5a','fan1','h\u016bn'],['\u6b61','fun1','hu\u0101n'],['\u706b','fo2','hu\u01d2'],['\u82e6','fu2','k\u01d4'],['\u5feb','faai3','ku\u00e0i'],['\u8932','fu3','k\u00f9'],['\u79d1','fo1','k\u0113'],['\u5bec','fun1','ku\u0101n']],\n      tip:'f \u662f\u4e0a\u7259\u8f15\u54ac\u4e0b\u5507\uff1bh \u662f\u820c\u6839\u9760\u8fd1\u8edf\u984e\u3001\u5f9e\u5589\u56a8\u9001\u6c23\uff0ck \u662f\u820c\u6839\u9802\u4f4f\u8edf\u984e\u518d\u653e\u958b\u3002\u770b\u5230 hu-\u3001ku- \u958b\u982d\uff0c\u4e0a\u7259\u5343\u842c\u4e0d\u8981\u78b0\u5634\u5507\u3002',\n      groups:[\n        {label:'Pairs', cn:'h \/ k vs f', type:'sets', items:[\n          [['\u82b1','hu\u0101'],['\u767c','f\u0101']], [['\u5a5a','h\u016bn'],['\u5206','f\u0113n']], [['\u6b61','hu\u0101n'],['\u7ffb','f\u0101n']], [['\u864e','h\u01d4'],['\u65a7','f\u01d4']],\n          [['\u7070','hu\u012b'],['\u98db','f\u0113i']], [['\u6703','hu\u00ec'],['\u8cbb','f\u00e8i']], [['\u958b\u82b1','k\u0101ihu\u0101'],['\u958b\u767c','k\u0101if\u0101']], [['\u82e6','k\u01d4'],['\u5e9c','f\u01d4']] ]},\n        {label:'Words', cn:'\u8a5e\u8a9e', type:'words', items:[\n          ['\u6b61\u8fce','hu\u0101ny\u00edng'],['\u82b1\u5712','hu\u0101yu\u00e1n'],['\u7d50\u5a5a','ji\u00e9h\u016bn'],['\u706b\u8eca','hu\u01d2ch\u0113'],['\u5feb\u6a02','ku\u00e0il\u00e8'],['\u8932\u5b50','k\u00f9zi'],\n          ['\u8f9b\u82e6','x\u012bnk\u01d4'],['\u79d1\u5b78','k\u0113xu\u00e9'],['\u5bec\u5927','ku\u0101nd\u00e0'],['\u56de\u5bb6','hu\u00ed ji\u0101'] ]},\n        {label:'Sentences', cn:'\u53e5\u5b50', type:'sents', items:[\n          ['\u6b61\u8fce\u4f86\u6211\u5bb6\u7684\u82b1\u5712\u3002','Hu\u0101ny\u00edng l\u00e1i w\u01d2 ji\u0101 de hu\u0101yu\u00e1n.'],\n          ['\u5750\u706b\u8eca\u5f88\u5feb\uff0c\u4e5f\u4e0d\u8f9b\u82e6\u3002','Zu\u00f2 hu\u01d2ch\u0113 h\u011bn ku\u00e0i, y\u011b b\u00f9 x\u012bnk\u01d4.'],\n          ['\u795d\u4f60\u5011\u7d50\u5a5a\u5feb\u6a02\uff01','Zh\u00f9 n\u01d0men ji\u00e9h\u016bn ku\u00e0il\u00e8!'] ]}\n      ]},\n    { id:'u6', no:'\u516d', title:'\u97fb\u5c3e\uff1a-m \u8b8a -n\u3001\u524d\u5f8c\u9f3b\u97f3', en:'Final nasals',\n      trap:'\u7cb5\u8a9e\u6709 -m \u97fb\u5c3e\uff08\u4e09 saam1\u3001\u5fc3 sam1\u3001\u91d1 gam1\u3001\u9ede dim2\uff09\uff0c\u83ef\u8a9e\u5b8c\u5168\u6c92\u6709 -m\uff0c\u5168\u90e8\u8b80 -n\u3002\u8b80\u5230\u6700\u5f8c\u5982\u679c\u5634\u5507\u9589\u8d77\u4f86\uff0c\u5c31\u662f\u7cb5\u8a9e\u53e3\u97f3\u3002\u53e6\u5916 -n \u548c -ng \u5728\u83ef\u8a9e\u6703\u5206\u8fa8\u610f\u601d\uff1a\u4eba\u6c11 \u2260 \u4eba\u540d\u3002',\n      maps:[['\u4e09','saam1','s\u0101n'],['\u5fc3','sam1','x\u012bn'],['\u91d1','gam1','j\u012bn'],['\u4eca','gam1','j\u012bn'],['\u5357','naam4','n\u00e1n'],['\u6797','lam4','l\u00edn'],['\u6df1','sam1','sh\u0113n'],['\u8ac7','taam4','t\u00e1n'],['\u9ede','dim2','di\u01cen'],['\u611f','gam2','g\u01cen'],['\u97f3','jam1','y\u012bn'],['\u751c','tim4','ti\u00e1n']],\n      tip:'-n \u7d50\u5c3e\uff1a\u820c\u5c16\u62b5\u4f4f\u4e0a\u7259\u9f66\uff0c\u5634\u5df4\u4fdd\u6301\u5fae\u5fae\u5f35\u958b\uff0c\u5634\u5507\u4e0d\u80fd\u5408\u4e0a\u3002-ng \u7d50\u5c3e\uff1a\u820c\u6839\u5f80\u5f8c\u62ac\u8d77\uff0c\u5634\u5df4\u5f35\u958b\uff0c\u8072\u97f3\u5728\u9f3b\u8154\u5f8c\u65b9\u5171\u9cf4\u3002',\n      groups:[\n        {label:'Pairs', cn:'-n vs -ng', type:'sets', items:[\n          [['\u5fc3','x\u012bn'],['\u661f','x\u012bng']], [['\u5c71','sh\u0101n'],['\u5546','sh\u0101ng']], [['\u91d1\u9b5a','j\u012bny\u00fa'],['\u9be8\u9b5a','j\u012bngy\u00fa']],\n          [['\u4eba\u6c11','r\u00e9nm\u00edn'],['\u4eba\u540d','r\u00e9nm\u00edng']], [['\u958b\u98ef','k\u0101if\u00e0n'],['\u958b\u653e','k\u0101if\u00e0ng']], [['\u4fe1\u670d','x\u00ecnf\u00fa'],['\u5e78\u798f','x\u00ecngf\u00fa']], [['\u9673\u820a','ch\u00e9nji\u00f9'],['\u6210\u5c31','ch\u00e9ngji\u00f9']] ]},\n        {label:'Sentences', cn:'\u53e5\u5b50', type:'sents', items:[\n          ['\u4eca\u5929\u4e09\u9ede\uff0c\u6211\u5011\u5728\u5357\u9580\u898b\u3002','J\u012bnti\u0101n s\u0101n di\u01cen, w\u01d2men z\u00e0i n\u00e1nm\u00e9n ji\u00e0n.'],\n          ['\u6211\u5f88\u611f\u8b1d\u4f60\u7684\u95dc\u5fc3\u3002','W\u01d2 h\u011bn g\u01cenxi\u00e8 n\u01d0 de gu\u0101nx\u012bn.'],\n          ['\u91d1\u9b5a\u548c\u9be8\u9b5a\u90fd\u5728\u6c34\u88e1\u3002','J\u012bny\u00fa h\u00e9 j\u012bngy\u00fa d\u014du z\u00e0i shu\u01d0 li.'] ]}\n      ]},\n    { id:'u7', no:'\u4e03', title:'\u5165\u8072\u5b57', en:'Checked-tone characters',\n      trap:'\u7cb5\u8a9e\u5165\u8072\u5b57\u4ee5 -p\u3001-t\u3001-k \u6536\u5c3e\uff0c\u53c8\u77ed\u53c8\u6025\uff08\u5341 sap6\u3001\u4e00 jat1\u3001\u570b gwok3\uff09\u3002\u83ef\u8a9e\u6c92\u6709\u5165\u8072\uff1a\u5b57\u97f3\u8981\u62c9\u9577\uff0c\u7d50\u5c3e\u4e7e\u6de8\uff0c\u4e0d\u80fd\u7a81\u7136\u300c\u6536\u4f4f\u300d\u3002',\n      maps:null,\n      tip:'\u5165\u8072\u5b57\u5728\u83ef\u8a9e\u88e1\u5206\u6563\u5230\u56db\u500b\u8072\u8abf\uff0c\u6c92\u6709\u898f\u5f8b\u53ef\u4ee5\u5f9e\u7cb5\u8a9e\u63a8\u51fa\u4f86\uff0c\u53ea\u80fd\u9010\u500b\u8a18\u3002\u4e0b\u9762\u6309\u83ef\u8a9e\u8072\u8abf\u5206\u7d44\uff0c\u8b80\u7684\u6642\u5019\u6bcf\u500b\u5b57\u90fd\u8981\u62c9\u9577\u5230\u6b63\u5e38\u9577\u5ea6\u3002',\n      groups:[\n        {label:'By Mandarin tone', cn:'\u6309\u83ef\u8a9e\u8072\u8abf\u5206\u7d44', type:'tgroups', items:[\n          {t:'\u8b8a\u6210\u7b2c\u4e00\u8072', w:[['\u4e00','jat1','y\u012b'],['\u516b','baat3','b\u0101'],['\u4e03','cat1','q\u012b'],['\u51fa','ceot1','ch\u016b'],['\u9ed1','hak1','h\u0113i']]},\n          {t:'\u8b8a\u6210\u7b2c\u4e8c\u8072', w:[['\u5341','sap6','sh\u00ed'],['\u570b','gwok3','gu\u00f3'],['\u5b78','hok6','xu\u00e9'],['\u767d','baak6','b\u00e1i'],['\u98df','sik6','sh\u00ed']]},\n          {t:'\u8b8a\u6210\u7b2c\u4e09\u8072', w:[['\u767e','baak3','b\u01cei'],['\u5317','bak1','b\u011bi'],['\u7b46','bat1','b\u01d0'],['\u9435','tit3','ti\u011b'],['\u96ea','syut3','xu\u011b']]},\n          {t:'\u8b8a\u6210\u7b2c\u56db\u8072', w:[['\u516d','luk6','li\u00f9'],['\u65e5','jat6','r\u00ec'],['\u6708','jyut6','yu\u00e8'],['\u7da0','luk6','l\u01dc'],['\u4e0d','bat1','b\u00f9']]} ]},\n        {label:'Sentences', cn:'\u53e5\u5b50', type:'sents', items:[\n          ['\u6211\u4e03\u9ede\u51fa\u9580\uff0c\u516b\u9ede\u5403\u65e9\u9910\u3002','W\u01d2 q\u012b di\u01cen ch\u016bm\u00e9n, b\u0101 di\u01cen ch\u012b z\u01ceoc\u0101n.'],\n          ['\u9019\u672c\u66f8\u4e00\u767e\u516b\u5341\u516d\u584a\u3002','Zh\u00e8 b\u011bn sh\u016b y\u00ecb\u01cei b\u0101sh\u00edli\u00f9 ku\u00e0i.'],\n          ['\u6211\u5341\u6708\u4e00\u65e5\u53bb\u5317\u4eac\u5b78\u7fd2\u3002','W\u01d2 sh\u00ed yu\u00e8 y\u012b r\u00ec q\u00f9 B\u011bij\u012bng xu\u00e9x\u00ed.'] ]}\n      ]},\n    { id:'u8', no:'\u516b', title:'e \u97f3', en:'The vowel e',\n      trap:'\u7cb5\u8a9e\u6c92\u6709\u83ef\u8a9e\u7684 e \u97f3\uff0c\u5e38\u628a\u300c\u54e5 go1\u3001\u559d hot3\u3001\u6cb3 ho4\u3001\u8ab2 fo3\u300d\u8b80\u6210 o\u3002\u7d50\u679c g\u0113\uff08\u54e5\uff09\u807d\u8d77\u4f86\u50cf gu\u014d\uff08\u934b\uff09\u3002',\n      maps:[['\u54e5','go1','g\u0113'],['\u559d','hot3','h\u0113'],['\u6cb3','ho4','h\u00e9'],['\u53ef','ho2','k\u011b'],['\u8ab2','fo3','k\u00e8'],['\u500b','go3','g\u00e8']],\n      tip:'\u5148\u767c\u4e00\u500b o\uff0c\u7136\u5f8c\u5634\u5507\u653e\u9b06\u3001\u5634\u89d2\u5f80\u5169\u908a\u5fae\u5fae\u62c9\u958b\uff0c\u820c\u982d\u4f4d\u7f6e\u4e0d\u52d5\u2014\u2014\u50cf\u4e0d\u592a\u6eff\u610f\u6642\u767c\u51fa\u7684\u300c\u5443\u300d\u3002\u6574\u500b\u904e\u7a0b\u5634\u5507\u90fd\u4e0d\u80fd\u662f\u5713\u7684\u3002',\n      groups:[\n        {label:'Pairs', cn:'e vs uo', type:'sets', items:[\n          [['\u6b4c','g\u0113'],['\u934b','gu\u014d']], [['\u8ab2','k\u00e8'],['\u95ca','ku\u00f2']], [['\u5408','h\u00e9'],['\u6d3b','hu\u00f3']], [['\u71b1','r\u00e8'],['\u5f31','ru\u00f2']], [['\u5f97','d\u00e9'],['\u596a','du\u00f3']] ]},\n        {label:'Words', cn:'\u8a5e\u8a9e', type:'words', items:[\n          ['\u54e5\u54e5','g\u0113ge'],['\u559d\u8336','h\u0113 ch\u00e1'],['\u53ef\u6a02','k\u011bl\u00e8'],['\u5531\u6b4c','ch\u00e0ngg\u0113'],['\u5ba2\u4eba','k\u00e8r\u00e9n'],['\u9019\u500b','zh\u00e8ge'],\n          ['\u5408\u9069','h\u00e9sh\u00ec'],['\u7279\u5225','t\u00e8bi\u00e9'],['\u6c7d\u8eca','q\u00ecch\u0113'],['\u984f\u8272','y\u00e1ns\u00e8'] ]},\n        {label:'Sentences', cn:'\u53e5\u5b50', type:'sents', items:[\n          ['\u54e5\u54e5\u559c\u6b61\u559d\u53ef\u6a02\u3002','G\u0113ge x\u01d0hu\u0101n h\u0113 k\u011bl\u00e8.'],\n          ['\u9019\u500b\u5ba2\u4eba\u7279\u5225\u6703\u5531\u6b4c\u3002','Zh\u00e8ge k\u00e8r\u00e9n t\u00e8bi\u00e9 hu\u00ec ch\u00e0ngg\u0113.'] ]}\n      ]},\n    { id:'u9', no:'\u4e5d', title:'\u8f15\u8072', en:'Neutral tone',\n      trap:'\u7cb5\u8a9e\u6bcf\u500b\u5b57\u90fd\u8b80\u5f97\u4e00\u6a23\u91cd\uff0c\u6c92\u6709\u8f15\u8072\u3002\u83ef\u8a9e\u6709\u4e9b\u8a5e\u7684\u7b2c\u4e8c\u500b\u5b57\u8981\u8b80\u5f97\u53c8\u8f15\u53c8\u77ed\uff0c\u5982\u679c\u6bcf\u500b\u5b57\u90fd\u8b80\u8db3\uff0c\u807d\u8d77\u4f86\u6703\u5f88\u300c\u786c\u300d\u3002',\n      maps:null,\n      tip:'\u524d\u4e00\u500b\u5b57\u8b80\u8db3\uff0c\u5f8c\u4e00\u500b\u5b57\u8f15\u8f15\u5e36\u904e\uff0c\u9577\u5ea6\u5927\u7d04\u4e00\u534a\u3002\u53f0\u7063\u83ef\u8a9e\u7684\u8f15\u8072\u4e0d\u591a\uff0c\u4f46\u758a\u5b57\u7a31\u547c\uff08\u5abd\u5abd\u3001\u54e5\u54e5\uff09\u3001\u300c\u5b50\u3001\u5011\u300d\u8a5e\u5c3e\uff0c\u4ee5\u53ca\u300c\u7684\u3001\u4e86\u3001\u55ce\u300d\u9019\u4e9b\u5b57\u4e00\u5b9a\u8981\u8b80\u8f15\u8072\u3002',\n      groups:[\n        {label:'Neutral tone', cn:'\u8f15\u8072\u8a5e', type:'words', items:[\n          ['\u5abd\u5abd','m\u0101ma'],['\u7238\u7238','b\u00e0ba'],['\u54e5\u54e5','g\u0113ge'],['\u59d0\u59d0','ji\u011bjie'],['\u6211\u5011','w\u01d2men'],['\u4ed6\u5011','t\u0101men'],\n          ['\u6905\u5b50','y\u01d0zi'],['\u684c\u5b50','zhu\u014dzi'],['\u5b69\u5b50','h\u00e1izi'],['\u597d\u55ce','h\u01ceo ma'] ]},\n        {label:'Sentences', cn:'\u53e5\u5b50', type:'sents', items:[\n          ['\u5abd\u5abd\u7684\u6905\u5b50\u5728\u684c\u5b50\u65c1\u908a\u3002','M\u0101ma de y\u01d0zi z\u00e0i zhu\u014dzi p\u00e1ngbi\u0101n.'],\n          ['\u54e5\u54e5\u548c\u59d0\u59d0\u90fd\u662f\u597d\u5b69\u5b50\u3002','G\u0113ge h\u00e9 ji\u011bjie d\u014du sh\u00ec h\u01ceo h\u00e1izi.'] ]}\n      ]}\n  ];\n\n  var T23 = [[['\u9b5a','y\u00fa'],['\u96e8','y\u01d4']],[['\u623f','f\u00e1ng'],['\u8a2a','f\u01ceng']],[['\u9322','qi\u00e1n'],['\u6dfa','qi\u01cen']],[['\u7169','f\u00e1n'],['\u53cd','f\u01cen']],\n             [['\u9ebb','m\u00e1'],['\u99ac','m\u01ce']],[['\u5b8c','w\u00e1n'],['\u665a','w\u01cen']],[['\u725b','ni\u00fa'],['\u626d','ni\u01d4']],[['\u7cd6','t\u00e1ng'],['\u8eba','t\u01ceng']]];\n\n  var SANDHI = [\n    { t:'\u2460 \u4e09\u8072 + \u4e09\u8072 \u2192 \u524d\u5b57\u8b8a\u4e8c\u8072', items:[['\u4f60\u597d','n\u01d0 h\u01ceo','n\u00ed h\u01ceo'],['\u6c34\u679c','shu\u01d0gu\u01d2','shu\u00edgu\u01d2'],['\u6d17\u624b','x\u01d0sh\u01d2u','x\u00edsh\u01d2u'],['\u8001\u95c6','l\u01ceob\u01cen','l\u00e1ob\u01cen'],['\u53ef\u4ee5','k\u011by\u01d0','k\u00e9y\u01d0'],['\u96e8\u5098','y\u01d4s\u01cen','y\u00fas\u01cen']]},\n    { t:'\u2461 \u4e09\u8072 + \u5176\u4ed6\u8072\u8abf \u2192 \u53ea\u8b80\u4f4e\u7684\u90e8\u5206\uff08\u534a\u4e09\u8072\uff09', items:[['\u8001\u5e2b','l\u01ceosh\u012b','\u4f4e + \u9ad8'],['\u5f88\u5fd9','h\u011bn m\u00e1ng','\u4f4e + \u5347'],['\u597d\u770b','h\u01ceok\u00e0n','\u4f4e + \u964d'],['\u6211\u5011','w\u01d2men','\u4f4e + \u8f15']]},\n    { t:'\u2462\u300c\u4e00\u300d\u7684\u8b8a\u8abf', items:[['\u4e00','y\u012b','\u55ae\u7368 y\u012b'],['\u7b2c\u4e00','d\u00ec-y\u012b','\u5e8f\u6578 y\u012b'],['\u4e00\u5b9a','y\u012bd\u00ecng','y\u00edd\u00ecng'],['\u4e00\u6a23','y\u012by\u00e0ng','y\u00edy\u00e0ng'],['\u4e00\u5929','y\u012bti\u0101n','y\u00ecti\u0101n'],['\u4e00\u5e74','y\u012bni\u00e1n','y\u00ecni\u00e1n'],['\u4e00\u8d77','y\u012bq\u01d0','y\u00ecq\u01d0']]},\n    { t:'\u2463\u300c\u4e0d\u300d\u7684\u8b8a\u8abf\uff1a\u4e0d + \u56db\u8072 \u2192 \u4e8c\u8072', items:[['\u4e0d\u662f','b\u00f9 sh\u00ec','b\u00fa sh\u00ec'],['\u4e0d\u8981','b\u00f9 y\u00e0o','b\u00fa y\u00e0o'],['\u4e0d\u5c0d','b\u00f9 du\u00ec','b\u00fa du\u00ec'],['\u4e0d\u5403','b\u00f9 ch\u012b','\u4e0d\u8b8a b\u00f9'],['\u4e0d\u4f86','b\u00f9 l\u00e1i','\u4e0d\u8b8a b\u00f9'],['\u4e0d\u597d','b\u00f9 h\u01ceo','\u4e0d\u8b8a b\u00f9']]}\n  ];\n\n  var BANK = [\n    {c:'zh',o:[['\u8a69\u4eba','sh\u012br\u00e9n'],['\u79c1\u4eba','s\u012br\u00e9n']]},{c:'zh',o:[['\u4e3b\u529b','zh\u01d4l\u00ec'],['\u963b\u529b','z\u01d4l\u00ec']]},\n    {c:'zh',o:[['\u652f\u63f4','zh\u012byu\u00e1n'],['\u8cc7\u6e90','z\u012byu\u00e1n']]},{c:'zh',o:[['\u9b5a\u7fc5','y\u00fach\u00ec'],['\u9b5a\u523a','y\u00fac\u00ec']]},\n    {c:'zh',o:[['\u63a8\u9072','tu\u012bch\u00ed'],['\u63a8\u8fad','tu\u012bc\u00ed']]},{c:'zh',o:[['\u5546\u696d','sh\u0101ngy\u00e8'],['\u6851\u8449','s\u0101ngy\u00e8']]},\n    {c:'zh',o:[['\u63d2\u624b','ch\u0101sh\u01d2u'],['\u64e6\u624b','c\u0101sh\u01d2u']]},{c:'zh',o:[['\u5c71','sh\u0101n'],['\u4e09','s\u0101n']]},\n    {c:'jq',o:[['\u96de','j\u012b'],['\u77e5','zh\u012b'],['\u8cc7','z\u012b']]},{c:'jq',o:[['\u4e03','q\u012b'],['\u5403','ch\u012b'],['\u96cc','c\u012b']]},\n    {c:'jq',o:[['\u897f','x\u012b'],['\u8a69','sh\u012b'],['\u7d72','s\u012b']]},{c:'jq',o:[['\u5c0f','xi\u01ceo'],['\u5c11','sh\u01ceo'],['\u6383','s\u01ceo']]},\n    {c:'jq',o:[['\u4fee','xi\u016b'],['\u6536','sh\u014du'],['\u641c','s\u014du']]},\n    {c:'r',o:[['\u71b1','r\u00e8'],['\u6a02','l\u00e8'],['\u591c','y\u00e8']]},{c:'r',o:[['\u8089','r\u00f2u'],['\u6f0f','l\u00f2u'],['\u53f3','y\u00f2u']]},\n    {c:'r',o:[['\u4eba','r\u00e9n'],['\u9280','y\u00edn']]},{c:'r',o:[['\u8b93','r\u00e0ng'],['\u6a23','y\u00e0ng']]},{c:'r',o:[['\u7136','r\u00e1n'],['\u85cd','l\u00e1n'],['\u8a00','y\u00e1n']]},\n    {c:'r',o:[['\u5982','r\u00fa'],['\u7210','l\u00fa'],['\u9b5a','y\u00fa']]},\n    {c:'nl',o:[['\u7537\u8932','n\u00e1nk\u00f9'],['\u85cd\u8932','l\u00e1nk\u00f9']]},{c:'nl',o:[['\u5973\u5ba2','n\u01dak\u00e8'],['\u65c5\u5ba2','l\u01dak\u00e8']]},\n    {c:'nl',o:[['\u7559\u5ff5','li\u00fani\u00e0n'],['\u7559\u6200','li\u00fali\u00e0n']]},{c:'nl',o:[['\u6fc3\u91cd','n\u00f3ngzh\u00f2ng'],['\u9686\u91cd','l\u00f3ngzh\u00f2ng']]},\n    {c:'nl',o:[['\u5357\u90e8','n\u00e1nb\u00f9'],['\u85cd\u5e03','l\u00e1nb\u00f9']]},{c:'nl',o:[['\u725b','ni\u00fa'],['\u6d41','li\u00fa']]},{c:'nl',o:[['\u4f60','n\u01d0'],['\u674e','l\u01d0']]},\n    {c:'hf',o:[['\u82b1','hu\u0101'],['\u767c','f\u0101']]},{c:'hf',o:[['\u5a5a','h\u016bn'],['\u5206','f\u0113n']]},{c:'hf',o:[['\u6b61','hu\u0101n'],['\u7ffb','f\u0101n']]},\n    {c:'hf',o:[['\u958b\u82b1','k\u0101ihu\u0101'],['\u958b\u767c','k\u0101if\u0101']]},{c:'hf',o:[['\u82e6','k\u01d4'],['\u5e9c','f\u01d4'],['\u864e','h\u01d4']]},\n    {c:'hf',o:[['\u7070','hu\u012b'],['\u98db','f\u0113i']]},{c:'hf',o:[['\u6703','hu\u00ec'],['\u8cbb','f\u00e8i']]},\n    {c:'ng',o:[['\u4eba\u6c11','r\u00e9nm\u00edn'],['\u4eba\u540d','r\u00e9nm\u00edng']]},{c:'ng',o:[['\u91d1\u9b5a','j\u012bny\u00fa'],['\u9be8\u9b5a','j\u012bngy\u00fa']]},\n    {c:'ng',o:[['\u958b\u98ef','k\u0101if\u00e0n'],['\u958b\u653e','k\u0101if\u00e0ng']]},{c:'ng',o:[['\u9673\u820a','ch\u00e9nji\u00f9'],['\u6210\u5c31','ch\u00e9ngji\u00f9']]},\n    {c:'ng',o:[['\u4fe1\u670d','x\u00ecnf\u00fa'],['\u5e78\u798f','x\u00ecngf\u00fa']]},{c:'ng',o:[['\u5fc3','x\u012bn'],['\u661f','x\u012bng']]},{c:'ng',o:[['\u5c71','sh\u0101n'],['\u5546','sh\u0101ng']]},\n    {c:'e',o:[['\u6b4c','g\u0113'],['\u934b','gu\u014d']]},{c:'e',o:[['\u8ab2','k\u00e8'],['\u95ca','ku\u00f2']]},{c:'e',o:[['\u5408','h\u00e9'],['\u6d3b','hu\u00f3']]},\n    {c:'e',o:[['\u71b1','r\u00e8'],['\u5f31','ru\u00f2']]},{c:'e',o:[['\u5f97','d\u00e9'],['\u596a','du\u00f3']]},\n    {c:'tone',o:[['\u6e6f','t\u0101ng'],['\u7cd6','t\u00e1ng'],['\u8eba','t\u01ceng'],['\u71d9','t\u00e0ng']]},{c:'tone',o:[['\u5abd','m\u0101'],['\u9ebb','m\u00e1'],['\u99ac','m\u01ce'],['\u7f75','m\u00e0']]},\n    {c:'tone',o:[['\u8863','y\u012b'],['\u59e8','y\u00ed'],['\u6905','y\u01d0'],['\u610f','y\u00ec']]},{c:'tone',o:[['\u901a','t\u014dng'],['\u540c','t\u00f3ng'],['\u6876','t\u01d2ng'],['\u75db','t\u00f2ng']]},\n    {c:'tone',o:[['\u516b','b\u0101'],['\u62d4','b\u00e1'],['\u628a','b\u01ce'],['\u7238','b\u00e0']]},{c:'tone',o:[['\u66f8','sh\u016b'],['\u719f','sh\u00fa'],['\u9f20','sh\u01d4'],['\u6a39','sh\u00f9']]},\n    {c:'tone',o:[['\u7df4\u7fd2','li\u00e0nx\u00ed'],['\u806f\u7e6b','li\u00e1nx\u00ec']]},{c:'tone',o:[['\u8cb7','m\u01cei'],['\u8ce3','m\u00e0i']]}\n  ];\n  var QCATS = [['all','\u5168\u90e8\u6df7\u5408'],['zh','\u5e73\u6372\u820c'],['jq','j \/ zh \/ z'],['r','r \u97f3'],['nl','n \/ l'],['hf','h \/ f'],['ng','\u524d\u5f8c\u9f3b\u97f3'],['e','e \u97f3'],['tone','\u8072\u8abf']];\n\n  var TWISTERS = [\n    {id:'t1', tag:'\u5e73\u6372\u820c z \/ zh', title:'\u56db\u662f\u56db', zh:'\u56db\u662f\u56db\uff0c\u5341\u662f\u5341\uff0c\u5341\u56db\u662f\u5341\u56db\uff0c\u56db\u5341\u662f\u56db\u5341\u3002', py:'S\u00ec sh\u00ec s\u00ec, sh\u00ed sh\u00ec sh\u00ed, sh\u00eds\u00ec sh\u00ec sh\u00eds\u00ec, s\u00ecsh\u00ed sh\u00ec s\u00ecsh\u00ed.'},\n    {id:'t2', tag:'n \/ l', title:'\u725b\u90ce\u6200\u5289\u5a18', zh:'\u725b\u90ce\u5e74\u5e74\u6200\u5289\u5a18\uff0c\u5289\u5a18\u5e74\u5e74\u5ff5\u725b\u90ce\u3002', py:'Ni\u00fal\u00e1ng ni\u00e1nni\u00e1n li\u00e0n Li\u00fa ni\u00e1ng, Li\u00fa ni\u00e1ng ni\u00e1nni\u00e1n ni\u00e0n Ni\u00fal\u00e1ng.'},\n    {id:'t3', tag:'h \/ f', title:'\u7d05\u9cf3\u51f0', zh:'\u7c89\u7d05\u7246\u4e0a\u756b\u9cf3\u51f0\uff0c\u7d05\u9cf3\u51f0\u3001\u7c89\u9cf3\u51f0\uff0c\u7d05\u7c89\u9cf3\u51f0\u82b1\u9cf3\u51f0\u3002', py:'F\u011bnh\u00f3ng qi\u00e1ng shang hu\u00e0 f\u00e8nghu\u00e1ng, h\u00f3ng f\u00e8nghu\u00e1ng, f\u011bn f\u00e8nghu\u00e1ng, h\u00f3ng f\u011bn f\u00e8nghu\u00e1ng hu\u0101 f\u00e8nghu\u00e1ng.'},\n    {id:'t4', tag:'-n \/ -ng', title:'\u6241\u64d4\u548c\u677f\u51f3', zh:'\u6241\u64d4\u9577\uff0c\u677f\u51f3\u5bec\uff0c\u6241\u64d4\u6c92\u6709\u677f\u51f3\u5bec\uff0c\u677f\u51f3\u6c92\u6709\u6241\u64d4\u9577\u3002', py:'Bi\u01cend\u0101n ch\u00e1ng, b\u01cend\u00e8ng ku\u0101n, bi\u01cend\u0101n m\u00e9iy\u01d2u b\u01cend\u00e8ng ku\u0101n, b\u01cend\u00e8ng m\u00e9iy\u01d2u bi\u01cend\u0101n ch\u00e1ng.'},\n    {id:'t5', tag:'e \/ uo', title:'\u9d5d\u904e\u6cb3', zh:'\u5761\u4e0a\u7acb\u8457\u4e00\u96bb\u9d5d\uff0c\u5761\u4e0b\u5c31\u662f\u4e00\u689d\u6cb3\u3002\u5bec\u5bec\u7684\u6cb3\uff0c\u80a5\u80a5\u7684\u9d5d\uff0c\u9d5d\u8981\u904e\u6cb3\uff0c\u6cb3\u8981\u6e21\u9d5d\u3002', py:'P\u014d shang l\u00eczhe y\u00ec zh\u012b \u00e9, p\u014d xi\u00e0 ji\u00f9 sh\u00ec y\u00ec ti\u00e1o h\u00e9. Ku\u0101nku\u0101n de h\u00e9, f\u00e9if\u00e9i de \u00e9, \u00e9 y\u00e0o gu\u00f2 h\u00e9, h\u00e9 y\u00e0o d\u00f9 \u00e9.'},\n    {id:'t6', tag:'\u9001\u6c23\u97f3 p \/ t', title:'\u5403\u8461\u8404', zh:'\u5403\u8461\u8404\u4e0d\u5410\u8461\u8404\u76ae\uff0c\u4e0d\u5403\u8461\u8404\u5012\u5410\u8461\u8404\u76ae\u3002', py:'Ch\u012b p\u00fat\u00e1o b\u00f9 t\u01d4 p\u00fat\u00e1op\u00ed, b\u00f9 ch\u012b p\u00fat\u00e1o d\u00e0o t\u01d4 p\u00fat\u00e1op\u00ed.'}\n  ];\n\n  \/* ---------- \u8a9e\u97f3 ---------- *\/\n  var S = { lang:'zh-TW', rate:0.85, voices:[] };\n  function loadVoices(){\n    if (window.speechSynthesis) { S.voices = window.speechSynthesis.getVoices(); }\n    var note = document.getElementById('oy-voice-note');\n    if (note) {\n      if (S.voices.length > 0) {\n        if (pickVoice()) { note.classList.remove('show'); } else { note.classList.add('show'); }\n      }\n    }\n  }\n  function normLang(l){ return (l || '').toLowerCase().replace('_','-'); }\n  function pickVoice(){\n    var want = S.lang.toLowerCase();\n    var alt = (want === 'zh-cn') ? 'zh-tw' : 'zh-cn';\n    var exact = null, second = null;\n    for (var i = 0; i < S.voices.length; i++) {\n      var l = normLang(S.voices[i].lang);\n      if (l === want) { if (!exact) { exact = S.voices[i]; } }\n      else if (l === alt) { if (!second) { second = S.voices[i]; } }\n    }\n    return exact || second;\n  }\n  function speak(text, rate){\n    if (!window.speechSynthesis) { alert('\u4f60\u7684\u700f\u89bd\u5668\u4e0d\u652f\u63f4\u8a9e\u97f3\u6717\u8b80\uff0c\u8acb\u6539\u7528 Chrome\u3001Safari \u6216 Edge\u3002'); return; }\n    window.speechSynthesis.cancel();\n    var u = new SpeechSynthesisUtterance(text);\n    u.lang = S.lang;\n    u.rate = rate || S.rate;\n    var v = pickVoice();\n    if (v) { u.voice = v; }\n    window.speechSynthesis.speak(u);\n  }\n  if (window.speechSynthesis) {\n    loadVoices();\n    window.speechSynthesis.onvoiceschanged = loadVoices;\n  }\n\n\n  \/* ---------- \u820c\u4f4d\u52d5\u614b\u5716 ---------- *\/\n  var DGS = {\n    zhi:{h:'\u77e5', g:'retro', k:'stop', asp:false, d:'\u820c\u5c16\u7ff9\u8d77\uff0c\u9802\u4f4f\u4e0a\u7259\u9f66\u5f8c\u65b9\uff08\u786c\u984e\u524d\u90e8\uff09\uff0c\u6c23\u5148\u88ab\u64cb\u4f4f\uff1b\u7136\u5f8c\u8f15\u8f15\u653e\u958b\uff0c\u4e0d\u9001\u6c23\u3002'},\n    chi:{h:'\u5403', g:'retro', k:'stop', asp:true,  d:'\u820c\u4f4d\u548c zh \u4e00\u6a23\uff0c\u653e\u958b\u6642\u7528\u529b\u9001\u6c23\u2014\u2014\u624b\u653e\u5728\u5634\u524d\u53ef\u4ee5\u611f\u89ba\u5230\u4e00\u80a1\u6c23\u3002'},\n    shi:{h:'\u8a69', g:'retro', k:'fric', asp:false, d:'\u820c\u5c16\u7ff9\u8d77\u4f46\u4e0d\u78b0\u5230\u4e0a\u984e\uff0c\u7559\u4e00\u689d\u7a84\u7e2b\uff0c\u6c23\u5f9e\u7e2b\u4e2d\u6301\u7e8c\u6469\u64e6\u51fa\u4f86\u3002'},\n    ji: {h:'\u96de', g:'pal',   k:'stop', asp:false, d:'\u820c\u5c16\u62b5\u4f4f\u4e0b\u7259\u80cc\uff0c\u820c\u9762\u524d\u90e8\u62ac\u8d77\u8cbc\u4f4f\u786c\u984e\uff1b\u8f15\u8f15\u653e\u958b\uff0c\u4e0d\u9001\u6c23\u3002\u5634\u89d2\u5f80\u5169\u908a\u62c9\uff0c\u50cf\u5fae\u7b11\u3002'},\n    qi: {h:'\u4e03', g:'pal',   k:'stop', asp:true,  d:'\u820c\u4f4d\u548c j \u4e00\u6a23\uff0c\u653e\u958b\u6642\u7528\u529b\u9001\u6c23\u3002\u820c\u5c16\u4e00\u76f4\u7559\u5728\u4e0b\u7259\u5f8c\u9762\u3002'},\n    xi: {h:'\u897f', g:'pal',   k:'fric', asp:false, d:'\u820c\u9762\u524d\u90e8\u9760\u8fd1\u786c\u984e\u4f46\u4e0d\u78b0\u5230\uff0c\u7559\u7e2b\u8b93\u6c23\u6469\u64e6\u51fa\u4f86\uff1b\u820c\u5c16\u59cb\u7d42\u5728\u4e0b\u7259\u5f8c\u9762\u3002'}\n  };\n  var SHP = {\n    rest: [[92,192],[92,181],[115,172],[150,161],[200,156],[250,165],[292,212]],\n    retro:[[104,176],[121,126],[136,146],[165,160],[210,160],[255,168],[292,212]],\n    pal:  [[90,192],[88,177],[110,136],[148,110],[198,112],[248,150],[292,208]]\n  };\n  var GAPI = { retro:[1,2], pal:[2,3,4] };\n  var CONTACT = { retro:[121,126], pal:[148,110] };\n  var AIRP = {\n    retro:[[318,240],[314,165],[270,140],[215,140],[160,140],[124,129],[104,146],[86,165],[60,161],[16,161]],\n    pal:  [[318,240],[314,165],[262,128],[200,106],[150,113],[112,134],[88,166],[60,161],[16,161]]\n  };\n  var DGI = [];\n\n  function dgHTML(def){\n    var row = function(lb, arr){\n      var h = '<div class=\"oy-dg-row\"><span class=\"lb\">' + lb + '<\/span>';\n      arr.forEach(function(k){ h += '<button data-act=\"dg\" data-s=\"' + k + '\"' + (k === def ? ' class=\"on\"' : '') + '><b>' + DGS[k].h + '<\/b><span class=\"oy-pin\">' + k + '<\/span><\/button>'; });\n      return h + '<\/div>';\n    };\n    return '<div class=\"oy-dg\" data-def=\"' + def + '\"><div class=\"oy-dg-hd\">\u2726 \u820c\u4f4d\u52d5\u614b\u5716<span>\u9ede\u9078\u4e0b\u9762\u7684\u97f3\uff0c\u770b\u820c\u982d\u600e\u9ebc\u52d5\uff08\u540c\u6642\u64ad\u653e\u8b80\u97f3\uff09<\/span><\/div>' +\n      '<div class=\"oy-dg-body\"><canvas width=\"380\" height=\"300\"><\/canvas><div class=\"oy-dg-side\">' +\n      row('\u6372\u820c', ['zhi','chi','shi']) + row('\u820c\u9762', ['ji','qi','xi']) +\n      '<div class=\"oy-dg-step\"><\/div><div class=\"oy-dg-desc\"><\/div>' +\n      '<div class=\"oy-dg-key\"><span><i style=\"background:#D9837A\"><\/i>\u820c\u982d<\/span><span><i style=\"background:#C1440E\"><\/i>\u63a5\u89f8\u9ede<\/span><span><i style=\"background:#2E4A62\"><\/i>\u6c23\u6d41<\/span><\/div>' +\n      '<\/div><\/div><\/div>';\n  }\n\n  function shapeOf(g, gap){\n    var base = SHP[g], out = [];\n    for (var i = 0; i < base.length; i++) { out.push([base[i][0], base[i][1]]); }\n    GAPI[g].forEach(function(i){ out[i][1] += gap; });\n    return out;\n  }\n  function lerpS(a, b, t){ var o = []; for (var i = 0; i < a.length; i++) { o.push([a[i][0] + (b[i][0] - a[i][0]) * t, a[i][1] + (b[i][1] - a[i][1]) * t]); } return o; }\n  function ease(t){ return t < 0.5 ? 2 * t * t : 1 - Math.pow(-2 * t + 2, 2) \/ 2; }\n  function crThrough(ctx, p){\n    ctx.lineTo(p[0][0], p[0][1]);\n    for (var i = 0; i < p.length - 1; i++) {\n      var p0 = p[i - 1] || p[i], p1 = p[i], p2 = p[i + 1], p3 = p[i + 2] || p2;\n      ctx.bezierCurveTo(p1[0] + (p2[0] - p0[0]) \/ 6, p1[1] + (p2[1] - p0[1]) \/ 6, p2[0] - (p3[0] - p1[0]) \/ 6, p2[1] - (p3[1] - p1[1]) \/ 6, p2[0], p2[1]);\n    }\n  }\n  function pathPoint(pts, s){\n    var L = [0], tot = 0, i;\n    for (i = 1; i < pts.length; i++) { tot += Math.hypot(pts[i][0] - pts[i - 1][0], pts[i][1] - pts[i - 1][1]); L.push(tot); }\n    var d = s * tot;\n    for (i = 1; i < pts.length; i++) {\n      if (L[i] >= d) { var f = (d - L[i - 1]) \/ ((L[i] - L[i - 1]) || 1); return [pts[i - 1][0] + (pts[i][0] - pts[i - 1][0]) * f, pts[i - 1][1] + (pts[i][1] - pts[i - 1][1]) * f]; }\n    }\n    return pts[pts.length - 1];\n  }\n\n  function dgDraw(inst, st){\n    var c = inst.cv, ctx = inst.ctx;\n    ctx.setTransform(inst.r, 0, 0, inst.r, 0, 0);\n    ctx.clearRect(0, 0, 380, 300);\n    ctx.fillStyle = '#FFFFFF'; ctx.fillRect(0, 0, 380, 300);\n    ctx.lineJoin = 'round'; ctx.lineCap = 'round';\n    \/\/ lower jaw & lip\n    ctx.beginPath();\n    ctx.moveTo(10, 300); ctx.lineTo(312, 300); ctx.lineTo(304, 284);\n    ctx.quadraticCurveTo(200, 248, 104, 210); ctx.quadraticCurveTo(92, 200, 90, 188);\n    ctx.lineTo(80, 192); ctx.quadraticCurveTo(70, 186, 62, 186); ctx.quadraticCurveTo(52, 172, 42, 172);\n    ctx.quadraticCurveTo(26, 178, 22, 205); ctx.quadraticCurveTo(18, 240, 10, 250); ctx.closePath();\n    ctx.fillStyle = '#F2E6DA'; ctx.fill(); ctx.strokeStyle = '#8A7A6C'; ctx.lineWidth = 1.5; ctx.stroke();\n    \/\/ tongue\n    var p = st.shape;\n    ctx.beginPath(); ctx.moveTo(102, 206);\n    crThrough(ctx, p);\n    ctx.lineTo(304, 284); ctx.quadraticCurveTo(200, 246, 102, 206); ctx.closePath();\n    ctx.fillStyle = '#D9837A'; ctx.fill(); ctx.strokeStyle = '#9E4A42'; ctx.lineWidth = 1.8; ctx.stroke();\n    \/\/ upper jaw, palate, velum, pharynx wall\n    ctx.beginPath();\n    ctx.moveTo(10, 10); ctx.lineTo(370, 10); ctx.lineTo(370, 300); ctx.lineTo(334, 300); ctx.lineTo(334, 142);\n    ctx.quadraticCurveTo(330, 118, 312, 116); ctx.lineTo(302, 124); ctx.quadraticCurveTo(298, 150, 290, 152);\n    ctx.quadraticCurveTo(280, 148, 278, 124); ctx.quadraticCurveTo(262, 108, 235, 102);\n    ctx.quadraticCurveTo(200, 96, 160, 104); ctx.quadraticCurveTo(126, 112, 112, 125);\n    ctx.quadraticCurveTo(104, 134, 94, 140); ctx.lineTo(78, 134);\n    ctx.quadraticCurveTo(70, 132, 64, 138); ctx.quadraticCurveTo(56, 150, 46, 150);\n    ctx.quadraticCurveTo(28, 148, 22, 126); ctx.quadraticCurveTo(18, 100, 24, 78); ctx.lineTo(10, 78); ctx.closePath();\n    ctx.fillStyle = '#F2E6DA'; ctx.fill(); ctx.strokeStyle = '#8A7A6C'; ctx.lineWidth = 1.5; ctx.stroke();\n    \/\/ hard palate highlight line\n    ctx.beginPath(); ctx.moveTo(112, 125); ctx.quadraticCurveTo(126, 112, 160, 104); ctx.quadraticCurveTo(200, 96, 235, 102);\n    ctx.strokeStyle = '#B8933E'; ctx.lineWidth = 3; ctx.stroke();\n    \/\/ teeth\n    ctx.fillStyle = '#FFFFFF'; ctx.strokeStyle = '#9A9A9A'; ctx.lineWidth = 1.2;\n    ctx.beginPath(); ctx.moveTo(77, 134); ctx.lineTo(94, 140); ctx.lineTo(84, 164); ctx.lineTo(77, 161); ctx.closePath(); ctx.fill(); ctx.stroke();\n    ctx.beginPath(); ctx.moveTo(81, 168); ctx.lineTo(88, 167); ctx.lineTo(93, 190); ctx.lineTo(82, 192); ctx.closePath(); ctx.fill(); ctx.stroke();\n    \/\/ labels\n    ctx.font = '11px \"Noto Sans TC\", sans-serif'; ctx.fillStyle = '#6B7178';\n    ctx.fillText('\u4e0a\u7259\u9f66', 56, 112); ctx.fillText('\u786c\u984e', 175, 92); ctx.fillText('\u8edf\u984e', 262, 98);\n    ctx.fillText('\u4e0a\u5507', 28, 140); ctx.fillText('\u4e0b\u5507', 28, 190);\n    \/\/ contact point\n    if (st.contact > 0) {\n      var cp = CONTACT[st.g];\n      ctx.beginPath(); ctx.arc(cp[0], cp[1], 7, 0, Math.PI * 2);\n      ctx.fillStyle = 'rgba(193,68,14,' + (0.85 * st.contact) + ')'; ctx.fill();\n      ctx.beginPath(); ctx.arc(cp[0], cp[1], 12, 0, Math.PI * 2);\n      ctx.strokeStyle = 'rgba(193,68,14,' + (0.35 * st.contact) + ')'; ctx.lineWidth = 2; ctx.stroke();\n    }\n    \/\/ airflow particles\n    if (st.air > 0) {\n      var now = performance.now();\n      for (var k = 0; k < 14; k++) {\n        var s0 = ((now \/ 1100) + k \/ 14) % 1;\n        var pt = pathPoint(AIRP[st.g], s0);\n        ctx.beginPath(); ctx.arc(pt[0], pt[1], 2.6, 0, Math.PI * 2);\n        ctx.fillStyle = 'rgba(46,74,98,' + (0.75 * st.air) + ')'; ctx.fill();\n      }\n    }\n    \/\/ burst of air at lips\n    if (st.burst > 0) {\n      var len = st.strong ? 46 : 16;\n      ctx.strokeStyle = 'rgba(46,74,98,' + (1 - st.burst * 0.6) + ')'; ctx.lineWidth = st.strong ? 3 : 2;\n      [-10, 0, 10].forEach(function(dy){\n        var x0 = 40, y0 = 161 + dy * 0.4, x1 = x0 - len * st.burst, y1 = 161 + dy * (0.4 + st.burst);\n        ctx.beginPath(); ctx.moveTo(x0, y0); ctx.lineTo(x1, y1); ctx.stroke();\n        ctx.beginPath(); ctx.moveTo(x1, y1); ctx.lineTo(x1 + 6, y1 - 4); ctx.moveTo(x1, y1); ctx.lineTo(x1 + 6, y1 + 4); ctx.stroke();\n      });\n      if (st.strong) { ctx.font = 'bold 12px \"Noto Sans TC\", sans-serif'; ctx.fillStyle = '#2E4A62'; ctx.fillText('\u9001\u6c23\uff01', 6, 214); }\n    }\n  }\n\n  function dgStatic(inst, key){\n    var d = DGS[key], gap = d.k === 'fric' ? 7 : 0;\n    dgDraw(inst, { shape:shapeOf(d.g, gap), g:d.g, contact:(d.k === 'stop' ? 1 : 0), air:0, burst:0 });\n    inst.step.textContent = d.k === 'stop' ? '\u6700\u7dca\u7684\u4f4d\u7f6e\uff1a\u820c\u982d\u9802\u4f4f\uff08\u7d05\u9ede\uff09' : '\u6700\u7dca\u7684\u4f4d\u7f6e\uff1a\u7559\u4e00\u689d\u7a84\u7e2b';\n    inst.desc.textContent = d.d;\n  }\n\n  function dgPlay(inst, key){\n    var d = DGS[key];\n    inst.run = (inst.run || 0) + 1;\n    var myRun = inst.run, t0 = performance.now(), spoke = false;\n    var rest = SHP.rest, hold = shapeOf(d.g, d.k === 'fric' ? 7 : 0), vow = shapeOf(d.g, 10);\n    var T1 = 500, T2 = 1100, T3 = 1350, T4 = 2100, T5 = 2600;\n    inst.desc.textContent = d.d;\n    function frame(now){\n      if (inst.run !== myRun) { return; }\n      var t = now - t0, st = { g:d.g, contact:0, air:0, burst:0, strong:d.asp }, label = '';\n      if (t < T1) {\n        st.shape = lerpS(rest, hold, ease(t \/ T1));\n        label = d.g === 'retro' ? '\u2460 \u820c\u5c16\u5f80\u4e0a\u7ff9' : '\u2460 \u820c\u5c16\u62b5\u4e0b\u7259\uff0c\u820c\u9762\u62ac\u8d77';\n      } else if (t < T2) {\n        st.shape = hold;\n        if (d.k === 'stop') { st.contact = 1; label = '\u2461 \u9802\u4f4f\uff0c\u6c23\u5148\u88ab\u64cb\u4f4f'; }\n        else { st.air = 1; label = '\u2461 \u7559\u4e00\u689d\u7a84\u7e2b\uff0c\u6c23\u6301\u7e8c\u6469\u64e6'; }\n      } else if (t < T3) {\n        var f = (t - T2) \/ (T3 - T2);\n        st.shape = lerpS(hold, vow, ease(f));\n        if (d.k === 'stop') { st.burst = f; st.air = d.asp ? 1 : 0.4; label = d.asp ? '\u2462 \u653e\u958b\uff0c\u7528\u529b\u9001\u6c23' : '\u2462 \u8f15\u8f15\u653e\u958b\uff0c\u4e0d\u9001\u6c23'; }\n        else { st.air = 1; label = '\u2462 \u63a5\u8457\u767c -i'; }\n      } else if (t < T4) {\n        st.shape = vow; st.air = d.k === 'fric' ? 0.7 : 0.35;\n        if (d.k === 'stop') { if (t < T3 + 250) { st.burst = 1; } }\n        label = '\u2462 \u63a5\u8457\u767c -i\uff0c\u820c\u4f4d\u4fdd\u6301';\n      } else if (t < T5) {\n        st.shape = lerpS(vow, rest, ease((t - T4) \/ (T5 - T4))); label = '';\n      } else {\n        dgStatic(inst, key); return;\n      }\n      if (!spoke) { if (t > 650) { spoke = true; speak(d.h); } }\n      inst.step.textContent = label;\n      dgDraw(inst, st);\n      requestAnimationFrame(frame);\n    }\n    requestAnimationFrame(frame);\n  }\n\n  function dgInit(){\n    var boxes = root.querySelectorAll('.oy-dg');\n    for (var i = 0; i < boxes.length; i++) {\n      var cv = boxes[i].querySelector('canvas');\n      var r = window.devicePixelRatio || 1;\n      cv.width = 380 * r; cv.height = 300 * r;\n      var inst = { box:boxes[i], cv:cv, ctx:cv.getContext('2d'), r:r, step:boxes[i].querySelector('.oy-dg-step'), desc:boxes[i].querySelector('.oy-dg-desc'), run:0 };\n      boxes[i].setAttribute('data-dgi', i);\n      DGI.push(inst);\n      dgStatic(inst, boxes[i].getAttribute('data-def'));\n    }\n  }\n\n  \/* ---------- \u7e6a\u88fd ---------- *\/\n  function tile(h, p, cls){ return '<button class=\"' + (cls || 'oy-tile') + '\" data-say=\"' + h + '\"><b>' + h + '<\/b><span class=\"oy-pin\">' + p + '<\/span><\/button>'; }\n  function mapChip(m){ return '<button class=\"oy-map\" data-say=\"' + m[0] + '\"><b>' + m[0] + '<\/b><i>\u7cb5 ' + m[1] + '<\/i><em>\u2192<\/em><u>' + m[2] + '<\/u><\/button>'; }\n  function setRow(set){\n    var html = '<div class=\"oy-set\">', names = [];\n    for (var i = 0; i < set.length; i++) {\n      if (i > 0) { html += '<span class=\"vs\">vs<\/span>'; }\n      html += tile(set[i][0], set[i][1]);\n      names.push(set[i][0]);\n    }\n    html += '<\/div>';\n    return html;\n  }\n  function sentRow(s){ return '<div class=\"oy-sent\"><div><span class=\"zh\">' + s[0] + '<\/span><span class=\"oy-pin\">' + s[1] + '<\/span><\/div><button class=\"oy-play\" data-say=\"' + s[0] + '\">\u25b6 \u64ad\u653e<\/button><\/div>'; }\n\n  function renderUnits(){\n    var idx = '', filt = '<button class=\"on\" data-filter=\"all\">\u5168\u90e8<\/button>', out = '';\n    UNITS.forEach(function(u, n){\n      idx += '<button class=\"oy-idx\" data-go=\"' + u.id + '\"><span class=\"n\">' + (n + 1 < 10 ? '0' : '') + (n + 1) + '<\/span><span class=\"t\">' + u.title + '<\/span><span class=\"e\">' + u.en + '<\/span><\/button>';\n      filt += '<button data-filter=\"' + u.id + '\">' + u.no + '\u30fb' + u.title.split(\/[\uff1a\u00b7]\/)[0].replace(\/\\s+$\/,'') + '<\/button>';\n      var h = '<section class=\"oy-unit\" id=\"oy-' + u.id + '\" data-unit=\"' + u.id + '\">';\n      h += '<div class=\"oy-unit-hd\"><div class=\"oy-badge\">' + u.no + '<\/div><div><div class=\"oy-mono\">Unit ' + (n + 1) + ' \u00b7 ' + u.en + '<\/div><h2><span class=\"ez-toc-section\" id=\"_utitle\"><\/span>' + u.title + '<span class=\"ez-toc-section-end\"><\/span><\/h2><\/div><\/div>';\n      h += '<div class=\"oy-trap\"><h4>\u26a0 \u7cb5\u8a9e\u9677\u9631<\/h4><p>' + u.trap + '<\/p>';\n      if (u.maps) { h += '<div class=\"oy-maps\">' + u.maps.map(mapChip).join('') + '<\/div>'; }\n      h += '<\/div>';\n      h += '<div class=\"oy-tip\"><h4>\u2726 \u767c\u97f3\u8981\u8a23<\/h4><p>' + u.tip + '<\/p><\/div>';\n      if (u.dg) { h += dgHTML(u.dg); }\n      u.groups.forEach(function(g){\n        h += '<div class=\"oy-glabel\">' + g.label + '<span>' + g.cn + '<\/span><\/div>';\n        if (g.type === 'sets') { h += '<div class=\"oy-sets\">' + g.items.map(setRow).join('') + '<\/div>'; }\n        if (g.type === 'words') { h += '<div class=\"oy-words\">' + g.items.map(function(w){ return tile(w[0], w[1], 'oy-word-chip'); }).join('') + '<\/div>'; }\n        if (g.type === 'sents') { h += g.items.map(sentRow).join(''); }\n        if (g.type === 'tgroups') {\n          h += '<div class=\"oy-tgroups\">' + g.items.map(function(tg){ return '<div class=\"oy-tg\"><h5>' + tg.t + '<\/h5><div class=\"oy-maps\" style=\"margin-top:0;\">' + tg.w.map(mapChip).join('') + '<\/div><\/div>'; }).join('') + '<\/div>';\n        }\n      });\n      h += '<\/section>';\n      out += h;\n    });\n    idx += '<button class=\"oy-idx\" data-tab=\"tones\"><span class=\"n\">+<\/span><span class=\"t\">\u8072\u8abf\u8207\u8b8a\u8abf<\/span><span class=\"e\">Tones &amp; sandhi<\/span><\/button>';\n    idx += '<button class=\"oy-idx\" data-tab=\"quiz\"><span class=\"n\">?<\/span><span class=\"t\">\u807d\u8fa8\u6e2c\u9a57<\/span><span class=\"e\">Listening quiz<\/span><\/button>';\n    idx += '<button class=\"oy-idx\" data-tab=\"twister\"><span class=\"n\">\u25cf<\/span><span class=\"t\">\u7e5e\u53e3\u4ee4\u9304\u97f3<\/span><span class=\"e\">Record &amp; send<\/span><\/button>';\n    document.getElementById('oy-index').innerHTML = idx;\n    document.getElementById('oy-filter').innerHTML = filt;\n    document.getElementById('oy-units').innerHTML = out;\n  }\n\n  function renderTones(){\n    document.getElementById('oy-t23').innerHTML = T23.map(setRow).join('');\n    var h = '';\n    SANDHI.forEach(function(r){\n      h += '<div class=\"oy-rule\"><h4>' + r.t + '<\/h4><div class=\"oy-words\">';\n      r.items.forEach(function(it){ h += '<button class=\"oy-sandhi\" data-say=\"' + it[0] + '\"><b>' + it[0] + '<\/b><s>' + it[1] + '<\/s><span class=\"now\">' + it[2] + '<\/span><\/button>'; });\n      h += '<\/div><\/div>';\n    });\n    document.getElementById('oy-sandhi').innerHTML = h;\n  }\n\n  function renderTwisters(){\n    document.getElementById('oy-tws').innerHTML = TWISTERS.map(function(t){\n      return '<div class=\"oy-tw\" id=\"oy-tw-' + t.id + '\"><div class=\"oy-mono\">' + t.tag + '<\/div><h3>' + t.title + '<\/h3>' +\n        '<div class=\"zh\">' + t.zh + '<\/div><div class=\"oy-pin\">' + t.py + '<\/div>' +\n        '<div class=\"oy-tw-btns\"><button class=\"oy-play\" data-say=\"' + t.zh + '\">\u25b6 \u6a19\u6e96\u97f3<\/button>' +\n        '<button class=\"oy-rec\" data-act=\"rec\" data-id=\"' + t.id + '\">\u25cf \u9304\u97f3<\/button>' +\n        '<a class=\"oy-dl\" href=\"#\" download>\u2b07 \u4e0b\u8f09\u9304\u97f3<\/a><\/div>' +\n        '<audio controls><\/audio><\/div>';\n    }).join('');\n  }\n\n  \/* ---------- \u6e2c\u9a57 ---------- *\/\n  var Q = { cat:'all', list:[], i:0, score:0, answered:false };\n  function shuffle(a){ for (var i = a.length - 1; i > 0; i--) { var j = Math.floor(Math.random() * (i + 1)); var t = a[i]; a[i] = a[j]; a[j] = t; } return a; }\n  function catName(c){ for (var i = 0; i < QCATS.length; i++) { if (QCATS[i][0] === c) { return QCATS[i][1]; } } return ''; }\n  function quizStart(){\n    var box = document.getElementById('oy-quiz');\n    var cats = QCATS.map(function(c){ return '<button data-qcat=\"' + c[0] + '\"' + (c[0] === Q.cat ? ' class=\"on\"' : '') + '>' + c[1] + '<\/button>'; }).join('');\n    box.innerHTML = '<div class=\"oy-center\"><div class=\"oy-mono\">Listening quiz<\/div><h2 style=\"font-size:20px;margin:4px 0;\"><span class=\"ez-toc-section\" id=\"%E8%80%B3%E5%8A%9B%E8%81%BD%E8%BE%A8%E6%B8%AC%E9%A9%97\"><\/span>\u8033\u529b\u807d\u8fa8\u6e2c\u9a57<span class=\"ez-toc-section-end\"><\/span><\/h2>' +\n      '<p class=\"oy-note\">\u807d\u4e00\u6b21\uff0c\u9078\u51fa\u4f60\u807d\u5230\u7684\u662f\u54ea\u4e00\u500b\u3002\u6bcf\u56de\u5408 10 \u984c\uff0c\u96a8\u6a5f\u51fa\u984c\u3002\u5148\u9078\u64c7\u60f3\u7df4\u7fd2\u7684\u7bc4\u570d\uff1a<\/p>' +\n      '<div class=\"oy-qcats\">' + cats + '<\/div><button class=\"oy-primary\" data-act=\"qgo\">\u958b\u59cb\u6e2c\u9a57<\/button><\/div>';\n  }\n  function quizBuild(){\n    var pool = [];\n    BANK.forEach(function(b){ if (Q.cat === 'all' || b.c === Q.cat) { pool.push(b); } });\n    shuffle(pool);\n    Q.list = pool.slice(0, 10).map(function(b){ var o = shuffle(b.o.slice()); return { c:b.c, o:o, a:Math.floor(Math.random() * o.length) }; });\n    Q.i = 0; Q.score = 0;\n    quizRender();\n  }\n  function quizRender(){\n    var box = document.getElementById('oy-quiz');\n    if (Q.i >= Q.list.length) {\n      var pct = Math.round(Q.score \/ Q.list.length * 100);\n      var msg = pct >= 90 ? '\u8033\u6735\u975e\u5e38\u654f\u92b3\uff0c\u53ef\u4ee5\u6311\u6230\u5176\u4ed6\u7bc4\u570d\uff01' : (pct >= 60 ? '\u4e0d\u932f\uff01\u932f\u7684\u90a3\u5e7e\u7d44\u56de\u5230\u55ae\u5143\u591a\u807d\u5e7e\u6b21\u3002' : '\u9019\u90e8\u5206\u662f\u7cb5\u8a9e\u6bcd\u8a9e\u8005\u7684\u96e3\u9ede\uff0c\u56de\u5230\u55ae\u5143\u6162\u901f\u591a\u807d\uff0c\u518d\u4f86\u6311\u6230\u3002');\n      box.innerHTML = '<div class=\"oy-center\"><div class=\"oy-mono\">Result<\/div><div style=\"font-family:Fraunces,serif;font-style:italic;font-size:46px;color:#C1440E;\">' + Q.score + ' \/ ' + Q.list.length + '<\/div>' +\n        '<p style=\"margin:6px 0 16px;\">' + msg + '<\/p><button class=\"oy-primary\" data-act=\"qgo\">\u518d\u4f86\u4e00\u56de<\/button> <button data-act=\"qmenu\">\u63db\u7bc4\u570d<\/button><\/div>';\n      return;\n    }\n    var q = Q.list[Q.i];\n    Q.answered = false;\n    var opts = q.o.map(function(o, k){ return '<button class=\"oy-qopt\" data-act=\"qans\" data-k=\"' + k + '\"><b>' + o[0] + '<\/b><span class=\"oy-pin\">' + o[1] + '<\/span><\/button>'; }).join('');\n    box.innerHTML = '<div class=\"oy-qtop\"><span class=\"oy-mono\">' + catName(q.c) + '<\/span><span>\u7b2c ' + (Q.i + 1) + ' \/ ' + Q.list.length + ' \u984c\u3000\u2713 ' + Q.score + '<\/span><\/div>' +\n      '<div class=\"oy-qbar\"><i style=\"width:' + (Q.i \/ Q.list.length * 100) + '%\"><\/i><\/div>' +\n      '<div class=\"oy-center\"><button class=\"oy-big\" data-act=\"qplay\" aria-label=\"\u64ad\u653e\">\u25b6<\/button><button data-act=\"qslow\" style=\"font-size:12.5px;\">\ud83d\udc22 \u6162\u901f\u518d\u807d<\/button><\/div>' +\n      '<div class=\"oy-qopts\"' + (q.o.length === 3 ? ' style=\"grid-template-columns:repeat(3,1fr);\"' : '') + '>' + opts + '<\/div><div id=\"oy-qfb\"><\/div>';\n    setTimeout(function(){ speak(q.o[q.a][0]); }, 250);\n  }\n  function quizAnswer(k){\n    if (Q.answered) { return; }\n    Q.answered = true;\n    var q = Q.list[Q.i];\n    var btns = root.querySelectorAll('.oy-qopt');\n    for (var i = 0; i < btns.length; i++) { if (i === q.a) { btns[i].classList.add('ok'); } }\n    var right = q.o[q.a];\n    var fb = document.getElementById('oy-qfb');\n    var compare = q.o.map(function(o){ return '<button data-say=\"' + o[0] + '\" style=\"font-size:12.5px;margin:3px;\">' + o[0] + ' ' + o[1] + ' \u25b6<\/button>'; }).join('');\n    if (k === q.a) {\n      Q.score++;\n      fb.className = 'oy-qfb ok';\n      fb.innerHTML = '\u2713 \u7b54\u5c0d\u4e86\uff01\u662f\u300c' + right[0] + ' ' + right[1] + '\u300d\u3002<div style=\"margin-top:6px;\">' + compare + '<\/div>';\n    } else {\n      btns[k].classList.add('bad');\n      fb.className = 'oy-qfb bad';\n      fb.innerHTML = '\u2717 \u4f60\u807d\u5230\u7684\u662f\u300c' + right[0] + ' ' + right[1] + '\u300d\u3002\u9ede\u64ca\u4e0b\u9762\u5c0d\u6bd4\u807d\u807d\u770b\uff1a<div style=\"margin-top:6px;\">' + compare + '<\/div>';\n    }\n    fb.innerHTML += '<div style=\"margin-top:10px;\"><button class=\"oy-primary\" data-act=\"qnext\">' + (Q.i + 1 < Q.list.length ? '\u4e0b\u4e00\u984c \u2192' : '\u770b\u7d50\u679c') + '<\/button><\/div>';\n  }\n\n  \/* ---------- \u9304\u97f3 ---------- *\/\n  var REC = {};\n  function recToggle(id, btn){\n    var r = REC[id];\n    if (r) { if (r.state === 'recording') { r.stop(); return; } }\n    if (!navigator.mediaDevices) { alert('\u6b64\u700f\u89bd\u5668\u7121\u6cd5\u9304\u97f3\uff0c\u8acb\u7528\u624b\u6a5f\u5167\u5efa\u9304\u97f3\u5f8c\u518d\u7528 LINE \u50b3\u7d66\u8001\u5e2b\u3002'); return; }\n    if (!window.MediaRecorder) { alert('\u6b64\u700f\u89bd\u5668\u7121\u6cd5\u9304\u97f3\uff0c\u8acb\u7528\u624b\u6a5f\u5167\u5efa\u9304\u97f3\u5f8c\u518d\u7528 LINE \u50b3\u7d66\u8001\u5e2b\u3002'); return; }\n    navigator.mediaDevices.getUserMedia({ audio:true }).then(function(stream){\n      var mime = '';\n      if (MediaRecorder.isTypeSupported('audio\/webm')) { mime = 'audio\/webm'; }\n      else if (MediaRecorder.isTypeSupported('audio\/mp4')) { mime = 'audio\/mp4'; }\n      var rec = mime ? new MediaRecorder(stream, { mimeType:mime }) : new MediaRecorder(stream);\n      var chunks = [];\n      rec.ondataavailable = function(e){ if (e.data.size > 0) { chunks.push(e.data); } };\n      rec.onstop = function(){\n        stream.getTracks().forEach(function(t){ t.stop(); });\n        var type = rec.mimeType || mime || 'audio\/webm';\n        var blob = new Blob(chunks, { type:type });\n        var url = URL.createObjectURL(blob);\n        var card = document.getElementById('oy-tw-' + id);\n        var au = card.querySelector('audio');\n        au.src = url; au.classList.add('show');\n        var dl = card.querySelector('.oy-dl');\n        dl.href = url; dl.setAttribute('download', 'OneDotDot-' + id + (type.indexOf('mp4') > -1 ? '.m4a' : '.webm'));\n        dl.classList.add('show');\n        btn.classList.remove('recording'); btn.textContent = '\u25cf \u91cd\u65b0\u9304\u97f3';\n      };\n      rec.start();\n      REC[id] = rec;\n      btn.classList.add('recording'); btn.textContent = '\u25a0 \u505c\u6b62\u9304\u97f3';\n    }).catch(function(){ alert('\u7121\u6cd5\u4f7f\u7528\u9ea5\u514b\u98a8\uff0c\u8acb\u5141\u8a31\u700f\u89bd\u5668\u5b58\u53d6\u9ea5\u514b\u98a8\u5f8c\u518d\u8a66\u4e00\u6b21\u3002'); });\n  }\n\n  \/* ---------- \u5207\u63db ---------- *\/\n  function showTab(t){\n    var panes = root.querySelectorAll('.oy-pane');\n    for (var i = 0; i < panes.length; i++) { panes[i].classList.toggle('on', panes[i].id === 'oy-pane-' + t); }\n    var tabs = root.querySelectorAll('.oy-tabs button');\n    for (var j = 0; j < tabs.length; j++) { tabs[j].classList.toggle('on', tabs[j].getAttribute('data-tab') === t); }\n    if (t === 'quiz') { quizStart(); }\n    var bar = root.querySelector('.oy-tabs');\n    if (bar.getBoundingClientRect().top < 0) { bar.scrollIntoView({ behavior:'smooth' }); }\n  }\n  function filterUnit(id){\n    var secs = root.querySelectorAll('.oy-unit');\n    for (var i = 0; i < secs.length; i++) { secs[i].style.display = (id === 'all' || secs[i].getAttribute('data-unit') === id) ? '' : 'none'; }\n    var fb = root.querySelectorAll('#oy-filter button');\n    for (var j = 0; j < fb.length; j++) { fb[j].classList.toggle('on', fb[j].getAttribute('data-filter') === id); }\n  }\n\n  root.addEventListener('click', function(e){\n    var el = e.target.closest('button, a.oy-dl');\n    if (!el) { return; }\n    if (el.classList.contains('oy-dl')) { if (el.getAttribute('href') === '#') { e.preventDefault(); } return; }\n    var say = el.getAttribute('data-say');\n    if (say) { speak(say); }\n    var tab = el.getAttribute('data-tab');\n    if (tab) { showTab(tab); return; }\n    var go = el.getAttribute('data-go');\n    if (go) { showTab('units'); filterUnit(go); return; }\n    var f = el.getAttribute('data-filter');\n    if (f) { filterUnit(f); return; }\n    var qc = el.getAttribute('data-qcat');\n    if (qc) { Q.cat = qc; quizStart(); return; }\n    var act = el.getAttribute('data-act');\n    if (!act) { return; }\n    if (act === 'rate') {\n      var sibs = el.parentNode.querySelectorAll('button');\n      for (var i = 0; i < sibs.length; i++) { sibs[i].classList.toggle('on', sibs[i] === el); }\n      S.rate = parseFloat(el.getAttribute('data-v'));\n    }\n    if (act === 'slow') { speak(el.getAttribute('data-text'), 0.55); }\n    if (act === 'dg') {\n      var box = el.closest('.oy-dg');\n      var inst = DGI[parseInt(box.getAttribute('data-dgi'), 10)];\n      var bs = box.querySelectorAll('button[data-act=\"dg\"]');\n      for (var b = 0; b < bs.length; b++) { bs[b].classList.toggle('on', bs[b] === el); }\n      dgPlay(inst, el.getAttribute('data-s'));\n    }\n    if (act === 'rec') { recToggle(el.getAttribute('data-id'), el); }\n    if (act === 'qgo') { quizBuild(); }\n    if (act === 'qmenu') { quizStart(); }\n    if (act === 'qplay') { speak(Q.list[Q.i].o[Q.list[Q.i].a][0]); }\n    if (act === 'qslow') { speak(Q.list[Q.i].o[Q.list[Q.i].a][0], 0.55); }\n    if (act === 'qans') { quizAnswer(parseInt(el.getAttribute('data-k'), 10)); }\n    if (act === 'qnext') { Q.i++; quizRender(); }\n  });\n\n  renderUnits();\n  renderTones();\n  renderTwisters();\n  dgInit();\n})();\n<\/script>\n<!-- ===== \u8907\u88fd\u5230\u9019\u88e1\u7d50\u675f ===== -->\n<\/body>\n<\/html>\n","protected":false},"excerpt":{"rendered":"<p>\u7cb5\u8a9e\u6bcd\u8a9e\u8005\u83ef\u8a9e\u767c\u97f3\u8a13\u7df4 | OneDotDot Chinese \u9ede OneDotDot Chineseby Tiffany Huang \u6162\u901f \u6b63\u5e38 \u4f60\u7684\u88dd\u7f6e\u76ee\u524d\u627e\u4e0d\u5230\u83ef\u8a9e\u8a9e\u97f3\uff0c\u53ef\u80fd\u6703\u7528\u7cb5\u8a9e\u6216\u5176\u4ed6\u8a9e\u97f3\u6717\u8b80\u3002\u8acb\u5230\u624b\u6a5f\u6216\u96fb\u8166\u7684\u300c\u8a2d\u5b9a \u2192 \u8a9e\u8a00\uff0f\u6587\u5b57\u8f49\u8a9e\u97f3\u300d\u52a0\u5165\u300c\u4e2d\u6587\uff08\u53f0\u7063\uff09\u300d\u8a9e\u97f3\u5f8c\u91cd\u65b0\u6574\u7406\u9801\u9762\u3002 Pronunciation Lab \u00b7 For Cantonese Speakers \u7cb5\u8a9e\u6bcd\u8a9e\u8005\u7684\u83ef\u8a9e\u767c\u97f3\u8a13\u7df4 From Cantonese to Mandarin \u2014 fix the sounds you were never taught to hear. 1\u770b\u300c\u7cb5\u8a9e\u9677\u9631\u300d\uff0c\u627e\u51fa\u81ea\u5df1\u7684\u7fd2\u6163 2\u9ede\u64ca\u5b57\u8a5e\u807d\u6a19\u6e96\u97f3\uff0c\u505a\u5c0d\u6bd4\u7df4\u7fd2 3\u807d\u8fa8\u6e2c\u9a57\uff0b\u9304\u97f3\uff0c\u50b3\u7d66\u8001\u5e2b \u8ab2\u7a0b\u5c0e\u89bd \u4e5d\u5927\u767c\u97f3\u55ae\u5143 \u8072\u8abf\u8207\u8b8a\u8abf \u807d\u8fa8\u6e2c\u9a57 \u7e5e\u53e3\u4ee4\u9304\u97f3 \u5c0f\u63d0\u793a\uff1a\u7d05\u8272\u7684 jat1 \u662f\u7cb5\u8a9e\u62fc\u97f3\uff08\u7cb5\u62fc\uff09\uff0c\u85cd\u8272\u7684 y\u012b \u662f\u83ef\u8a9e\u62fc\u97f3\u3002\u6240\u6709\u5b57\u8a5e\u90fd\u53ef\u4ee5\u9ede\u64ca\u8046\u807d\uff1b\u53f3\u4e0a\u89d2\u53ef\u5207\u63db\u8a9e\u901f\u3002 Tone shapes \u7528\u7cb5\u8a9e\u8072\u8abf\u627e\u83ef\u8a9e\u56db\u8072 \u7cb5\u8a9e\u6709\u516d\u500b\u8072\u8abf\uff0c\u5176\u4e2d\u4e09\u500b\u7684\u300c\u97f3\u9ad8\u8d70\u5411\u300d\u548c\u83ef\u8a9e\u5f88\u63a5\u8fd1\u3002\u5148\u7528\u4f60\u719f\u6089\u7684\u7cb5\u8a9e\u97f3\u9ad8\u627e\u5230\u611f\u89ba\uff0c\u518d\u7df4\u552f\u4e00\u7684\u65b0\u8072\u8abf\u2014\u2014\u7b2c\u56db\u8072\u3002 \u7b2c\u4e00\u8072 5 \u2192&#8230;<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_wp_convertkit_post_meta":{"form":"-1","landing_page":"0","tag":"0","restrict_content":"0"},"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false},"categories":[1],"tags":[],"class_list":["post-18687","post","type-post","status-publish","format-standard","hentry","category-no-category"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.7 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>\u7cb5\u8a9e\u5b78\u751f\u5c08\u7528 - OneDotDot Chinese<\/title>\n<meta name=\"description\" content=\"Pronunciation Lab \u00b7 For Cantonese Speakers\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/tiffanysmandarin.com\/index.php\/2026\/10\/27\/for-cantonese-speakers\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u7cb5\u8a9e\u5b78\u751f\u5c08\u7528 - OneDotDot Chinese\" \/>\n<meta property=\"og:description\" content=\"Pronunciation Lab \u00b7 For Cantonese Speakers\" \/>\n<meta property=\"og:url\" content=\"https:\/\/tiffanysmandarin.com\/index.php\/2026\/10\/27\/for-cantonese-speakers\/\" \/>\n<meta property=\"og:site_name\" content=\"OneDotDot Chinese\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-27T15:20:56+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-27T15:20:59+00:00\" \/>\n<meta name=\"author\" content=\"tiffany\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"tiffany\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"1 minute\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/tiffanysmandarin.com\\\/index.php\\\/2026\\\/10\\\/27\\\/for-cantonese-speakers\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/tiffanysmandarin.com\\\/index.php\\\/2026\\\/10\\\/27\\\/for-cantonese-speakers\\\/\"},\"author\":{\"name\":\"tiffany\",\"@id\":\"https:\\\/\\\/tiffanysmandarin.com\\\/#\\\/schema\\\/person\\\/3556e1160fac98b190d03b8aa8604d99\"},\"headline\":\"\u7cb5\u8a9e\u5b78\u751f\u5c08\u7528\",\"datePublished\":\"2026-10-27T15:20:56+00:00\",\"dateModified\":\"2026-10-27T15:20:59+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/tiffanysmandarin.com\\\/index.php\\\/2026\\\/10\\\/27\\\/for-cantonese-speakers\\\/\"},\"wordCount\":68,\"publisher\":{\"@id\":\"https:\\\/\\\/tiffanysmandarin.com\\\/#\\\/schema\\\/person\\\/3556e1160fac98b190d03b8aa8604d99\"},\"articleSection\":[\"No category\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/tiffanysmandarin.com\\\/index.php\\\/2026\\\/10\\\/27\\\/for-cantonese-speakers\\\/\",\"url\":\"https:\\\/\\\/tiffanysmandarin.com\\\/index.php\\\/2026\\\/10\\\/27\\\/for-cantonese-speakers\\\/\",\"name\":\"\u7cb5\u8a9e\u5b78\u751f\u5c08\u7528 - OneDotDot Chinese\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/tiffanysmandarin.com\\\/#website\"},\"datePublished\":\"2026-10-27T15:20:56+00:00\",\"dateModified\":\"2026-10-27T15:20:59+00:00\",\"description\":\"Pronunciation Lab \u00b7 For Cantonese Speakers\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/tiffanysmandarin.com\\\/index.php\\\/2026\\\/10\\\/27\\\/for-cantonese-speakers\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/tiffanysmandarin.com\\\/index.php\\\/2026\\\/10\\\/27\\\/for-cantonese-speakers\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/tiffanysmandarin.com\\\/index.php\\\/2026\\\/10\\\/27\\\/for-cantonese-speakers\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9801\",\"item\":\"https:\\\/\\\/tiffanysmandarin.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u7cb5\u8a9e\u5b78\u751f\u5c08\u7528\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/tiffanysmandarin.com\\\/#website\",\"url\":\"https:\\\/\\\/tiffanysmandarin.com\\\/\",\"name\":\"OneDotDot Chinese\",\"description\":\"Learn a little Chinese every day\",\"publisher\":{\"@id\":\"https:\\\/\\\/tiffanysmandarin.com\\\/#\\\/schema\\\/person\\\/3556e1160fac98b190d03b8aa8604d99\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/tiffanysmandarin.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/tiffanysmandarin.com\\\/#\\\/schema\\\/person\\\/3556e1160fac98b190d03b8aa8604d99\",\"name\":\"tiffany\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"http:\\\/\\\/tiffanysmandarin.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/cropped-logo_tiffany2-1.png\",\"url\":\"http:\\\/\\\/tiffanysmandarin.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/cropped-logo_tiffany2-1.png\",\"contentUrl\":\"http:\\\/\\\/tiffanysmandarin.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/cropped-logo_tiffany2-1.png\",\"width\":214,\"height\":214,\"caption\":\"tiffany\"},\"logo\":{\"@id\":\"http:\\\/\\\/tiffanysmandarin.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/cropped-logo_tiffany2-1.png\"},\"sameAs\":[\"https:\\\/\\\/www.instagram.com\\\/tiffanys_talk\\\/\",\"https:\\\/\\\/www.linkedin.com\\\/in\\\/tiffany-huang-mandarin\\\/\"],\"url\":\"https:\\\/\\\/tiffanysmandarin.com\\\/index.php\\\/author\\\/tiffany\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"\u7cb5\u8a9e\u5b78\u751f\u5c08\u7528 - OneDotDot Chinese","description":"Pronunciation Lab \u00b7 For Cantonese Speakers","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/tiffanysmandarin.com\/index.php\/2026\/10\/27\/for-cantonese-speakers\/","og_locale":"en_US","og_type":"article","og_title":"\u7cb5\u8a9e\u5b78\u751f\u5c08\u7528 - OneDotDot Chinese","og_description":"Pronunciation Lab \u00b7 For Cantonese Speakers","og_url":"https:\/\/tiffanysmandarin.com\/index.php\/2026\/10\/27\/for-cantonese-speakers\/","og_site_name":"OneDotDot Chinese","article_published_time":"2026-10-27T15:20:56+00:00","article_modified_time":"2026-10-27T15:20:59+00:00","author":"tiffany","twitter_card":"summary_large_image","twitter_misc":{"Written by":"tiffany","Est. reading time":"1 minute"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/tiffanysmandarin.com\/index.php\/2026\/10\/27\/for-cantonese-speakers\/#article","isPartOf":{"@id":"https:\/\/tiffanysmandarin.com\/index.php\/2026\/10\/27\/for-cantonese-speakers\/"},"author":{"name":"tiffany","@id":"https:\/\/tiffanysmandarin.com\/#\/schema\/person\/3556e1160fac98b190d03b8aa8604d99"},"headline":"\u7cb5\u8a9e\u5b78\u751f\u5c08\u7528","datePublished":"2026-10-27T15:20:56+00:00","dateModified":"2026-10-27T15:20:59+00:00","mainEntityOfPage":{"@id":"https:\/\/tiffanysmandarin.com\/index.php\/2026\/10\/27\/for-cantonese-speakers\/"},"wordCount":68,"publisher":{"@id":"https:\/\/tiffanysmandarin.com\/#\/schema\/person\/3556e1160fac98b190d03b8aa8604d99"},"articleSection":["No category"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/tiffanysmandarin.com\/index.php\/2026\/10\/27\/for-cantonese-speakers\/","url":"https:\/\/tiffanysmandarin.com\/index.php\/2026\/10\/27\/for-cantonese-speakers\/","name":"\u7cb5\u8a9e\u5b78\u751f\u5c08\u7528 - OneDotDot Chinese","isPartOf":{"@id":"https:\/\/tiffanysmandarin.com\/#website"},"datePublished":"2026-10-27T15:20:56+00:00","dateModified":"2026-10-27T15:20:59+00:00","description":"Pronunciation Lab \u00b7 For Cantonese Speakers","breadcrumb":{"@id":"https:\/\/tiffanysmandarin.com\/index.php\/2026\/10\/27\/for-cantonese-speakers\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/tiffanysmandarin.com\/index.php\/2026\/10\/27\/for-cantonese-speakers\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/tiffanysmandarin.com\/index.php\/2026\/10\/27\/for-cantonese-speakers\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9801","item":"https:\/\/tiffanysmandarin.com\/"},{"@type":"ListItem","position":2,"name":"\u7cb5\u8a9e\u5b78\u751f\u5c08\u7528"}]},{"@type":"WebSite","@id":"https:\/\/tiffanysmandarin.com\/#website","url":"https:\/\/tiffanysmandarin.com\/","name":"OneDotDot Chinese","description":"Learn a little Chinese every day","publisher":{"@id":"https:\/\/tiffanysmandarin.com\/#\/schema\/person\/3556e1160fac98b190d03b8aa8604d99"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/tiffanysmandarin.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/tiffanysmandarin.com\/#\/schema\/person\/3556e1160fac98b190d03b8aa8604d99","name":"tiffany","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"http:\/\/tiffanysmandarin.com\/wp-content\/uploads\/2022\/06\/cropped-logo_tiffany2-1.png","url":"http:\/\/tiffanysmandarin.com\/wp-content\/uploads\/2022\/06\/cropped-logo_tiffany2-1.png","contentUrl":"http:\/\/tiffanysmandarin.com\/wp-content\/uploads\/2022\/06\/cropped-logo_tiffany2-1.png","width":214,"height":214,"caption":"tiffany"},"logo":{"@id":"http:\/\/tiffanysmandarin.com\/wp-content\/uploads\/2022\/06\/cropped-logo_tiffany2-1.png"},"sameAs":["https:\/\/www.instagram.com\/tiffanys_talk\/","https:\/\/www.linkedin.com\/in\/tiffany-huang-mandarin\/"],"url":"https:\/\/tiffanysmandarin.com\/index.php\/author\/tiffany\/"}]}},"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/tiffanysmandarin.com\/index.php\/wp-json\/wp\/v2\/posts\/18687","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tiffanysmandarin.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/tiffanysmandarin.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/tiffanysmandarin.com\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/tiffanysmandarin.com\/index.php\/wp-json\/wp\/v2\/comments?post=18687"}],"version-history":[{"count":2,"href":"https:\/\/tiffanysmandarin.com\/index.php\/wp-json\/wp\/v2\/posts\/18687\/revisions"}],"predecessor-version":[{"id":18689,"href":"https:\/\/tiffanysmandarin.com\/index.php\/wp-json\/wp\/v2\/posts\/18687\/revisions\/18689"}],"wp:attachment":[{"href":"https:\/\/tiffanysmandarin.com\/index.php\/wp-json\/wp\/v2\/media?parent=18687"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/tiffanysmandarin.com\/index.php\/wp-json\/wp\/v2\/categories?post=18687"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/tiffanysmandarin.com\/index.php\/wp-json\/wp\/v2\/tags?post=18687"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}