13 个版本 (5 个稳定版)

1.1.1 2022年7月24日
1.0.2 2022年7月10日
0.3.1 2022年7月8日
0.2.2 2022年7月7日
0.1.4 2022年7月3日

#427 in WebAssembly

每月26次下载

MIT/Apache

705KB
1K SLoC

Rust 844 SLoC JavaScript 378 SLoC // 0.2% comments TypeScript 7 SLoC // 0.7% comments

text-to-sounds

build-svg test-svg codecov-svg crates-svg docs-svg deps-svg

文本转声音解析工具。用于 Spoken Sounds Highlighter

Website screenshot

概述

该库提供了函数(parseserialize)来将文本解析为 Vec<Sound>,并将 Vec<Sound> 序列化为 StringSound 结构体包含关于英语发音的信息。highlight 函数可以向文本添加 html 标签,以便通过 css 在浏览器中突出显示声音。

如果您对 JavaScript(WASM)版本感兴趣,请移至下面的 Javascript / WASM 部分。

use uuid::Uuid;

// English sound kinds
enum SoundKind {
    Ptk,
    Th,
    W,
    V,
    Ng,
    Ch,
    Dj,
    Undefined,
}

// Struct of the sound
pub struct Sound {
    id: Uuid,
    kind: SoundKind,
    text: String,
}

安装

为了使用此 crate,您必须在您的 [dependencies] 中将其添加到您的 Cargo.toml

[dependencies]
text-to-sounds = "1.1.1"

JavaScript / WASM

www 目录中,您可以找到网站 Spoken Sounds Highlighter 的源代码。它使用 wasm 版本的 highlight 函数。您也可以从 npm 获取它。

npm i --save text-to-sounds

并且使用

import {highlight_wasm} from "text-to-sounds";

// example #1
// "<span class='Th'>Th</span>e <span class='Ptk'>t</span>ex<span class='Ptk'>t</span> <span class='Dj'>j</span>us<span class='Ptk'>t</span> in <span class='Ptk'>c</span>ase"
const highlightedText = highlight_wasm("The text just in case");


// example #2
const contenteditableEl = document.getElementById('contenteditable');
contenteditableEl.innerHTML = highlight_wasm(contenteditableEl.textContent);

请考虑添加一些 css 样式给这些类,然后我们就完成了

.Ptk, .Th, .W, .V, .Ng, .Ch, .Dj {
    font-weight: 700;
}

.Ptk {
    color: #7F7EFF;
}

.Th {
    color: #A390E4;
}

.W {
    color: #C69DD2;
}

.V {
    color: #CC8B8C;
}

.Ng {
    color: #C68866;
}

.Ch {
    color: #417B5A;
}

.Dj {
    color: #4B3F72;
}

您可以在 Spoken Sounds Highlighter 网站的源代码中的 www 目录找到一个可工作的示例。

示例

use text_to_sounds::{parse, serialize, highlight, SoundKind, Sound};

let sounds = vec![
    Sound::new(SoundKind::Th, String::from("Th")),
    Sound::new(SoundKind::Undefined, String::from("e")),
    Sound::new(SoundKind::Undefined, String::from(" ")),
    Sound::new(SoundKind::Ptk, String::from("t")),
    Sound::new(SoundKind::Undefined, String::from("e")),
    Sound::new(SoundKind::Undefined, String::from("x")),
    Sound::new(SoundKind::Ptk, String::from("t")),
    Sound::new(SoundKind::Undefined, String::from(" ")),
    Sound::new(SoundKind::Dj, String::from("j")),
    Sound::new(SoundKind::Undefined, String::from("u")),
    Sound::new(SoundKind::Undefined, String::from("s")),
    Sound::new(SoundKind::Ptk, String::from("t")),
    Sound::new(SoundKind::Undefined, String::from(" ")),
    Sound::new(SoundKind::Undefined, String::from("i")),
    Sound::new(SoundKind::Undefined, String::from("n")),
    Sound::new(SoundKind::Undefined, String::from(" ")),
    Sound::new(SoundKind::Ptk, String::from("c")),
    Sound::new(SoundKind::Undefined, String::from("a")),
    Sound::new(SoundKind::Undefined, String::from("s")),
    Sound::new(SoundKind::Undefined, String::from("e")),
];

// parse
assert_eq!(parse("The text just in case"), sounds);

// serialize
assert_eq!(serialize(sounds), "The text just in case");

// highlight
assert_eq!(highlight("The text just in case"), "<span class='Th'>Th</span>e <span class='Ptk'>t</span>ex<span class='Ptk'>t</span> <span class='Dj'>j</span>us<span class='Ptk'>t</span> in <span class='Ptk'>c</span>ase".to_string());

此外,您还可以考虑文件中的测试。

依赖

~1–1.9MB
~36K SLoC