caesar-abrham Abrham Belete commited on
Commit
0e80266
·
0 Parent(s):

Chaka-ASR public release

Browse files

Co-authored-by: Abrham Belete <Abrham Belete@users.noreply.huggingface.co>

.gitattributes ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ *.7z filter=lfs diff=lfs merge=lfs -text
2
+ *.arrow filter=lfs diff=lfs merge=lfs -text
3
+ *.bin filter=lfs diff=lfs merge=lfs -text
4
+ *.bz2 filter=lfs diff=lfs merge=lfs -text
5
+ *.ckpt filter=lfs diff=lfs merge=lfs -text
6
+ *.ftz filter=lfs diff=lfs merge=lfs -text
7
+ *.gz filter=lfs diff=lfs merge=lfs -text
8
+ *.h5 filter=lfs diff=lfs merge=lfs -text
9
+ *.joblib filter=lfs diff=lfs merge=lfs -text
10
+ *.lfs.* filter=lfs diff=lfs merge=lfs -text
11
+ *.mlmodel filter=lfs diff=lfs merge=lfs -text
12
+ *.model filter=lfs diff=lfs merge=lfs -text
13
+ *.msgpack filter=lfs diff=lfs merge=lfs -text
14
+ *.npy filter=lfs diff=lfs merge=lfs -text
15
+ *.npz filter=lfs diff=lfs merge=lfs -text
16
+ *.onnx filter=lfs diff=lfs merge=lfs -text
17
+ *.ot filter=lfs diff=lfs merge=lfs -text
18
+ *.parquet filter=lfs diff=lfs merge=lfs -text
19
+ *.pb filter=lfs diff=lfs merge=lfs -text
20
+ *.pickle filter=lfs diff=lfs merge=lfs -text
21
+ *.pkl filter=lfs diff=lfs merge=lfs -text
22
+ *.pt filter=lfs diff=lfs merge=lfs -text
23
+ *.pth filter=lfs diff=lfs merge=lfs -text
24
+ *.rar filter=lfs diff=lfs merge=lfs -text
25
+ *.safetensors filter=lfs diff=lfs merge=lfs -text
26
+ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
27
+ *.tar.* filter=lfs diff=lfs merge=lfs -text
28
+ *.tar filter=lfs diff=lfs merge=lfs -text
29
+ *.tflite filter=lfs diff=lfs merge=lfs -text
30
+ *.tgz filter=lfs diff=lfs merge=lfs -text
31
+ *.wasm filter=lfs diff=lfs merge=lfs -text
32
+ *.xz filter=lfs diff=lfs merge=lfs -text
33
+ *.zip filter=lfs diff=lfs merge=lfs -text
34
+ *.zst filter=lfs diff=lfs merge=lfs -text
35
+ *tfevents* filter=lfs diff=lfs merge=lfs -text
NOTICE.md ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ # Upstream credits
2
+
3
+ Chaka-ASR is fine-tuned from badrex/Ethio-ASR-amharic, which declares CC BY 4.0, and builds on facebook/w2v-bert-2.0.
4
+
5
+ Adaptation used Leyu Amharic speech datasets with WAXAL replay. Consult upstream model cards and dataset terms for attribution and applicable conditions.
6
+
7
+ This notice provides attribution and does not replace a LICENSE file or grant a new license.
README.md ADDED
@@ -0,0 +1,116 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ language:
3
+ - am
4
+ library_name: transformers
5
+ pipeline_tag: automatic-speech-recognition
6
+ base_model: badrex/Ethio-ASR-amharic
7
+ base_model_relation: finetune
8
+ tags:
9
+ - amharic
10
+ - speech-recognition
11
+ - wav2vec2-bert
12
+ - ctc
13
+ - leyu
14
+ ---
15
+
16
+ # Chaka-ASR
17
+
18
+ **Amharic automatic speech recognition**
19
+
20
+ Chaka-ASR converts Amharic speech into text. The model is fine-tuned from [badrex/Ethio-ASR-amharic](https://huggingface.co/badrex/Ethio-ASR-amharic) using Leyu Amharic speech data, with WAXAL replay during training.
21
+
22
+ It is intended for transcription, voice interfaces, and speech applications in Ethiopian contexts, including environments where background noise may be present.
23
+
24
+ ## Model details
25
+
26
+ | Property | Details |
27
+ |---|---|
28
+ | Model ID | `abrilo/Chaka-ASR` |
29
+ | Maintainer | [abrilo](https://huggingface.co/abrilo) |
30
+ | Language | Amharic |
31
+ | Task | Automatic speech recognition |
32
+ | Architecture | Wav2Vec2-BERT with a CTC output head |
33
+ | Parameters | Approximately 606 million |
34
+ | Starting checkpoint | `badrex/Ethio-ASR-amharic` |
35
+ | Input | Mono audio at 16,000 Hz |
36
+ | Output | Amharic text |
37
+ | Weights | Safetensors, float32 |
38
+
39
+ ## Training overview
40
+
41
+ Chaka-ASR was adapted using Leyu Amharic speech datasets. Training also included sampled WAXAL examples as replay data. The training summary records 8,900 training steps and speaker-separated Leyu training, validation, and test splits.
42
+
43
+ The starting checkpoint is an Amharic model from the Ethio-ASR project, based on `facebook/w2v-bert-2.0`. Chaka-ASR builds on that work; it is not trained from scratch.
44
+
45
+ ## Evaluation
46
+
47
+ | Dataset | WER (%) ??? | CER (%) ??? |
48
+ |---|---:|---:|
49
+ | Leyu | 20.48 | 6.02 |
50
+
51
+ The reported Leyu result was measured on its Addis Ababa dialect test subset. It is a subset result rather than an aggregate score for the complete Leyu dataset. WER is word error rate and CER is character error rate; lower values indicate fewer errors.
52
+
53
+ These values come from the recorded evaluation of the released checkpoint. They are not a direct comparison against the starting model. The original evaluation's text normalization and decoding settings should be consulted before reproducing or comparing these scores.
54
+
55
+ ## Quick start
56
+
57
+ Install the example dependencies in a separate Python environment:
58
+
59
+ ```bash
60
+ python -m pip install -r requirements-example.txt
61
+ ```
62
+
63
+ Run the included example on a WAV or FLAC recording:
64
+
65
+ ```bash
66
+ python examples/transcribe.py audio.wav
67
+ ```
68
+
69
+ The example converts stereo audio to mono, resamples it to 16 kHz, and uses greedy CTC decoding. It uses an NVIDIA GPU when CUDA is available and otherwise runs on CPU. Audio is processed as a complete clip; this example does not implement live streaming or long-recording segmentation.
70
+
71
+ The checkpoint configuration records Transformers `5.16.1`. The dependency file uses that version as its minimum; the example must still be checked in your target runtime before production use. Install a PyTorch build appropriate for your hardware if GPU inference is required.
72
+
73
+ ## Intended uses
74
+
75
+ - Amharic audio transcription.
76
+ - Voice assistants and conversational applications.
77
+ - Speech interfaces for customer service and accessibility.
78
+ - Research and evaluation of Amharic speech recognition.
79
+
80
+ ## Background noise
81
+
82
+ Chaka-ASR is intended for applications that may encounter background noise. Actual performance depends on microphone placement, speech clarity, reverberation, and the level and type of noise. The published Leyu result does not establish a separate noise robustness benchmark. Evaluate the model on representative recordings from your deployment environment.
83
+
84
+ ## Limitations
85
+
86
+ Recognition quality may vary with dialect, recording conditions, speaking style, and overlapping speech. Names, numbers, abbreviations, and mixed-language speech may require additional review. The model produces transcriptions; it does not verify identity, amounts, or factual content.
87
+
88
+ The reported error rates describe the evaluated subset and should not be treated as guaranteed performance for all Amharic recordings.
89
+
90
+ ## Attribution
91
+
92
+ Chaka-ASR acknowledges:
93
+
94
+ - [Ethio-ASR](https://huggingface.co/collections/badrex/ethio-asr), including the Amharic starting checkpoint.
95
+ - [facebook/w2v-bert-2.0](https://huggingface.co/facebook/w2v-bert-2.0), the upstream architecture and pretrained model.
96
+ - Leyu Amharic speech datasets used for adaptation.
97
+ - [WAXAL](https://huggingface.co/datasets/google/WaxalNLP), used as replay data during adaptation.
98
+
99
+ ## License
100
+
101
+ A release license for Chaka-ASR has not yet been declared in this repository. The upstream Ethio-ASR Amharic model declares CC BY 4.0. Consult the applicable upstream model and dataset terms; public availability alone is not a license grant.
102
+
103
+ ## Feedback
104
+
105
+ Report transcription issues and technical questions in the [Community tab](https://huggingface.co/abrilo/Chaka-ASR/discussions). Include the model revision and runtime versions. Share recordings only when you have permission and remove personal or confidential information.
106
+
107
+ ## Citation
108
+
109
+ ```bibtex
110
+ @misc{chaka_asr_2026,
111
+ author = {abrilo},
112
+ title = {Chaka-ASR: Amharic Automatic Speech Recognition},
113
+ year = {2026},
114
+ url = {https://huggingface.co/abrilo/Chaka-ASR}
115
+ }
116
+ ```
added_tokens.json ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ {
2
+ "</s>": 410,
3
+ "<s>": 409
4
+ }
config.json ADDED
@@ -0,0 +1,82 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "activation_dropout": 0.0,
3
+ "adapter_act": "relu",
4
+ "adapter_kernel_size": 3,
5
+ "adapter_stride": 2,
6
+ "add_adapter": true,
7
+ "apply_spec_augment": false,
8
+ "architectures": [
9
+ "Wav2Vec2BertForCTC"
10
+ ],
11
+ "attention_dropout": 0.0,
12
+ "bos_token_id": 1,
13
+ "classifier_proj_size": 768,
14
+ "codevector_dim": 768,
15
+ "conformer_conv_dropout": 0.1,
16
+ "contrastive_logits_temperature": 0.1,
17
+ "conv_depthwise_kernel_size": 31,
18
+ "ctc_loss_reduction": "mean",
19
+ "ctc_zero_infinity": true,
20
+ "diversity_loss_weight": 0.1,
21
+ "dtype": "float32",
22
+ "eos_token_id": 2,
23
+ "feat_proj_dropout": 0.0,
24
+ "feat_quantizer_dropout": 0.0,
25
+ "feature_projection_input_dim": 160,
26
+ "final_dropout": 0.1,
27
+ "hidden_act": "swish",
28
+ "hidden_dropout": 0.0,
29
+ "hidden_size": 1024,
30
+ "initializer_range": 0.02,
31
+ "intermediate_size": 4096,
32
+ "layer_norm_eps": 1e-05,
33
+ "layerdrop": 0.0,
34
+ "left_max_position_embeddings": 64,
35
+ "mask_feature_length": 10,
36
+ "mask_feature_min_masks": 0,
37
+ "mask_feature_prob": 0.0,
38
+ "mask_time_length": 10,
39
+ "mask_time_min_masks": 2,
40
+ "mask_time_prob": 0.0,
41
+ "max_source_positions": 5000,
42
+ "model_type": "wav2vec2-bert",
43
+ "num_adapter_layers": 1,
44
+ "num_attention_heads": 16,
45
+ "num_codevector_groups": 2,
46
+ "num_codevectors_per_group": 320,
47
+ "num_hidden_layers": 24,
48
+ "num_negatives": 100,
49
+ "output_hidden_size": 1024,
50
+ "pad_token_id": 408,
51
+ "position_embeddings_type": "relative_key",
52
+ "proj_codevector_dim": 768,
53
+ "right_max_position_embeddings": 8,
54
+ "rotary_embedding_base": 10000,
55
+ "tdnn_dilation": [
56
+ 1,
57
+ 2,
58
+ 3,
59
+ 1,
60
+ 1
61
+ ],
62
+ "tdnn_dim": [
63
+ 512,
64
+ 512,
65
+ 512,
66
+ 512,
67
+ 1500
68
+ ],
69
+ "tdnn_kernel": [
70
+ 5,
71
+ 3,
72
+ 3,
73
+ 1,
74
+ 1
75
+ ],
76
+ "transformers_version": "5.16.1",
77
+ "use_cache": false,
78
+ "use_intermediate_ffn_before_adapter": false,
79
+ "use_weighted_layer_sum": false,
80
+ "vocab_size": 411,
81
+ "xvector_output_dim": 512
82
+ }
examples/transcribe.py ADDED
@@ -0,0 +1,38 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Transcribe a short WAV or FLAC recording with Chaka-ASR."""
2
+ import argparse
3
+ from math import gcd
4
+ import numpy as np
5
+ import soundfile as sf
6
+ import torch
7
+ from scipy.signal import resample_poly
8
+ from transformers import AutoProcessor, AutoModelForCTC
9
+
10
+
11
+ def main():
12
+ parser = argparse.ArgumentParser(description=__doc__)
13
+ parser.add_argument("audio", help="Path to a WAV or FLAC recording")
14
+ parser.add_argument("--revision", default="main", help="Model commit or branch")
15
+ args = parser.parse_args()
16
+ audio, sample_rate = sf.read(args.audio, dtype="float32", always_2d=True)
17
+ audio = audio.mean(axis=1)
18
+ if audio.size == 0:
19
+ raise ValueError("Audio recording is empty")
20
+ if not np.isfinite(audio).all():
21
+ raise ValueError("Audio contains non-finite samples")
22
+ processor = AutoProcessor.from_pretrained("abrilo/Chaka-ASR", revision=args.revision)
23
+ model = AutoModelForCTC.from_pretrained("abrilo/Chaka-ASR", revision=args.revision)
24
+ target_rate = processor.feature_extractor.sampling_rate
25
+ if sample_rate != target_rate:
26
+ divisor = gcd(sample_rate, target_rate)
27
+ audio = resample_poly(audio, target_rate // divisor, sample_rate // divisor).astype("float32")
28
+ device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
29
+ model.to(device).eval()
30
+ inputs = processor(audio, sampling_rate=target_rate, return_tensors="pt")
31
+ inputs = {key: value.to(device) for key, value in inputs.items()}
32
+ with torch.inference_mode():
33
+ predicted = model(**inputs).logits.argmax(dim=-1)
34
+ print(processor.batch_decode(predicted.cpu())[0])
35
+
36
+
37
+ if __name__ == "__main__":
38
+ main()
model.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:e5a31340cab11ae2cc77c99e417b9e77fa25a5b6d152fc4bd740ae2a908eefdf
3
+ size 2424499668
processor_config.json ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "feature_extractor": {
3
+ "feature_extractor_type": "SeamlessM4TFeatureExtractor",
4
+ "feature_size": 80,
5
+ "num_mel_bins": 80,
6
+ "padding_side": "right",
7
+ "padding_value": 1,
8
+ "return_attention_mask": true,
9
+ "sampling_rate": 16000,
10
+ "stride": 2
11
+ },
12
+ "processor_class": "Wav2Vec2BertProcessor"
13
+ }
requirements-example.txt ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ # Example dependencies; install a hardware-compatible PyTorch build for CUDA.
2
+ transformers>=5.16.1,<6
3
+ torch>=2.6
4
+ safetensors>=0.4
5
+ numpy>=1.26
6
+ scipy>=1.11
7
+ soundfile>=0.12
tokenizer_config.json ADDED
@@ -0,0 +1,62 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "added_tokens_decoder": {
3
+ "0": {
4
+ "content": "|",
5
+ "lstrip": false,
6
+ "normalized": false,
7
+ "rstrip": false,
8
+ "single_word": false,
9
+ "special": true
10
+ },
11
+ "407": {
12
+ "content": "[UNK]",
13
+ "lstrip": true,
14
+ "normalized": false,
15
+ "rstrip": true,
16
+ "single_word": false,
17
+ "special": false
18
+ },
19
+ "408": {
20
+ "content": "[PAD]",
21
+ "lstrip": true,
22
+ "normalized": false,
23
+ "rstrip": true,
24
+ "single_word": false,
25
+ "special": false
26
+ },
27
+ "409": {
28
+ "content": "<s>",
29
+ "lstrip": false,
30
+ "normalized": false,
31
+ "rstrip": false,
32
+ "single_word": false,
33
+ "special": true
34
+ },
35
+ "410": {
36
+ "content": "</s>",
37
+ "lstrip": false,
38
+ "normalized": false,
39
+ "rstrip": false,
40
+ "single_word": false,
41
+ "special": true
42
+ }
43
+ },
44
+ "backend": "custom",
45
+ "bos_token": "<s>",
46
+ "clean_up_tokenization_spaces": false,
47
+ "do_lower_case": false,
48
+ "eos_token": "</s>",
49
+ "is_local": false,
50
+ "local_files_only": true,
51
+ "model_max_length": 1000000000000000019884624838656,
52
+ "model_specific_special_tokens": {
53
+ "word_delimiter_token": "|"
54
+ },
55
+ "pad_token": "[PAD]",
56
+ "processor_class": "Wav2Vec2BertProcessor",
57
+ "replace_word_delimiter_char": " ",
58
+ "target_lang": null,
59
+ "tokenizer_class": "Wav2Vec2CTCTokenizer",
60
+ "unk_token": "[UNK]",
61
+ "word_delimiter_token": "|"
62
+ }
vocab.json ADDED
@@ -0,0 +1,411 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "!": 1,
3
+ "#": 2,
4
+ "$": 3,
5
+ "%": 4,
6
+ "&": 5,
7
+ "'": 6,
8
+ "*": 7,
9
+ "+": 8,
10
+ ",": 9,
11
+ "-": 10,
12
+ ".": 11,
13
+ "0": 12,
14
+ "1": 13,
15
+ "2": 14,
16
+ "3": 15,
17
+ "4": 16,
18
+ "5": 17,
19
+ "6": 18,
20
+ "7": 19,
21
+ "8": 20,
22
+ "9": 21,
23
+ "=": 22,
24
+ "?": 23,
25
+ "@": 24,
26
+ "[PAD]": 408,
27
+ "[UNK]": 407,
28
+ "a": 25,
29
+ "b": 26,
30
+ "c": 27,
31
+ "d": 28,
32
+ "e": 29,
33
+ "f": 30,
34
+ "g": 31,
35
+ "h": 32,
36
+ "i": 33,
37
+ "j": 34,
38
+ "k": 35,
39
+ "l": 36,
40
+ "m": 37,
41
+ "n": 38,
42
+ "o": 39,
43
+ "p": 40,
44
+ "q": 41,
45
+ "r": 42,
46
+ "s": 43,
47
+ "t": 44,
48
+ "u": 45,
49
+ "v": 46,
50
+ "w": 47,
51
+ "x": 48,
52
+ "y": 49,
53
+ "z": 50,
54
+ "|": 0,
55
+ "ሀ": 51,
56
+ "ሁ": 52,
57
+ "ሂ": 53,
58
+ "ሃ": 54,
59
+ "ሄ": 55,
60
+ "ህ": 56,
61
+ "ሆ": 57,
62
+ "ሇ": 58,
63
+ "ለ": 59,
64
+ "ሉ": 60,
65
+ "ሊ": 61,
66
+ "ላ": 62,
67
+ "ሌ": 63,
68
+ "ል": 64,
69
+ "ሎ": 65,
70
+ "ሏ": 66,
71
+ "ሐ": 67,
72
+ "ሑ": 68,
73
+ "ሒ": 69,
74
+ "ሓ": 70,
75
+ "ሔ": 71,
76
+ "ሕ": 72,
77
+ "ሖ": 73,
78
+ "ሗ": 74,
79
+ "መ": 75,
80
+ "ሙ": 76,
81
+ "ሚ": 77,
82
+ "ማ": 78,
83
+ "ሜ": 79,
84
+ "ም": 80,
85
+ "ሞ": 81,
86
+ "ሟ": 82,
87
+ "ሠ": 83,
88
+ "ሡ": 84,
89
+ "ሢ": 85,
90
+ "ሣ": 86,
91
+ "ሤ": 87,
92
+ "ሥ": 88,
93
+ "ሦ": 89,
94
+ "ሧ": 90,
95
+ "ረ": 91,
96
+ "ሩ": 92,
97
+ "ሪ": 93,
98
+ "ራ": 94,
99
+ "ሬ": 95,
100
+ "ር": 96,
101
+ "ሮ": 97,
102
+ "ሯ": 98,
103
+ "ሰ": 99,
104
+ "ሱ": 100,
105
+ "ሲ": 101,
106
+ "ሳ": 102,
107
+ "ሴ": 103,
108
+ "ስ": 104,
109
+ "ሶ": 105,
110
+ "ሷ": 106,
111
+ "ሸ": 107,
112
+ "ሹ": 108,
113
+ "ሺ": 109,
114
+ "ሻ": 110,
115
+ "ሼ": 111,
116
+ "ሽ": 112,
117
+ "ሾ": 113,
118
+ "ሿ": 114,
119
+ "ቀ": 115,
120
+ "ቁ": 116,
121
+ "ቂ": 117,
122
+ "ቃ": 118,
123
+ "ቄ": 119,
124
+ "ቅ": 120,
125
+ "ቆ": 121,
126
+ "ቇ": 122,
127
+ "ቈ": 123,
128
+ "ቊ": 124,
129
+ "ቋ": 125,
130
+ "ቌ": 126,
131
+ "ቍ": 127,
132
+ "ቐ": 128,
133
+ "ቑ": 129,
134
+ "ቒ": 130,
135
+ "ቓ": 131,
136
+ "ቔ": 132,
137
+ "ቕ": 133,
138
+ "ቖ": 134,
139
+ "ቘ": 135,
140
+ "ቚ": 136,
141
+ "ቛ": 137,
142
+ "ቜ": 138,
143
+ "ቝ": 139,
144
+ "በ": 140,
145
+ "ቡ": 141,
146
+ "ቢ": 142,
147
+ "ባ": 143,
148
+ "ቤ": 144,
149
+ "ብ": 145,
150
+ "ቦ": 146,
151
+ "ቧ": 147,
152
+ "ቨ": 148,
153
+ "ቩ": 149,
154
+ "ቪ": 150,
155
+ "ቫ": 151,
156
+ "ቬ": 152,
157
+ "ቭ": 153,
158
+ "ቮ": 154,
159
+ "ቯ": 155,
160
+ "ተ": 156,
161
+ "ቱ": 157,
162
+ "ቲ": 158,
163
+ "ታ": 159,
164
+ "ቴ": 160,
165
+ "ት": 161,
166
+ "ቶ": 162,
167
+ "ቷ": 163,
168
+ "ቸ": 164,
169
+ "ቹ": 165,
170
+ "ቺ": 166,
171
+ "ቻ": 167,
172
+ "ቼ": 168,
173
+ "ች": 169,
174
+ "ቾ": 170,
175
+ "ቿ": 171,
176
+ "ኀ": 172,
177
+ "ኁ": 173,
178
+ "ኂ": 174,
179
+ "ኃ": 175,
180
+ "ኄ": 176,
181
+ "ኅ": 177,
182
+ "ኆ": 178,
183
+ "ኇ": 179,
184
+ "ኈ": 180,
185
+ "ኊ": 181,
186
+ "ኋ": 182,
187
+ "ኌ": 183,
188
+ "ኍ": 184,
189
+ "ነ": 185,
190
+ "ኑ": 186,
191
+ "ኒ": 187,
192
+ "ና": 188,
193
+ "ኔ": 189,
194
+ "ን": 190,
195
+ "ኖ": 191,
196
+ "ኗ": 192,
197
+ "ኘ": 193,
198
+ "ኙ": 194,
199
+ "ኚ": 195,
200
+ "ኛ": 196,
201
+ "ኜ": 197,
202
+ "ኝ": 198,
203
+ "ኞ": 199,
204
+ "ኟ": 200,
205
+ "አ": 201,
206
+ "ኡ": 202,
207
+ "ኢ": 203,
208
+ "ኣ": 204,
209
+ "ኤ": 205,
210
+ "እ": 206,
211
+ "ኦ": 207,
212
+ "ኧ": 208,
213
+ "ከ": 209,
214
+ "ኩ": 210,
215
+ "ኪ": 211,
216
+ "ካ": 212,
217
+ "ኬ": 213,
218
+ "ክ": 214,
219
+ "ኮ": 215,
220
+ "ኯ": 216,
221
+ "ኰ": 217,
222
+ "ኲ": 218,
223
+ "ኳ": 219,
224
+ "ኴ": 220,
225
+ "ኵ": 221,
226
+ "ኸ": 222,
227
+ "ኹ": 223,
228
+ "ኺ": 224,
229
+ "ኻ": 225,
230
+ "ኼ": 226,
231
+ "ኽ": 227,
232
+ "ኾ": 228,
233
+ "ዀ": 229,
234
+ "ዂ": 230,
235
+ "ዃ": 231,
236
+ "ዄ": 232,
237
+ "ዅ": 233,
238
+ "ወ": 234,
239
+ "ዉ": 235,
240
+ "ዊ": 236,
241
+ "ዋ": 237,
242
+ "ዌ": 238,
243
+ "ው": 239,
244
+ "ዎ": 240,
245
+ "ዏ": 241,
246
+ "ዐ": 242,
247
+ "ዑ": 243,
248
+ "ዒ": 244,
249
+ "ዓ": 245,
250
+ "ዔ": 246,
251
+ "ዕ": 247,
252
+ "ዖ": 248,
253
+ "ዘ": 249,
254
+ "ዙ": 250,
255
+ "ዚ": 251,
256
+ "ዛ": 252,
257
+ "ዜ": 253,
258
+ "ዝ": 254,
259
+ "ዞ": 255,
260
+ "ዟ": 256,
261
+ "ዠ": 257,
262
+ "ዡ": 258,
263
+ "ዢ": 259,
264
+ "ዣ": 260,
265
+ "ዤ": 261,
266
+ "ዥ": 262,
267
+ "ዦ": 263,
268
+ "ዧ": 264,
269
+ "የ": 265,
270
+ "ዩ": 266,
271
+ "ዪ": 267,
272
+ "ያ": 268,
273
+ "ዬ": 269,
274
+ "ይ": 270,
275
+ "ዮ": 271,
276
+ "ዯ": 272,
277
+ "ደ": 273,
278
+ "ዱ": 274,
279
+ "ዲ": 275,
280
+ "ዳ": 276,
281
+ "ዴ": 277,
282
+ "ድ": 278,
283
+ "ዶ": 279,
284
+ "ዷ": 280,
285
+ "ዸ": 281,
286
+ "ዹ": 282,
287
+ "ዺ": 283,
288
+ "ዻ": 284,
289
+ "ዼ": 285,
290
+ "ዽ": 286,
291
+ "ዾ": 287,
292
+ "ዿ": 288,
293
+ "ጀ": 289,
294
+ "ጁ": 290,
295
+ "ጂ": 291,
296
+ "ጃ": 292,
297
+ "ጄ": 293,
298
+ "ጅ": 294,
299
+ "ጆ": 295,
300
+ "ጇ": 296,
301
+ "ገ": 297,
302
+ "ጉ": 298,
303
+ "ጊ": 299,
304
+ "ጋ": 300,
305
+ "ጌ": 301,
306
+ "ግ": 302,
307
+ "ጎ": 303,
308
+ "ጏ": 304,
309
+ "ጐ": 305,
310
+ "ጒ": 306,
311
+ "ጓ": 307,
312
+ "ጔ": 308,
313
+ "ጕ": 309,
314
+ "ጘ": 310,
315
+ "ጙ": 311,
316
+ "ጚ": 312,
317
+ "ጛ": 313,
318
+ "ጜ": 314,
319
+ "ጝ": 315,
320
+ "ጞ": 316,
321
+ "ጟ": 317,
322
+ "ጠ": 318,
323
+ "ጡ": 319,
324
+ "ጢ": 320,
325
+ "ጣ": 321,
326
+ "ጤ": 322,
327
+ "ጥ": 323,
328
+ "ጦ": 324,
329
+ "ጧ": 325,
330
+ "ጨ": 326,
331
+ "ጩ": 327,
332
+ "ጪ": 328,
333
+ "ጫ": 329,
334
+ "ጬ": 330,
335
+ "ጭ": 331,
336
+ "ጮ": 332,
337
+ "ጯ": 333,
338
+ "ጰ": 334,
339
+ "ጱ": 335,
340
+ "ጲ": 336,
341
+ "ጳ": 337,
342
+ "ጴ": 338,
343
+ "ጵ": 339,
344
+ "ጶ": 340,
345
+ "ጷ": 341,
346
+ "ጸ": 342,
347
+ "ጹ": 343,
348
+ "ጺ": 344,
349
+ "ጻ": 345,
350
+ "ጼ": 346,
351
+ "ጽ": 347,
352
+ "ጾ": 348,
353
+ "ጿ": 349,
354
+ "ፀ": 350,
355
+ "ፁ": 351,
356
+ "ፂ": 352,
357
+ "ፃ": 353,
358
+ "ፄ": 354,
359
+ "ፅ": 355,
360
+ "ፆ": 356,
361
+ "ፇ": 357,
362
+ "ፈ": 358,
363
+ "ፉ": 359,
364
+ "ፊ": 360,
365
+ "ፋ": 361,
366
+ "ፌ": 362,
367
+ "ፍ": 363,
368
+ "ፎ": 364,
369
+ "ፏ": 365,
370
+ "ፐ": 366,
371
+ "ፑ": 367,
372
+ "ፒ": 368,
373
+ "ፓ": 369,
374
+ "ፔ": 370,
375
+ "ፕ": 371,
376
+ "ፖ": 372,
377
+ "ፗ": 373,
378
+ "ፘ": 374,
379
+ "ፙ": 375,
380
+ "ፚ": 376,
381
+ "፠": 377,
382
+ "፡": 378,
383
+ "።": 379,
384
+ "፣": 380,
385
+ "፤": 381,
386
+ "፥": 382,
387
+ "፦": 383,
388
+ "፧": 384,
389
+ "፨": 385,
390
+ "፩": 386,
391
+ "፪": 387,
392
+ "፫": 388,
393
+ "፬": 389,
394
+ "፭": 390,
395
+ "፮": 391,
396
+ "፯": 392,
397
+ "፰": 393,
398
+ "፱": 394,
399
+ "፲": 395,
400
+ "፳": 396,
401
+ "፴": 397,
402
+ "፵": 398,
403
+ "፶": 399,
404
+ "፷": 400,
405
+ "፸": 401,
406
+ "፹": 402,
407
+ "፺": 403,
408
+ "፻": 404,
409
+ "፼": 405,
410
+ "€": 406
411
+ }