From c67b6bf18b27129d70692dd875b48cd98b6beb25 Mon Sep 17 00:00:00 2001 From: ailia_watanabe Date: Thu, 18 Dec 2025 15:32:56 +0900 Subject: [PATCH 01/15] Setup sherpa-onnx structure --- .../sherpa-onnx/ailia_audio_utils.py | 68 +++ .../csrc/offline-ctc-greedy-search-decoder.cc | 54 ++ .../csrc/offline-ctc-greedy-search-decoder.h | 28 + ...ffline-transducer-greedy-search-decoder.cc | 87 +++ ...offline-transducer-greedy-search-decoder.h | 34 ++ .../sherpa-onnx/csrc/online-model-config.cc | 186 +++++++ .../sherpa-onnx/csrc/online-model-config.h | 90 +++ .../csrc/online-recognizer-impl.cc | 294 ++++++++++ .../sherpa-onnx/csrc/online-recognizer-impl.h | 74 +++ .../sherpa-onnx/csrc/online-recognizer.cc | 271 +++++++++ .../sherpa-onnx/csrc/online-recognizer.h | 229 ++++++++ .../sherpa-onnx/csrc/online-stream.cc | 285 ++++++++++ .../sherpa-onnx/csrc/online-stream.h | 121 ++++ .../csrc/online-transducer-model-config.cc | 51 ++ .../csrc/online-transducer-model-config.h | 32 ++ .../csrc/online-transducer-model.cc | 230 ++++++++ .../csrc/online-transducer-model.h | 147 +++++ .../csrc/online-zipformer-transducer-model.cc | 518 ++++++++++++++++++ .../csrc/online-zipformer-transducer-model.h | 99 ++++ .../online-zipformer2-ctc-model-config.cc | 42 ++ .../csrc/online-zipformer2-ctc-model-config.h | 29 + .../csrc/online-zipformer2-ctc-model.cc | 494 +++++++++++++++++ .../csrc/online-zipformer2-ctc-model.h | 76 +++ .../sherpa-onnx/online-decode-files.py | 449 +++++++++++++++ audio_processing/sherpa-onnx/sherpa-onnx.py | 325 +++++++++++ 25 files changed, 4313 insertions(+) create mode 100644 audio_processing/sherpa-onnx/ailia_audio_utils.py create mode 100644 audio_processing/sherpa-onnx/csrc/offline-ctc-greedy-search-decoder.cc create mode 100644 audio_processing/sherpa-onnx/csrc/offline-ctc-greedy-search-decoder.h create mode 100644 audio_processing/sherpa-onnx/csrc/offline-transducer-greedy-search-decoder.cc create mode 100644 audio_processing/sherpa-onnx/csrc/offline-transducer-greedy-search-decoder.h create mode 100644 audio_processing/sherpa-onnx/csrc/online-model-config.cc create mode 100644 audio_processing/sherpa-onnx/csrc/online-model-config.h create mode 100644 audio_processing/sherpa-onnx/csrc/online-recognizer-impl.cc create mode 100644 audio_processing/sherpa-onnx/csrc/online-recognizer-impl.h create mode 100644 audio_processing/sherpa-onnx/csrc/online-recognizer.cc create mode 100644 audio_processing/sherpa-onnx/csrc/online-recognizer.h create mode 100644 audio_processing/sherpa-onnx/csrc/online-stream.cc create mode 100644 audio_processing/sherpa-onnx/csrc/online-stream.h create mode 100644 audio_processing/sherpa-onnx/csrc/online-transducer-model-config.cc create mode 100644 audio_processing/sherpa-onnx/csrc/online-transducer-model-config.h create mode 100644 audio_processing/sherpa-onnx/csrc/online-transducer-model.cc create mode 100644 audio_processing/sherpa-onnx/csrc/online-transducer-model.h create mode 100644 audio_processing/sherpa-onnx/csrc/online-zipformer-transducer-model.cc create mode 100644 audio_processing/sherpa-onnx/csrc/online-zipformer-transducer-model.h create mode 100644 audio_processing/sherpa-onnx/csrc/online-zipformer2-ctc-model-config.cc create mode 100644 audio_processing/sherpa-onnx/csrc/online-zipformer2-ctc-model-config.h create mode 100644 audio_processing/sherpa-onnx/csrc/online-zipformer2-ctc-model.cc create mode 100644 audio_processing/sherpa-onnx/csrc/online-zipformer2-ctc-model.h create mode 100644 audio_processing/sherpa-onnx/online-decode-files.py create mode 100644 audio_processing/sherpa-onnx/sherpa-onnx.py diff --git a/audio_processing/sherpa-onnx/ailia_audio_utils.py b/audio_processing/sherpa-onnx/ailia_audio_utils.py new file mode 100644 index 000000000..06d973ed5 --- /dev/null +++ b/audio_processing/sherpa-onnx/ailia_audio_utils.py @@ -0,0 +1,68 @@ +import numpy as np +import ailia.audio +import soundfile as sf + +# hard-coded audio hyperparameters +SAMPLE_RATE = 16000 +N_FFT = 400 +HOP_LENGTH = 160 +CHUNK_LENGTH = 30 +N_SAMPLES = CHUNK_LENGTH * SAMPLE_RATE # 480000: number of samples in a chunk +N_FRAMES = (N_SAMPLES // HOP_LENGTH) # 3000: number of frames in a mel spectrogram input + + +def load_audio(file: str, sr: int = SAMPLE_RATE): + # prepare input data + wav, source_sr = sf.read(file) + # convert to mono + if len(wav.shape) >= 2 and wav.shape[1] == 2: + wav = np.mean(wav, axis=1) + # Resample the wav if needed + if source_sr is not None and source_sr != sr: + wav = ailia.audio.resample(wav, org_sr=source_sr, target_sr=sr) + return wav + + +def pad_or_trim(array, length=N_SAMPLES, axis=-1): + """ + Pad or trim the audio array to N_SAMPLES, as expected by the encoder. + """ + if array.shape[axis] > length: + array = array.take(indices=range(length), axis=axis) + + if array.shape[axis] < length: + pad_widths = [(0, 0)] * array.ndim + pad_widths[axis] = (0, length - array.shape[axis]) + array = np.pad(array, pad_widths) + + return array + + +def log_mel_spectrogram(audio, n_mels: int = 80, padding: int = 0): + """ + Compute the log-Mel spectrogram of + + Parameters + ---------- + audio: np.ndarray + n_mels: int + The number of Mel-frequency filters, only 80 is supported + padding: int + Number of zero samples to pad to the right + + Returns + ------- + A Tensor that contains the Mel spectrogram, shape = (80, n_frames) + """ + if padding > 0: + audio = np.pad(audio, (0, padding)) + + mel_spec = ailia.audio.mel_spectrogram( + audio, sample_rate=SAMPLE_RATE, fft_n=N_FFT, hop_n=HOP_LENGTH, + win_type="hann", center_mode=1, power=2.0, mel_n=n_mels) + + log_spec = np.log10(np.clip(mel_spec, 1e-10, None)) + log_spec = np.maximum(log_spec, np.max(log_spec) - 8.0) + log_spec = (log_spec + 4.0) / 4.0 + + return log_spec diff --git a/audio_processing/sherpa-onnx/csrc/offline-ctc-greedy-search-decoder.cc b/audio_processing/sherpa-onnx/csrc/offline-ctc-greedy-search-decoder.cc new file mode 100644 index 000000000..59d16f5d3 --- /dev/null +++ b/audio_processing/sherpa-onnx/csrc/offline-ctc-greedy-search-decoder.cc @@ -0,0 +1,54 @@ +// sherpa-onnx/csrc/offline-ctc-greedy-search-decoder.h +// +// Copyright (c) 2023 Xiaomi Corporation + +#include "sherpa-onnx/csrc/offline-ctc-greedy-search-decoder.h" + +#include +#include +#include + +#include "sherpa-onnx/csrc/macros.h" + +namespace sherpa_onnx { + +std::vector OfflineCtcGreedySearchDecoder::Decode( + Ort::Value log_probs, Ort::Value log_probs_length) { + std::vector shape = log_probs.GetTensorTypeAndShapeInfo().GetShape(); + int32_t batch_size = static_cast(shape[0]); + int32_t num_frames = static_cast(shape[1]); + int32_t vocab_size = static_cast(shape[2]); + + const int64_t *p_log_probs_length = log_probs_length.GetTensorData(); + + std::vector ans; + ans.reserve(batch_size); + + for (int32_t b = 0; b != batch_size; ++b) { + const float *p_log_probs = + log_probs.GetTensorData() + b * num_frames * vocab_size; + + OfflineCtcDecoderResult r; + int64_t prev_id = -1; + + for (int32_t t = 0; t != static_cast(p_log_probs_length[b]); ++t) { + auto y = static_cast(std::distance( + static_cast(p_log_probs), + std::max_element( + static_cast(p_log_probs), + static_cast(p_log_probs) + vocab_size))); + p_log_probs += vocab_size; + + if (y != blank_id_ && y != prev_id) { + r.tokens.push_back(y); + r.timestamps.push_back(t); + } + prev_id = y; + } // for (int32_t t = 0; ...) + + ans.push_back(std::move(r)); + } + return ans; +} + +} // namespace sherpa_onnx diff --git a/audio_processing/sherpa-onnx/csrc/offline-ctc-greedy-search-decoder.h b/audio_processing/sherpa-onnx/csrc/offline-ctc-greedy-search-decoder.h new file mode 100644 index 000000000..ccc2f728a --- /dev/null +++ b/audio_processing/sherpa-onnx/csrc/offline-ctc-greedy-search-decoder.h @@ -0,0 +1,28 @@ +// sherpa-onnx/csrc/offline-ctc-greedy-search-decoder.h +// +// Copyright (c) 2023 Xiaomi Corporation + +#ifndef SHERPA_ONNX_CSRC_OFFLINE_CTC_GREEDY_SEARCH_DECODER_H_ +#define SHERPA_ONNX_CSRC_OFFLINE_CTC_GREEDY_SEARCH_DECODER_H_ + +#include + +#include "sherpa-onnx/csrc/offline-ctc-decoder.h" + +namespace sherpa_onnx { + +class OfflineCtcGreedySearchDecoder : public OfflineCtcDecoder { + public: + explicit OfflineCtcGreedySearchDecoder(int32_t blank_id) + : blank_id_(blank_id) {} + + std::vector Decode( + Ort::Value log_probs, Ort::Value log_probs_length) override; + + private: + int32_t blank_id_; +}; + +} // namespace sherpa_onnx + +#endif // SHERPA_ONNX_CSRC_OFFLINE_CTC_GREEDY_SEARCH_DECODER_H_ diff --git a/audio_processing/sherpa-onnx/csrc/offline-transducer-greedy-search-decoder.cc b/audio_processing/sherpa-onnx/csrc/offline-transducer-greedy-search-decoder.cc new file mode 100644 index 000000000..6fd3bf404 --- /dev/null +++ b/audio_processing/sherpa-onnx/csrc/offline-transducer-greedy-search-decoder.cc @@ -0,0 +1,87 @@ +// sherpa-onnx/csrc/offline-transducer-greedy-search-decoder.cc +// +// Copyright (c) 2023 Xiaomi Corporation + +#include "sherpa-onnx/csrc/offline-transducer-greedy-search-decoder.h" + +#include +#include +#include + +#include "sherpa-onnx/csrc/onnx-utils.h" +#include "sherpa-onnx/csrc/packed-sequence.h" +#include "sherpa-onnx/csrc/slice.h" + +namespace sherpa_onnx { + +std::vector +OfflineTransducerGreedySearchDecoder::Decode(Ort::Value encoder_out, + Ort::Value encoder_out_length, + OfflineStream **ss /*= nullptr*/, + int32_t n /*= 0*/) { + PackedSequence packed_encoder_out = PackPaddedSequence( + model_->Allocator(), &encoder_out, &encoder_out_length); + + int32_t batch_size = + static_cast(packed_encoder_out.sorted_indexes.size()); + + int32_t vocab_size = model_->VocabSize(); + int32_t context_size = model_->ContextSize(); + + std::vector ans(batch_size); + for (auto &r : ans) { + r.tokens.resize(context_size, -1); + // 0 is the ID of the blank token + r.tokens.back() = 0; + } + + auto decoder_input = model_->BuildDecoderInput(ans, ans.size()); + Ort::Value decoder_out = model_->RunDecoder(std::move(decoder_input)); + + int32_t start = 0; + int32_t t = 0; + for (auto n : packed_encoder_out.batch_sizes) { + Ort::Value cur_encoder_out = packed_encoder_out.Get(start, n); + Ort::Value cur_decoder_out = Slice(model_->Allocator(), &decoder_out, 0, n); + start += n; + Ort::Value logit = model_->RunJoiner(std::move(cur_encoder_out), + std::move(cur_decoder_out)); + float *p_logit = logit.GetTensorMutableData(); + bool emitted = false; + for (int32_t i = 0; i != n; ++i) { + if (blank_penalty_ > 0.0) { + p_logit[0] -= blank_penalty_; // assuming blank id is 0 + } + auto y = static_cast(std::distance( + static_cast(p_logit), + std::max_element(static_cast(p_logit), + static_cast(p_logit) + vocab_size))); + p_logit += vocab_size; + // blank id is hardcoded to 0 + // also, it treats unk as blank + if (y != 0 && y != unk_id_) { + ans[i].tokens.push_back(y); + ans[i].timestamps.push_back(t); + emitted = true; + } + } + if (emitted) { + Ort::Value decoder_input = model_->BuildDecoderInput(ans, n); + decoder_out = model_->RunDecoder(std::move(decoder_input)); + } + ++t; + } + + for (auto &r : ans) { + r.tokens = {r.tokens.begin() + context_size, r.tokens.end()}; + } + + std::vector unsorted_ans(batch_size); + for (int32_t i = 0; i != batch_size; ++i) { + unsorted_ans[packed_encoder_out.sorted_indexes[i]] = std::move(ans[i]); + } + + return unsorted_ans; +} + +} // namespace sherpa_onnx diff --git a/audio_processing/sherpa-onnx/csrc/offline-transducer-greedy-search-decoder.h b/audio_processing/sherpa-onnx/csrc/offline-transducer-greedy-search-decoder.h new file mode 100644 index 000000000..79109e60d --- /dev/null +++ b/audio_processing/sherpa-onnx/csrc/offline-transducer-greedy-search-decoder.h @@ -0,0 +1,34 @@ +// sherpa-onnx/csrc/offline-transducer-greedy-search-decoder.h +// +// Copyright (c) 2023 Xiaomi Corporation + +#ifndef SHERPA_ONNX_CSRC_OFFLINE_TRANSDUCER_GREEDY_SEARCH_DECODER_H_ +#define SHERPA_ONNX_CSRC_OFFLINE_TRANSDUCER_GREEDY_SEARCH_DECODER_H_ + +#include + +#include "sherpa-onnx/csrc/offline-transducer-decoder.h" +#include "sherpa-onnx/csrc/offline-transducer-model.h" + +namespace sherpa_onnx { + +class OfflineTransducerGreedySearchDecoder : public OfflineTransducerDecoder { + public: + OfflineTransducerGreedySearchDecoder(OfflineTransducerModel *model, + int32_t unk_id, + float blank_penalty) + : model_(model), unk_id_(unk_id), blank_penalty_(blank_penalty) {} + + std::vector Decode( + Ort::Value encoder_out, Ort::Value encoder_out_length, + OfflineStream **ss = nullptr, int32_t n = 0) override; + + private: + OfflineTransducerModel *model_; // Not owned + int32_t unk_id_; + float blank_penalty_; +}; + +} // namespace sherpa_onnx + +#endif // SHERPA_ONNX_CSRC_OFFLINE_TRANSDUCER_GREEDY_SEARCH_DECODER_H_ diff --git a/audio_processing/sherpa-onnx/csrc/online-model-config.cc b/audio_processing/sherpa-onnx/csrc/online-model-config.cc new file mode 100644 index 000000000..8de8bfc07 --- /dev/null +++ b/audio_processing/sherpa-onnx/csrc/online-model-config.cc @@ -0,0 +1,186 @@ +// sherpa-onnx/csrc/online-model-config.cc +// +// Copyright (c) 2023 Xiaomi Corporation +#include "sherpa-onnx/csrc/online-model-config.h" + +#include + +#include "sherpa-onnx/csrc/file-utils.h" +#include "sherpa-onnx/csrc/macros.h" +#include "sherpa-onnx/csrc/text-utils.h" + +namespace sherpa_onnx { + +void OnlineModelConfig::Register(ParseOptions *po) { + transducer.Register(po); + paraformer.Register(po); + wenet_ctc.Register(po); + zipformer2_ctc.Register(po); + nemo_ctc.Register(po); + t_one_ctc.Register(po); + provider_config.Register(po); + + po->Register("tokens", &tokens, "Path to tokens.txt"); + + po->Register("num-threads", &num_threads, + "Number of threads to run the neural network"); + + po->Register("warm-up", &warm_up, + "Number of warm-up to run the onnxruntime" + "Valid vales are: zipformer2"); + + po->Register("debug", &debug, + "true to print model information while loading it."); + + po->Register("modeling-unit", &modeling_unit, + "The modeling unit of the model, commonly used units are bpe, " + "cjkchar, cjkchar+bpe, etc. Currently, it is needed only when " + "hotwords are provided, we need it to encode the hotwords into " + "token sequence."); + + po->Register("bpe-vocab", &bpe_vocab, + "The vocabulary generated by google's sentencepiece program. " + "It is a file has two columns, one is the token, the other is " + "the log probability, you can get it from the directory where " + "your bpe model is generated. Only used when hotwords provided " + "and the modeling unit is bpe or cjkchar+bpe"); + + po->Register("model-type", &model_type, + "Specify it to reduce model initialization time. " + "Valid values are: conformer, lstm, zipformer, zipformer2, " + "wenet_ctc, nemo_ctc. " + "All other values lead to loading the model twice."); +} + +bool OnlineModelConfig::Validate() const { + // For RK NPU, we reinterpret num_threads: + // + // For RK3588 only + // num_threads == 1 -> Select a core randomly + // num_threads == 0 -> Use NPU core 0 + // num_threads == -1 -> Use NPU core 1 + // num_threads == -2 -> Use NPU core 2 + // num_threads == -3 -> Use NPU core 0 and core 1 + // num_threads == -4 -> Use NPU core 0, core 1, and core 2 + if (provider_config.provider != "rknn") { + if (num_threads < 1) { + SHERPA_ONNX_LOGE("num_threads should be > 0. Given %d", num_threads); + return false; + } + if (!transducer.encoder.empty() && (EndsWith(transducer.encoder, ".rknn") || + EndsWith(transducer.decoder, ".rknn") || + EndsWith(transducer.joiner, ".rknn"))) { + SHERPA_ONNX_LOGE( + "--provider is %s, which is not rknn, but you pass rknn model " + "filenames. encoder: '%s', decoder: '%s', joiner: '%s'", + provider_config.provider.c_str(), transducer.encoder.c_str(), + transducer.decoder.c_str(), transducer.joiner.c_str()); + return false; + } + + if (!zipformer2_ctc.model.empty() && + EndsWith(zipformer2_ctc.model, ".rknn")) { + SHERPA_ONNX_LOGE( + "--provider is %s, which is not rknn, but you pass rknn model " + "filename for zipformer2_ctc: '%s'", + provider_config.provider.c_str(), zipformer2_ctc.model.c_str()); + return false; + } + } + + if (provider_config.provider == "rknn") { + if (!transducer.encoder.empty() && (EndsWith(transducer.encoder, ".onnx") || + EndsWith(transducer.decoder, ".onnx") || + EndsWith(transducer.joiner, ".onnx"))) { + SHERPA_ONNX_LOGE( + "--provider is rknn, but you pass onnx model " + "filenames. encoder: '%s', decoder: '%s', joiner: '%s'", + transducer.encoder.c_str(), transducer.decoder.c_str(), + transducer.joiner.c_str()); + return false; + } + + if (!zipformer2_ctc.model.empty() && + EndsWith(zipformer2_ctc.model, ".onnx")) { + SHERPA_ONNX_LOGE( + "--provider rknn, but you pass onnx model filename for " + "zipformer2_ctc: '%s'", + zipformer2_ctc.model.c_str()); + return false; + } + } + + if (!tokens_buf.empty() && FileExists(tokens)) { + SHERPA_ONNX_LOGE( + "you can not provide a tokens_buf and a tokens file: '%s', " + "at the same time, which is confusing", + tokens.c_str()); + return false; + } + + if (tokens_buf.empty() && !FileExists(tokens)) { + SHERPA_ONNX_LOGE( + "tokens: '%s' does not exist, you should provide " + "either a tokens buffer or a tokens file", + tokens.c_str()); + return false; + } + + if (!modeling_unit.empty() && + (modeling_unit == "bpe" || modeling_unit == "cjkchar+bpe")) { + if (!FileExists(bpe_vocab)) { + SHERPA_ONNX_LOGE("bpe_vocab: '%s' does not exist", bpe_vocab.c_str()); + return false; + } + } + + if (!paraformer.encoder.empty()) { + return paraformer.Validate(); + } + + if (!wenet_ctc.model.empty()) { + return wenet_ctc.Validate(); + } + + if (!zipformer2_ctc.model.empty()) { + return zipformer2_ctc.Validate(); + } + + if (!nemo_ctc.model.empty()) { + return nemo_ctc.Validate(); + } + + if (!t_one_ctc.model.empty()) { + return t_one_ctc.Validate(); + } + + if (!provider_config.Validate()) { + return false; + } + + return transducer.Validate(); +} + +std::string OnlineModelConfig::ToString() const { + std::ostringstream os; + + os << "OnlineModelConfig("; + os << "transducer=" << transducer.ToString() << ", "; + os << "paraformer=" << paraformer.ToString() << ", "; + os << "wenet_ctc=" << wenet_ctc.ToString() << ", "; + os << "zipformer2_ctc=" << zipformer2_ctc.ToString() << ", "; + os << "nemo_ctc=" << nemo_ctc.ToString() << ", "; + os << "t_one_ctc=" << t_one_ctc.ToString() << ", "; + os << "provider_config=" << provider_config.ToString() << ", "; + os << "tokens=\"" << tokens << "\", "; + os << "num_threads=" << num_threads << ", "; + os << "warm_up=" << warm_up << ", "; + os << "debug=" << (debug ? "True" : "False") << ", "; + os << "model_type=\"" << model_type << "\", "; + os << "modeling_unit=\"" << modeling_unit << "\", "; + os << "bpe_vocab=\"" << bpe_vocab << "\")"; + + return os.str(); +} + +} // namespace sherpa_onnx diff --git a/audio_processing/sherpa-onnx/csrc/online-model-config.h b/audio_processing/sherpa-onnx/csrc/online-model-config.h new file mode 100644 index 000000000..d82559a22 --- /dev/null +++ b/audio_processing/sherpa-onnx/csrc/online-model-config.h @@ -0,0 +1,90 @@ +// sherpa-onnx/csrc/online-model-config.h +// +// Copyright (c) 2023 Xiaomi Corporation +#ifndef SHERPA_ONNX_CSRC_ONLINE_MODEL_CONFIG_H_ +#define SHERPA_ONNX_CSRC_ONLINE_MODEL_CONFIG_H_ + +#include + +#include "sherpa-onnx/csrc/online-nemo-ctc-model-config.h" +#include "sherpa-onnx/csrc/online-paraformer-model-config.h" +#include "sherpa-onnx/csrc/online-t-one-ctc-model-config.h" +#include "sherpa-onnx/csrc/online-transducer-model-config.h" +#include "sherpa-onnx/csrc/online-wenet-ctc-model-config.h" +#include "sherpa-onnx/csrc/online-zipformer2-ctc-model-config.h" +#include "sherpa-onnx/csrc/provider-config.h" + +namespace sherpa_onnx { + +struct OnlineModelConfig { + OnlineTransducerModelConfig transducer; + OnlineParaformerModelConfig paraformer; + OnlineWenetCtcModelConfig wenet_ctc; + OnlineZipformer2CtcModelConfig zipformer2_ctc; + OnlineNeMoCtcModelConfig nemo_ctc; + OnlineToneCtcModelConfig t_one_ctc; + ProviderConfig provider_config; + std::string tokens; + int32_t num_threads = 1; + int32_t warm_up = 0; + bool debug = false; + + // Valid values: + // - conformer, conformer transducer from icefall + // - lstm, lstm transducer from icefall + // - zipformer, zipformer transducer from icefall + // - zipformer2, zipformer2 transducer or CTC from icefall + // - wenet_ctc, wenet CTC model + // - nemo_ctc, NeMo CTC model + // + // All other values are invalid and lead to loading the model twice. + std::string model_type; + + // Valid values: + // - cjkchar + // - bpe + // - cjkchar+bpe + std::string modeling_unit = "cjkchar"; + std::string bpe_vocab; + + /// if tokens_buf is non-empty, + /// the tokens will be loaded from the buffer instead of from the + /// "tokens" file + std::string tokens_buf; + + OnlineModelConfig() = default; + OnlineModelConfig(const OnlineTransducerModelConfig &transducer, + const OnlineParaformerModelConfig ¶former, + const OnlineWenetCtcModelConfig &wenet_ctc, + const OnlineZipformer2CtcModelConfig &zipformer2_ctc, + const OnlineNeMoCtcModelConfig &nemo_ctc, + const OnlineToneCtcModelConfig &t_one_ctc, + const ProviderConfig &provider_config, + const std::string &tokens, int32_t num_threads, + int32_t warm_up, bool debug, const std::string &model_type, + const std::string &modeling_unit, + const std::string &bpe_vocab) + : transducer(transducer), + paraformer(paraformer), + wenet_ctc(wenet_ctc), + zipformer2_ctc(zipformer2_ctc), + nemo_ctc(nemo_ctc), + t_one_ctc(t_one_ctc), + provider_config(provider_config), + tokens(tokens), + num_threads(num_threads), + warm_up(warm_up), + debug(debug), + model_type(model_type), + modeling_unit(modeling_unit), + bpe_vocab(bpe_vocab) {} + + void Register(ParseOptions *po); + bool Validate() const; + + std::string ToString() const; +}; + +} // namespace sherpa_onnx + +#endif // SHERPA_ONNX_CSRC_ONLINE_MODEL_CONFIG_H_ diff --git a/audio_processing/sherpa-onnx/csrc/online-recognizer-impl.cc b/audio_processing/sherpa-onnx/csrc/online-recognizer-impl.cc new file mode 100644 index 000000000..7b96c5b8f --- /dev/null +++ b/audio_processing/sherpa-onnx/csrc/online-recognizer-impl.cc @@ -0,0 +1,294 @@ +// sherpa-onnx/csrc/online-recognizer-impl.cc +// +// Copyright (c) 2023-2025 Xiaomi Corporation + +#include "sherpa-onnx/csrc/online-recognizer-impl.h" + +#include +#include + +#if __ANDROID_API__ >= 9 +#include "android/asset_manager.h" +#include "android/asset_manager_jni.h" +#endif + +#if __OHOS__ +#include "rawfile/raw_file_manager.h" +#endif + +#include "fst/extensions/far/far.h" +#include "kaldifst/csrc/kaldi-fst-io.h" +#include "sherpa-onnx/csrc/macros.h" +#include "sherpa-onnx/csrc/online-recognizer-ctc-impl.h" +#include "sherpa-onnx/csrc/online-recognizer-paraformer-impl.h" +#include "sherpa-onnx/csrc/online-recognizer-transducer-impl.h" +#include "sherpa-onnx/csrc/online-recognizer-transducer-nemo-impl.h" +#include "sherpa-onnx/csrc/onnx-utils.h" +#include "sherpa-onnx/csrc/text-utils.h" + +#if SHERPA_ONNX_ENABLE_RKNN +#include "sherpa-onnx/csrc/rknn/online-recognizer-ctc-rknn-impl.h" +#include "sherpa-onnx/csrc/rknn/online-recognizer-transducer-rknn-impl.h" +#endif + +namespace sherpa_onnx { + +std::unique_ptr OnlineRecognizerImpl::Create( + const OnlineRecognizerConfig &config) { + if (config.model_config.provider_config.provider == "rknn") { +#if SHERPA_ONNX_ENABLE_RKNN + if (config.model_config.transducer.encoder.empty() && + config.model_config.zipformer2_ctc.model.empty()) { + SHERPA_ONNX_LOGE( + "Only Zipformer transducers and CTC models are currently supported " + "by rknn. Fallback to CPU. Make sure you pass an onnx model"); + } else if (!config.model_config.transducer.encoder.empty()) { + return std::make_unique(config); + } else if (!config.model_config.zipformer2_ctc.model.empty()) { + return std::make_unique(config); + } +#else + SHERPA_ONNX_LOGE( + "Please rebuild sherpa-onnx with -DSHERPA_ONNX_ENABLE_RKNN=ON if you " + "want to use rknn."); + SHERPA_ONNX_EXIT(-1); + return nullptr; +#endif + } + + if (!config.model_config.transducer.encoder.empty()) { + Ort::Env env(ORT_LOGGING_LEVEL_ERROR); + + Ort::SessionOptions sess_opts; + sess_opts.SetIntraOpNumThreads(1); + sess_opts.SetInterOpNumThreads(1); + + auto decoder_model = ReadFile(config.model_config.transducer.decoder); + auto sess = std::make_unique(env, decoder_model.data(), + decoder_model.size(), sess_opts); + + size_t node_count = sess->GetOutputCount(); + + if (node_count == 1) { + return std::make_unique(config); + } else { + return std::make_unique(config); + } + } + + if (!config.model_config.paraformer.encoder.empty()) { + return std::make_unique(config); + } + + if (!config.model_config.wenet_ctc.model.empty() || + !config.model_config.zipformer2_ctc.model.empty() || + !config.model_config.nemo_ctc.model.empty() || + !config.model_config.t_one_ctc.model.empty()) { + return std::make_unique(config); + } + + SHERPA_ONNX_LOGE("Please specify a model"); + SHERPA_ONNX_EXIT(-1); +} + +template +std::unique_ptr OnlineRecognizerImpl::Create( + Manager *mgr, const OnlineRecognizerConfig &config) { + if (config.model_config.provider_config.provider == "rknn") { +#if SHERPA_ONNX_ENABLE_RKNN + // Currently, only zipformer v1 is suported for rknn + if (config.model_config.transducer.encoder.empty() && + config.model_config.zipformer2_ctc.model.empty()) { + SHERPA_ONNX_LOGE( + "Only Zipformer transducers and CTC models are currently supported " + "by rknn. Fallback to CPU"); + } else if (!config.model_config.transducer.encoder.empty()) { + return std::make_unique(mgr, config); + } else if (!config.model_config.zipformer2_ctc.model.empty()) { + return std::make_unique(mgr, config); + } +#else + SHERPA_ONNX_LOGE( + "Please rebuild sherpa-onnx with -DSHERPA_ONNX_ENABLE_RKNN=ON if you " + "want to use rknn."); + SHERPA_ONNX_EXIT(-1); + return nullptr; +#endif + } + + if (!config.model_config.transducer.encoder.empty()) { + Ort::Env env(ORT_LOGGING_LEVEL_ERROR); + + Ort::SessionOptions sess_opts; + sess_opts.SetIntraOpNumThreads(1); + sess_opts.SetInterOpNumThreads(1); + + auto decoder_model = ReadFile(mgr, config.model_config.transducer.decoder); + auto sess = std::make_unique(env, decoder_model.data(), + decoder_model.size(), sess_opts); + + size_t node_count = sess->GetOutputCount(); + + if (node_count == 1) { + return std::make_unique(mgr, config); + } else { + return std::make_unique(mgr, config); + } + } + + if (!config.model_config.paraformer.encoder.empty()) { + return std::make_unique(mgr, config); + } + + if (!config.model_config.wenet_ctc.model.empty() || + !config.model_config.zipformer2_ctc.model.empty() || + !config.model_config.nemo_ctc.model.empty() || + !config.model_config.t_one_ctc.model.empty()) { + return std::make_unique(mgr, config); + } + + SHERPA_ONNX_LOGE("Please specify a model"); + SHERPA_ONNX_EXIT(-1); +} + +OnlineRecognizerImpl::OnlineRecognizerImpl(const OnlineRecognizerConfig &config) + : config_(config) { + if (!config.rule_fsts.empty()) { + std::vector files; + SplitStringToVector(config.rule_fsts, ",", false, &files); + itn_list_.reserve(files.size()); + for (const auto &f : files) { + if (config.model_config.debug) { + SHERPA_ONNX_LOGE("rule fst: %s", f.c_str()); + } + itn_list_.push_back(std::make_unique(f)); + } + } + + if (!config.rule_fars.empty()) { + if (config.model_config.debug) { + SHERPA_ONNX_LOGE("Loading FST archives"); + } + std::vector files; + SplitStringToVector(config.rule_fars, ",", false, &files); + + itn_list_.reserve(files.size() + itn_list_.size()); + + for (const auto &f : files) { + if (config.model_config.debug) { + SHERPA_ONNX_LOGE("rule far: %s", f.c_str()); + } + std::unique_ptr> reader( + fst::FarReader::Open(f)); + for (; !reader->Done(); reader->Next()) { + std::unique_ptr r( + fst::CastOrConvertToConstFst(reader->GetFst()->Copy())); + + itn_list_.push_back( + std::make_unique(std::move(r))); + } + } + + if (config.model_config.debug) { + SHERPA_ONNX_LOGE("FST archives loaded!"); + } + } + + if (!config.hr.lexicon.empty() && !config.hr.rule_fsts.empty()) { + auto hr_config = config.hr; + hr_config.debug = config.model_config.debug; + hr_ = std::make_unique(hr_config); + } +} + +template +OnlineRecognizerImpl::OnlineRecognizerImpl(Manager *mgr, + const OnlineRecognizerConfig &config) + : config_(config) { + if (!config.rule_fsts.empty()) { + std::vector files; + SplitStringToVector(config.rule_fsts, ",", false, &files); + itn_list_.reserve(files.size()); + for (const auto &f : files) { + if (config.model_config.debug) { + SHERPA_ONNX_LOGE("rule fst: %s", f.c_str()); + } + auto buf = ReadFile(mgr, f); + std::istrstream is(buf.data(), buf.size()); + itn_list_.push_back(std::make_unique(is)); + } + } + + if (!config.rule_fars.empty()) { + std::vector files; + SplitStringToVector(config.rule_fars, ",", false, &files); + itn_list_.reserve(files.size() + itn_list_.size()); + + for (const auto &f : files) { + if (config.model_config.debug) { + SHERPA_ONNX_LOGE("rule far: %s", f.c_str()); + } + + auto buf = ReadFile(mgr, f); + + std::unique_ptr s( + new std::istrstream(buf.data(), buf.size())); + + std::unique_ptr> reader( + fst::FarReader::Open(std::move(s))); + + for (; !reader->Done(); reader->Next()) { + std::unique_ptr r( + fst::CastOrConvertToConstFst(reader->GetFst()->Copy())); + + itn_list_.push_back( + std::make_unique(std::move(r))); + } // for (; !reader->Done(); reader->Next()) + } // for (const auto &f : files) + } // if (!config.rule_fars.empty()) + if (!config.hr.lexicon.empty() && !config.hr.rule_fsts.empty()) { + auto hr_config = config.hr; + hr_config.debug = config.model_config.debug; + hr_ = std::make_unique(mgr, hr_config); + } +} + +std::string OnlineRecognizerImpl::ApplyInverseTextNormalization( + std::string text) const { + text = RemoveInvalidUtf8Sequences(text); + + if (!itn_list_.empty()) { + for (const auto &tn : itn_list_) { + text = tn->Normalize(text); + } + } + + return text; +} + +std::string OnlineRecognizerImpl::ApplyHomophoneReplacer( + std::string text) const { + if (hr_) { + text = hr_->Apply(text); + } + + return text; +} + +#if __ANDROID_API__ >= 9 +template OnlineRecognizerImpl::OnlineRecognizerImpl( + AAssetManager *mgr, const OnlineRecognizerConfig &config); + +template std::unique_ptr OnlineRecognizerImpl::Create( + AAssetManager *mgr, const OnlineRecognizerConfig &config); +#endif + +#if __OHOS__ +template OnlineRecognizerImpl::OnlineRecognizerImpl( + NativeResourceManager *mgr, const OnlineRecognizerConfig &config); + +template std::unique_ptr OnlineRecognizerImpl::Create( + NativeResourceManager *mgr, const OnlineRecognizerConfig &config); +#endif + +} // namespace sherpa_onnx diff --git a/audio_processing/sherpa-onnx/csrc/online-recognizer-impl.h b/audio_processing/sherpa-onnx/csrc/online-recognizer-impl.h new file mode 100644 index 000000000..d752bde60 --- /dev/null +++ b/audio_processing/sherpa-onnx/csrc/online-recognizer-impl.h @@ -0,0 +1,74 @@ +// sherpa-onnx/csrc/online-recognizer-impl.h +// +// Copyright (c) 2023 Xiaomi Corporation + +#ifndef SHERPA_ONNX_CSRC_ONLINE_RECOGNIZER_IMPL_H_ +#define SHERPA_ONNX_CSRC_ONLINE_RECOGNIZER_IMPL_H_ + +#include +#include +#include + +#include "kaldifst/csrc/text-normalizer.h" +#include "sherpa-onnx/csrc/homophone-replacer.h" +#include "sherpa-onnx/csrc/macros.h" +#include "sherpa-onnx/csrc/online-recognizer.h" +#include "sherpa-onnx/csrc/online-stream.h" + +namespace sherpa_onnx { + +class OnlineRecognizerImpl { + public: + explicit OnlineRecognizerImpl(const OnlineRecognizerConfig &config); + + static std::unique_ptr Create( + const OnlineRecognizerConfig &config); + + template + OnlineRecognizerImpl(Manager *mgr, const OnlineRecognizerConfig &config); + + template + static std::unique_ptr Create( + Manager *mgr, const OnlineRecognizerConfig &config); + + virtual ~OnlineRecognizerImpl() = default; + + virtual std::unique_ptr CreateStream() const = 0; + + virtual std::unique_ptr CreateStream( + const std::string &hotwords) const { + SHERPA_ONNX_LOGE("Only transducer models support contextual biasing."); + exit(-1); + } + + virtual bool IsReady(OnlineStream *s) const = 0; + + virtual void WarmpUpRecognizer(int32_t warmup, int32_t mbs) const { + // ToDo extending to other models + SHERPA_ONNX_LOGE("Only zipformer2 model supports Warm up for now."); + exit(-1); + } + + virtual void DecodeStreams(OnlineStream **ss, int32_t n) const = 0; + + virtual OnlineRecognizerResult GetResult(OnlineStream *s) const = 0; + + virtual bool IsEndpoint(OnlineStream *s) const = 0; + + virtual void Reset(OnlineStream *s) const = 0; + + std::string ApplyInverseTextNormalization(std::string text) const; + std::string ApplyHomophoneReplacer(std::string text) const; + + private: + OnlineRecognizerConfig config_; + // for inverse text normalization. Used only if + // config.rule_fsts is not empty or + // config.rule_fars is not empty + std::vector> itn_list_; + std::unique_ptr hr_; +}; + +} // namespace sherpa_onnx + +#endif // SHERPA_ONNX_CSRC_ONLINE_RECOGNIZER_IMPL_H_ diff --git a/audio_processing/sherpa-onnx/csrc/online-recognizer.cc b/audio_processing/sherpa-onnx/csrc/online-recognizer.cc new file mode 100644 index 000000000..338a92f32 --- /dev/null +++ b/audio_processing/sherpa-onnx/csrc/online-recognizer.cc @@ -0,0 +1,271 @@ +// sherpa-onnx/csrc/online-recognizer.cc +// +// Copyright (c) 2023 Xiaomi Corporation +// Copyright (c) 2023 Pingfeng Luo + +#include "sherpa-onnx/csrc/online-recognizer.h" + +#include +#include +#include +#include +#include +#include +#include + +#if __ANDROID_API__ >= 9 +#include "android/asset_manager.h" +#include "android/asset_manager_jni.h" +#endif + +#if __OHOS__ +#include "rawfile/raw_file_manager.h" +#endif + +#include "sherpa-onnx/csrc/file-utils.h" +#include "sherpa-onnx/csrc/online-recognizer-impl.h" +#include "sherpa-onnx/csrc/text-utils.h" + +namespace sherpa_onnx { + +namespace { + +/// Helper for `OnlineRecognizerResult::AsJsonString()` +template +std::string VecToString(const std::vector &vec, int32_t precision = 6) { + std::ostringstream oss; + if (precision != 0) { + oss << std::fixed << std::setprecision(precision); + } + oss << "["; + std::string sep = ""; + for (const auto &item : vec) { + oss << sep << item; + sep = ", "; + } + oss << "]"; + return oss.str(); +} + +/// Helper for `OnlineRecognizerResult::AsJsonString()` +template <> // explicit specialization for T = std::string +std::string VecToString(const std::vector &vec, + int32_t) { // ignore 2nd arg + std::ostringstream oss; + oss << "["; + std::string sep = ""; + for (const auto &item : vec) { + oss << sep << std::quoted(item); + sep = ", "; + } + oss << "]"; + return oss.str(); +} + +} // namespace + +std::string OnlineRecognizerResult::AsJsonString() const { + std::ostringstream os; + os << "{ "; + os << "\"text\": " << std::quoted(text) << ", "; + os << "\"tokens\": " << VecToString(tokens) << ", "; + os << "\"timestamps\": " << VecToString(timestamps, 2) << ", "; + os << "\"ys_probs\": " << VecToString(ys_probs, 6) << ", "; + os << "\"lm_probs\": " << VecToString(lm_probs, 6) << ", "; + os << "\"context_scores\": " << VecToString(context_scores, 6) << ", "; + os << "\"segment\": " << segment << ", "; + os << "\"words\": " << VecToString(words, 0) << ", "; + os << "\"start_time\": " << std::fixed << std::setprecision(2) << start_time + << ", "; + os << "\"is_final\": " << (is_final ? "true" : "false") << ", "; + os << "\"is_eof\": " << (is_eof ? "true" : "false"); + os << "}"; + return os.str(); +} + +void OnlineRecognizerConfig::Register(ParseOptions *po) { + feat_config.Register(po); + model_config.Register(po); + endpoint_config.Register(po); + lm_config.Register(po); + ctc_fst_decoder_config.Register(po); + hr.Register(po); + + po->Register("enable-endpoint", &enable_endpoint, + "True to enable endpoint detection. False to disable it."); + po->Register("max-active-paths", &max_active_paths, + "beam size used in modified beam search."); + po->Register("blank-penalty", &blank_penalty, + "The penalty applied on blank symbol during decoding. " + "Note: It is a positive value. " + "Increasing value will lead to lower deletion at the cost" + "of higher insertions. " + "Currently only applicable for transducer models."); + po->Register("hotwords-score", &hotwords_score, + "The bonus score for each token in context word/phrase. " + "Used only when decoding_method is modified_beam_search"); + po->Register( + "hotwords-file", &hotwords_file, + "The file containing hotwords, one words/phrases per line, For example: " + "HELLO WORLD" + "你好世界"); + po->Register("decoding-method", &decoding_method, + "decoding method," + "now support greedy_search and modified_beam_search."); + po->Register("temperature-scale", &temperature_scale, + "Temperature scale for confidence computation in decoding."); + po->Register( + "rule-fsts", &rule_fsts, + "If not empty, it specifies fsts for inverse text normalization. " + "If there are multiple fsts, they are separated by a comma."); + + po->Register( + "rule-fars", &rule_fars, + "If not empty, it specifies fst archives for inverse text normalization. " + "If there are multiple archives, they are separated by a comma."); + + po->Register("reset-encoder", &reset_encoder, + "True to reset encoder_state on an endpoint after empty segment." + "Done in `Reset()` method, after an endpoint was detected."); +} + +bool OnlineRecognizerConfig::Validate() const { + if (decoding_method == "modified_beam_search" && !lm_config.model.empty()) { + if (max_active_paths <= 0) { + SHERPA_ONNX_LOGE("max_active_paths is less than 0! Given: %d", + max_active_paths); + return false; + } + + if (!lm_config.Validate()) { + return false; + } + } + + if (!hotwords_file.empty() && decoding_method != "modified_beam_search") { + SHERPA_ONNX_LOGE( + "Please use --decoding-method=modified_beam_search if you" + " provide --hotwords-file. Given --decoding-method=%s", + decoding_method.c_str()); + return false; + } + + if (!ctc_fst_decoder_config.graph.empty() && + !ctc_fst_decoder_config.Validate()) { + SHERPA_ONNX_LOGE("Errors in ctc_fst_decoder_config"); + return false; + } + + if (!hotwords_file.empty() && !FileExists(hotwords_file)) { + SHERPA_ONNX_LOGE("--hotwords-file: '%s' does not exist", + hotwords_file.c_str()); + return false; + } + + if (!rule_fsts.empty()) { + std::vector files; + SplitStringToVector(rule_fsts, ",", false, &files); + for (const auto &f : files) { + if (!FileExists(f)) { + SHERPA_ONNX_LOGE("Rule fst '%s' does not exist. ", f.c_str()); + return false; + } + } + } + + if (!rule_fars.empty()) { + std::vector files; + SplitStringToVector(rule_fars, ",", false, &files); + for (const auto &f : files) { + if (!FileExists(f)) { + SHERPA_ONNX_LOGE("Rule far '%s' does not exist. ", f.c_str()); + return false; + } + } + } + + if (!hr.lexicon.empty() && !hr.rule_fsts.empty() && !hr.Validate()) { + return false; + } + + return model_config.Validate(); +} + +std::string OnlineRecognizerConfig::ToString() const { + std::ostringstream os; + + os << "OnlineRecognizerConfig("; + os << "feat_config=" << feat_config.ToString() << ", "; + os << "model_config=" << model_config.ToString() << ", "; + os << "lm_config=" << lm_config.ToString() << ", "; + os << "endpoint_config=" << endpoint_config.ToString() << ", "; + os << "ctc_fst_decoder_config=" << ctc_fst_decoder_config.ToString() << ", "; + os << "enable_endpoint=" << (enable_endpoint ? "True" : "False") << ", "; + os << "max_active_paths=" << max_active_paths << ", "; + os << "hotwords_score=" << hotwords_score << ", "; + os << "hotwords_file=\"" << hotwords_file << "\", "; + os << "decoding_method=\"" << decoding_method << "\", "; + os << "blank_penalty=" << blank_penalty << ", "; + os << "temperature_scale=" << temperature_scale << ", "; + os << "rule_fsts=\"" << rule_fsts << "\", "; + os << "rule_fars=\"" << rule_fars << "\", "; + os << "reset_encoder=" << (reset_encoder ? "True" : "False") << ", "; + os << "hr=" << hr.ToString() << ")"; + + return os.str(); +} + +OnlineRecognizer::OnlineRecognizer(const OnlineRecognizerConfig &config) + : impl_(OnlineRecognizerImpl::Create(config)) {} + +template +OnlineRecognizer::OnlineRecognizer(Manager *mgr, + const OnlineRecognizerConfig &config) + : impl_(OnlineRecognizerImpl::Create(mgr, config)) {} + +OnlineRecognizer::~OnlineRecognizer() = default; + +std::unique_ptr OnlineRecognizer::CreateStream() const { + return impl_->CreateStream(); +} + +std::unique_ptr OnlineRecognizer::CreateStream( + const std::string &hotwords) const { + return impl_->CreateStream(hotwords); +} + +bool OnlineRecognizer::IsReady(OnlineStream *s) const { + return impl_->IsReady(s); +} + +void OnlineRecognizer::WarmpUpRecognizer(int32_t warmup, int32_t mbs) const { + if (warmup > 0) { + impl_->WarmpUpRecognizer(warmup, mbs); + } +} + +void OnlineRecognizer::DecodeStreams(OnlineStream **ss, int32_t n) const { + impl_->DecodeStreams(ss, n); +} + +OnlineRecognizerResult OnlineRecognizer::GetResult(OnlineStream *s) const { + return impl_->GetResult(s); +} + +bool OnlineRecognizer::IsEndpoint(OnlineStream *s) const { + return impl_->IsEndpoint(s); +} + +void OnlineRecognizer::Reset(OnlineStream *s) const { impl_->Reset(s); } + +#if __ANDROID_API__ >= 9 +template OnlineRecognizer::OnlineRecognizer( + AAssetManager *mgr, const OnlineRecognizerConfig &config); +#endif + +#if __OHOS__ +template OnlineRecognizer::OnlineRecognizer( + NativeResourceManager *mgr, const OnlineRecognizerConfig &config); +#endif + +} // namespace sherpa_onnx diff --git a/audio_processing/sherpa-onnx/csrc/online-recognizer.h b/audio_processing/sherpa-onnx/csrc/online-recognizer.h new file mode 100644 index 000000000..09e2c5f66 --- /dev/null +++ b/audio_processing/sherpa-onnx/csrc/online-recognizer.h @@ -0,0 +1,229 @@ +// sherpa-onnx/csrc/online-recognizer.h +// +// Copyright (c) 2023 Xiaomi Corporation + +#ifndef SHERPA_ONNX_CSRC_ONLINE_RECOGNIZER_H_ +#define SHERPA_ONNX_CSRC_ONLINE_RECOGNIZER_H_ + +#include +#include +#include + +#include "sherpa-onnx/csrc/endpoint.h" +#include "sherpa-onnx/csrc/features.h" +#include "sherpa-onnx/csrc/homophone-replacer.h" +#include "sherpa-onnx/csrc/online-ctc-fst-decoder-config.h" +#include "sherpa-onnx/csrc/online-lm-config.h" +#include "sherpa-onnx/csrc/online-model-config.h" +#include "sherpa-onnx/csrc/online-stream.h" +#include "sherpa-onnx/csrc/online-transducer-model-config.h" +#include "sherpa-onnx/csrc/parse-options.h" + +namespace sherpa_onnx { + +struct OnlineRecognizerResult { + /// Recognition results. + /// For English, it consists of space separated words. + /// For Chinese, it consists of Chinese words without spaces. + /// Example 1: "hello world" + /// Example 2: "你好世界" + std::string text; + + /// Decoded results at the token level. + /// For instance, for BPE-based models it consists of a list of BPE tokens. + std::vector tokens; + + /// timestamps.size() == tokens.size() + /// timestamps[i] records the time in seconds when tokens[i] is decoded. + std::vector timestamps; + + std::vector ys_probs; //< log-prob scores from ASR model + std::vector lm_probs; //< log-prob scores from language model + // + /// log-domain scores from "hot-phrase" contextual boosting + std::vector context_scores; + + std::vector words; + + /// ID of this segment + /// When an endpoint is detected, it is incremented + int32_t segment = 0; + + /// Starting time of this segment. + /// When an endpoint is detected, it will change + float start_time = 0; + + /// True if the end of this segment is reached, i.e., an endpoint is detected + /// used only in ./online-websocket-server-impl.cc + bool is_final = false; + + /// used only in ./online-websocket-server-impl.cc + /// If it is true, it means the server has processed all received samples + bool is_eof = false; + + /** Return a json string. + * + * The returned string contains: + * { + * "text": "The recognition result", + * "tokens": [x, x, x], + * "timestamps": [x, x, x], + * "ys_probs": [x, x, x], + * "lm_probs": [x, x, x], + * "context_scores": [x, x, x], + * "segment": x, + * "start_time": x, + * "is_final": true|false + * "is_eof": true|false + * } + */ + std::string AsJsonString() const; +}; + +struct OnlineRecognizerConfig { + FeatureExtractorConfig feat_config; + OnlineModelConfig model_config; + OnlineLMConfig lm_config; + EndpointConfig endpoint_config; + OnlineCtcFstDecoderConfig ctc_fst_decoder_config; + + bool enable_endpoint = true; + + std::string decoding_method = "greedy_search"; + // now support modified_beam_search and greedy_search + + // used only for modified_beam_search + int32_t max_active_paths = 4; + + /// used only for modified_beam_search + std::string hotwords_file; + float hotwords_score = 1.5; + + float blank_penalty = 0.0; + + float temperature_scale = 2.0; + + // If there are multiple rules, they are applied from left to right. + std::string rule_fsts; + + // If there are multiple FST archives, they are applied from left to right. + std::string rule_fars; + + // True to reset encoder_state on an endpoint after empty segment. + // Done in `Reset()` method, after an endpoint was detected, + // currently only in `OnlineRecognizerTransducerImpl`. + bool reset_encoder = false; + + HomophoneReplacerConfig hr; + + /// used only for modified_beam_search, if hotwords_buf is non-empty, + /// the hotwords will be loaded from the buffered string instead of from the + /// "hotwords_file" + std::string hotwords_buf; + + OnlineRecognizerConfig() = default; + + OnlineRecognizerConfig( + const FeatureExtractorConfig &feat_config, + const OnlineModelConfig &model_config, const OnlineLMConfig &lm_config, + const EndpointConfig &endpoint_config, + const OnlineCtcFstDecoderConfig &ctc_fst_decoder_config, + bool enable_endpoint, const std::string &decoding_method, + int32_t max_active_paths, const std::string &hotwords_file, + float hotwords_score, float blank_penalty, float temperature_scale, + const std::string &rule_fsts, const std::string &rule_fars, + bool reset_encoder, const HomophoneReplacerConfig &hr) + : feat_config(feat_config), + model_config(model_config), + lm_config(lm_config), + endpoint_config(endpoint_config), + ctc_fst_decoder_config(ctc_fst_decoder_config), + enable_endpoint(enable_endpoint), + decoding_method(decoding_method), + max_active_paths(max_active_paths), + hotwords_file(hotwords_file), + hotwords_score(hotwords_score), + blank_penalty(blank_penalty), + temperature_scale(temperature_scale), + rule_fsts(rule_fsts), + rule_fars(rule_fars), + reset_encoder(reset_encoder), + hr(hr) {} + + void Register(ParseOptions *po); + bool Validate() const; + + std::string ToString() const; +}; + +class OnlineRecognizerImpl; + +class OnlineRecognizer { + public: + explicit OnlineRecognizer(const OnlineRecognizerConfig &config); + + template + OnlineRecognizer(Manager *mgr, const OnlineRecognizerConfig &config); + + ~OnlineRecognizer(); + + /// Create a stream for decoding. + std::unique_ptr CreateStream() const; + + /** Create a stream for decoding. + * + * @param The hotwords for this string, it might contain several hotwords, + * the hotwords are separated by "/". In each of the hotwords, there + * are cjkchars or bpes, the bpe/cjkchar are separated by space (" "). + * For example, hotwords I LOVE YOU and HELLO WORLD, looks like: + * + * "▁I ▁LOVE ▁YOU/▁HE LL O ▁WORLD" + */ + std::unique_ptr CreateStream(const std::string &hotwords) const; + + /** + * Return true if the given stream has enough frames for decoding. + * Return false otherwise + */ + bool IsReady(OnlineStream *s) const; + + /** Decode a single stream. */ + void DecodeStream(OnlineStream *s) const { + OnlineStream *ss[1] = {s}; + DecodeStreams(ss, 1); + } + + /** + * Warmups up onnxruntime sessions by apply optimization and + * allocating memory prior + * + * @param warmup Number of warmups. + * @param mbs : max-batch-size Max batch size for the models + */ + void WarmpUpRecognizer(int32_t warmup, int32_t mbs) const; + + /** Decode multiple streams in parallel + * + * @param ss Pointer array containing streams to be decoded. + * @param n Number of streams in `ss`. + */ + void DecodeStreams(OnlineStream **ss, int32_t n) const; + + OnlineRecognizerResult GetResult(OnlineStream *s) const; + + // Return true if we detect an endpoint for this stream. + // Note: If this function returns true, you usually want to + // invoke Reset(s). + bool IsEndpoint(OnlineStream *s) const; + + // Clear the state of this stream. If IsEndpoint(s) returns true, + // after calling this function, IsEndpoint(s) will return false + void Reset(OnlineStream *s) const; + + private: + std::unique_ptr impl_; +}; + +} // namespace sherpa_onnx + +#endif // SHERPA_ONNX_CSRC_ONLINE_RECOGNIZER_H_ diff --git a/audio_processing/sherpa-onnx/csrc/online-stream.cc b/audio_processing/sherpa-onnx/csrc/online-stream.cc new file mode 100644 index 000000000..f7abaa66a --- /dev/null +++ b/audio_processing/sherpa-onnx/csrc/online-stream.cc @@ -0,0 +1,285 @@ +// sherpa-onnx/csrc/online-stream.cc +// +// Copyright (c) 2023 Xiaomi Corporation +#include "sherpa-onnx/csrc/online-stream.h" + +#include +#include +#include + +#include "sherpa-onnx/csrc/features.h" +#include "sherpa-onnx/csrc/transducer-keyword-decoder.h" + +namespace sherpa_onnx { + +class OnlineStream::Impl { + public: + explicit Impl(const FeatureExtractorConfig &config, + ContextGraphPtr context_graph) + : feat_extractor_(config), context_graph_(std::move(context_graph)) {} + + void AcceptWaveform(int32_t sampling_rate, const float *waveform, int32_t n) { + std::lock_guard lock(mutex_); + feat_extractor_.AcceptWaveform(sampling_rate, waveform, n); + } + + void InputFinished() const { + std::lock_guard lock(mutex_); + feat_extractor_.InputFinished(); + } + + int32_t NumFramesReady() const { + std::lock_guard lock(mutex_); + return feat_extractor_.NumFramesReady() - start_frame_index_; + } + + bool IsLastFrame(int32_t frame) const { + std::lock_guard lock(mutex_); + return feat_extractor_.IsLastFrame(frame); + } + + std::vector GetFrames(int32_t frame_index, int32_t n) const { + std::lock_guard lock(mutex_); + return feat_extractor_.GetFrames(frame_index + start_frame_index_, n); + } + + void Reset() { + std::lock_guard lock(mutex_); + // we don't reset the feature extractor + start_frame_index_ += num_processed_frames_; + num_processed_frames_ = 0; + } + + int32_t &GetNumProcessedFrames() { + std::lock_guard lock(mutex_); + return num_processed_frames_; + } + + int32_t GetNumFramesSinceStart() const { + std::lock_guard lock(mutex_); + return start_frame_index_; + } + + int32_t &GetCurrentSegment() { + std::lock_guard lock(mutex_); + return segment_; + } + + void SetResult(const OnlineTransducerDecoderResult &r) { result_ = r; } + + OnlineTransducerDecoderResult &GetResult() { return result_; } + + void SetKeywordResult(const TransducerKeywordResult &r) { + keyword_result_ = r; + } + TransducerKeywordResult &GetKeywordResult(bool remove_duplicates) { + if (remove_duplicates) { + if (!prev_keyword_result_.timestamps.empty() && + !keyword_result_.timestamps.empty() && + keyword_result_.timestamps[0] <= + prev_keyword_result_.timestamps.back()) { + return empty_keyword_result_; + } else { + prev_keyword_result_ = keyword_result_; + } + return keyword_result_; + } else { + return keyword_result_; + } + } + + OnlineCtcDecoderResult &GetCtcResult() { return ctc_result_; } + + void SetCtcResult(const OnlineCtcDecoderResult &r) { ctc_result_ = r; } + + void SetParaformerResult(const OnlineParaformerDecoderResult &r) { + paraformer_result_ = r; + } + + OnlineParaformerDecoderResult &GetParaformerResult() { + return paraformer_result_; + } + + int32_t FeatureDim() const { return feat_extractor_.FeatureDim(); } + + void SetStates(std::vector states) { + states_ = std::move(states); + } + + std::vector &GetStates() { return states_; } + + void SetNeMoDecoderStates(std::vector decoder_states) { + decoder_states_ = std::move(decoder_states); + } + + std::vector &GetNeMoDecoderStates() { return decoder_states_; } + + const ContextGraphPtr &GetContextGraph() const { return context_graph_; } + + std::vector &GetParaformerFeatCache() { + return paraformer_feat_cache_; + } + + std::vector &GetParaformerEncoderOutCache() { + return paraformer_encoder_out_cache_; + } + + std::vector &GetParaformerAlphaCache() { + return paraformer_alpha_cache_; + } + + void SetFasterDecoder(std::unique_ptr decoder) { + faster_decoder_ = std::move(decoder); + } + + kaldi_decoder::FasterDecoder *GetFasterDecoder() const { + return faster_decoder_.get(); + } + + int32_t &GetFasterDecoderProcessedFrames() { + return faster_decoder_processed_frames_; + } + + private: + FeatureExtractor feat_extractor_; + mutable std::mutex mutex_; + /// For contextual-biasing + ContextGraphPtr context_graph_; + int32_t num_processed_frames_ = 0; // before subsampling + int32_t start_frame_index_ = 0; // never reset + int32_t segment_ = 0; + OnlineTransducerDecoderResult result_; + TransducerKeywordResult prev_keyword_result_; + TransducerKeywordResult keyword_result_; + TransducerKeywordResult empty_keyword_result_; + OnlineCtcDecoderResult ctc_result_; + std::vector states_; // states for transducer or ctc models + std::vector decoder_states_; // states for nemo transducer models + std::vector paraformer_feat_cache_; + std::vector paraformer_encoder_out_cache_; + std::vector paraformer_alpha_cache_; + OnlineParaformerDecoderResult paraformer_result_; + std::unique_ptr faster_decoder_; + int32_t faster_decoder_processed_frames_ = 0; +}; + +OnlineStream::OnlineStream(const FeatureExtractorConfig &config /*= {}*/, + ContextGraphPtr context_graph /*= nullptr */) + : impl_(std::make_unique(config, std::move(context_graph))) {} + +OnlineStream::~OnlineStream() = default; + +void OnlineStream::AcceptWaveform(int32_t sampling_rate, const float *waveform, + int32_t n) const { + impl_->AcceptWaveform(sampling_rate, waveform, n); +} + +void OnlineStream::InputFinished() const { impl_->InputFinished(); } + +int32_t OnlineStream::NumFramesReady() const { return impl_->NumFramesReady(); } + +bool OnlineStream::IsLastFrame(int32_t frame) const { + return impl_->IsLastFrame(frame); +} + +std::vector OnlineStream::GetFrames(int32_t frame_index, + int32_t n) const { + return impl_->GetFrames(frame_index, n); +} + +void OnlineStream::Reset() { impl_->Reset(); } + +int32_t OnlineStream::FeatureDim() const { return impl_->FeatureDim(); } + +int32_t &OnlineStream::GetNumProcessedFrames() { + return impl_->GetNumProcessedFrames(); +} + +int32_t OnlineStream::GetNumFramesSinceStart() const { + return impl_->GetNumFramesSinceStart(); +} + +int32_t &OnlineStream::GetCurrentSegment() { + return impl_->GetCurrentSegment(); +} + +void OnlineStream::SetResult(const OnlineTransducerDecoderResult &r) { + impl_->SetResult(r); +} + +OnlineTransducerDecoderResult &OnlineStream::GetResult() { + return impl_->GetResult(); +} + +void OnlineStream::SetKeywordResult(const TransducerKeywordResult &r) { + impl_->SetKeywordResult(r); +} + +TransducerKeywordResult &OnlineStream::GetKeywordResult( + bool remove_duplicates /*=false*/) { + return impl_->GetKeywordResult(remove_duplicates); +} + +OnlineCtcDecoderResult &OnlineStream::GetCtcResult() { + return impl_->GetCtcResult(); +} + +void OnlineStream::SetCtcResult(const OnlineCtcDecoderResult &r) { + impl_->SetCtcResult(r); +} + +void OnlineStream::SetParaformerResult(const OnlineParaformerDecoderResult &r) { + impl_->SetParaformerResult(r); +} + +OnlineParaformerDecoderResult &OnlineStream::GetParaformerResult() { + return impl_->GetParaformerResult(); +} + +void OnlineStream::SetStates(std::vector states) { + impl_->SetStates(std::move(states)); +} + +std::vector &OnlineStream::GetStates() { + return impl_->GetStates(); +} + +void OnlineStream::SetNeMoDecoderStates( + std::vector decoder_states) { + return impl_->SetNeMoDecoderStates(std::move(decoder_states)); +} + +std::vector &OnlineStream::GetNeMoDecoderStates() { + return impl_->GetNeMoDecoderStates(); +} + +const ContextGraphPtr &OnlineStream::GetContextGraph() const { + return impl_->GetContextGraph(); +} + +void OnlineStream::SetFasterDecoder( + std::unique_ptr decoder) { + impl_->SetFasterDecoder(std::move(decoder)); +} + +kaldi_decoder::FasterDecoder *OnlineStream::GetFasterDecoder() const { + return impl_->GetFasterDecoder(); +} + +int32_t &OnlineStream::GetFasterDecoderProcessedFrames() { + return impl_->GetFasterDecoderProcessedFrames(); +} + +std::vector &OnlineStream::GetParaformerFeatCache() { + return impl_->GetParaformerFeatCache(); +} + +std::vector &OnlineStream::GetParaformerEncoderOutCache() { + return impl_->GetParaformerEncoderOutCache(); +} + +std::vector &OnlineStream::GetParaformerAlphaCache() { + return impl_->GetParaformerAlphaCache(); +} + +} // namespace sherpa_onnx diff --git a/audio_processing/sherpa-onnx/csrc/online-stream.h b/audio_processing/sherpa-onnx/csrc/online-stream.h new file mode 100644 index 000000000..71600db65 --- /dev/null +++ b/audio_processing/sherpa-onnx/csrc/online-stream.h @@ -0,0 +1,121 @@ +// sherpa-onnx/csrc/online-stream.h +// +// Copyright (c) 2023 Xiaomi Corporation + +#ifndef SHERPA_ONNX_CSRC_ONLINE_STREAM_H_ +#define SHERPA_ONNX_CSRC_ONLINE_STREAM_H_ + +#include +#include + +#include "kaldi-decoder/csrc/faster-decoder.h" +#include "onnxruntime_cxx_api.h" // NOLINT +#include "sherpa-onnx/csrc/context-graph.h" +#include "sherpa-onnx/csrc/features.h" +#include "sherpa-onnx/csrc/online-ctc-decoder.h" +#include "sherpa-onnx/csrc/online-paraformer-decoder.h" +#include "sherpa-onnx/csrc/online-transducer-decoder.h" + +namespace sherpa_onnx { + +struct TransducerKeywordResult; +class OnlineStream { + public: + explicit OnlineStream(const FeatureExtractorConfig &config = {}, + ContextGraphPtr context_graph = nullptr); + + virtual ~OnlineStream(); + + /** + @param sampling_rate The sampling_rate of the input waveform. If it does + not equal to config.sampling_rate, we will do + resampling inside. + @param waveform Pointer to a 1-D array of size n. It must be normalized to + the range [-1, 1]. + @param n Number of entries in waveform + */ + void AcceptWaveform(int32_t sampling_rate, const float *waveform, + int32_t n) const; + + /** + * InputFinished() tells the class you won't be providing any + * more waveform. This will help flush out the last frame or two + * of features, in the case where snip-edges == false; it also + * affects the return value of IsLastFrame(). + */ + void InputFinished() const; + + int32_t NumFramesReady() const; + + /** Note: IsLastFrame() will only ever return true if you have called + * InputFinished() (and this frame is the last frame). + */ + bool IsLastFrame(int32_t frame) const; + + /** Get n frames starting from the given frame index. + * + * @param frame_index The starting frame index + * @param n Number of frames to get. + * @return Return a 2-D tensor of shape (n, feature_dim). + * which is flattened into a 1-D vector (flattened in row major) + */ + std::vector GetFrames(int32_t frame_index, int32_t n) const; + + void Reset(); + + int32_t FeatureDim() const; + + // Return a reference to the number of processed frames so far + // before subsampling.. + // Initially, it is 0. It is always less than NumFramesReady(). + // + // The returned reference is valid as long as this object is alive. + int32_t &GetNumProcessedFrames(); // It's reset after calling Reset() + + int32_t GetNumFramesSinceStart() const; + + int32_t &GetCurrentSegment(); + + void SetResult(const OnlineTransducerDecoderResult &r); + OnlineTransducerDecoderResult &GetResult(); + + void SetKeywordResult(const TransducerKeywordResult &r); + TransducerKeywordResult &GetKeywordResult(bool remove_duplicates = false); + + void SetCtcResult(const OnlineCtcDecoderResult &r); + OnlineCtcDecoderResult &GetCtcResult(); + + void SetParaformerResult(const OnlineParaformerDecoderResult &r); + OnlineParaformerDecoderResult &GetParaformerResult(); + + void SetStates(std::vector states); + std::vector &GetStates(); + + void SetNeMoDecoderStates(std::vector decoder_states); + std::vector &GetNeMoDecoderStates(); + + /** + * Get the context graph corresponding to this stream. + * + * @return Return the context graph for this stream. + */ + const ContextGraphPtr &GetContextGraph() const; + + // for online ctc decoder + void SetFasterDecoder(std::unique_ptr decoder); + kaldi_decoder::FasterDecoder *GetFasterDecoder() const; + int32_t &GetFasterDecoderProcessedFrames(); + + // for streaming paraformer + std::vector &GetParaformerFeatCache(); + std::vector &GetParaformerEncoderOutCache(); + std::vector &GetParaformerAlphaCache(); + + private: + class Impl; + std::unique_ptr impl_; +}; + +} // namespace sherpa_onnx + +#endif // SHERPA_ONNX_CSRC_ONLINE_STREAM_H_ diff --git a/audio_processing/sherpa-onnx/csrc/online-transducer-model-config.cc b/audio_processing/sherpa-onnx/csrc/online-transducer-model-config.cc new file mode 100644 index 000000000..dd7572717 --- /dev/null +++ b/audio_processing/sherpa-onnx/csrc/online-transducer-model-config.cc @@ -0,0 +1,51 @@ +// sherpa-onnx/csrc/online-transducer-model-config.cc +// +// Copyright (c) 2023 Xiaomi Corporation +#include "sherpa-onnx/csrc/online-transducer-model-config.h" + +#include + +#include "sherpa-onnx/csrc/file-utils.h" +#include "sherpa-onnx/csrc/macros.h" + +namespace sherpa_onnx { + +void OnlineTransducerModelConfig::Register(ParseOptions *po) { + po->Register("encoder", &encoder, "Path to encoder.onnx"); + po->Register("decoder", &decoder, "Path to decoder.onnx"); + po->Register("joiner", &joiner, "Path to joiner.onnx"); +} + +bool OnlineTransducerModelConfig::Validate() const { + if (!FileExists(encoder)) { + SHERPA_ONNX_LOGE("transducer encoder: '%s' does not exist", + encoder.c_str()); + return false; + } + + if (!FileExists(decoder)) { + SHERPA_ONNX_LOGE("transducer decoder: '%s' does not exist", + decoder.c_str()); + return false; + } + + if (!FileExists(joiner)) { + SHERPA_ONNX_LOGE("joiner: '%s' does not exist", joiner.c_str()); + return false; + } + + return true; +} + +std::string OnlineTransducerModelConfig::ToString() const { + std::ostringstream os; + + os << "OnlineTransducerModelConfig("; + os << "encoder=\"" << encoder << "\", "; + os << "decoder=\"" << decoder << "\", "; + os << "joiner=\"" << joiner << "\")"; + + return os.str(); +} + +} // namespace sherpa_onnx diff --git a/audio_processing/sherpa-onnx/csrc/online-transducer-model-config.h b/audio_processing/sherpa-onnx/csrc/online-transducer-model-config.h new file mode 100644 index 000000000..5d79e25bf --- /dev/null +++ b/audio_processing/sherpa-onnx/csrc/online-transducer-model-config.h @@ -0,0 +1,32 @@ +// sherpa-onnx/csrc/online-transducer-model-config.h +// +// Copyright (c) 2023 Xiaomi Corporation +#ifndef SHERPA_ONNX_CSRC_ONLINE_TRANSDUCER_MODEL_CONFIG_H_ +#define SHERPA_ONNX_CSRC_ONLINE_TRANSDUCER_MODEL_CONFIG_H_ + +#include + +#include "sherpa-onnx/csrc/parse-options.h" + +namespace sherpa_onnx { + +struct OnlineTransducerModelConfig { + std::string encoder; + std::string decoder; + std::string joiner; + + OnlineTransducerModelConfig() = default; + OnlineTransducerModelConfig(const std::string &encoder, + const std::string &decoder, + const std::string &joiner) + : encoder(encoder), decoder(decoder), joiner(joiner) {} + + void Register(ParseOptions *po); + bool Validate() const; + + std::string ToString() const; +}; + +} // namespace sherpa_onnx + +#endif // SHERPA_ONNX_CSRC_ONLINE_TRANSDUCER_MODEL_CONFIG_H_ diff --git a/audio_processing/sherpa-onnx/csrc/online-transducer-model.cc b/audio_processing/sherpa-onnx/csrc/online-transducer-model.cc new file mode 100644 index 000000000..286fd9cd1 --- /dev/null +++ b/audio_processing/sherpa-onnx/csrc/online-transducer-model.cc @@ -0,0 +1,230 @@ +// sherpa-onnx/csrc/online-transducer-model.cc +// +// Copyright (c) 2023 Xiaomi Corporation +// Copyright (c) 2023 Pingfeng Luo +#include "sherpa-onnx/csrc/online-transducer-model.h" + +#if __ANDROID_API__ >= 9 +#include "android/asset_manager.h" +#include "android/asset_manager_jni.h" +#endif + +#if __OHOS__ +#include "rawfile/raw_file_manager.h" +#endif + +#include +#include +#include +#include + +#include "sherpa-onnx/csrc/file-utils.h" +#include "sherpa-onnx/csrc/macros.h" +#include "sherpa-onnx/csrc/online-conformer-transducer-model.h" +#include "sherpa-onnx/csrc/online-ebranchformer-transducer-model.h" +#include "sherpa-onnx/csrc/online-lstm-transducer-model.h" +#include "sherpa-onnx/csrc/online-zipformer-transducer-model.h" +#include "sherpa-onnx/csrc/online-zipformer2-transducer-model.h" +#include "sherpa-onnx/csrc/onnx-utils.h" + +namespace { + +enum class ModelType : std::uint8_t { + kConformer, + kEbranchformer, + kLstm, + kZipformer, + kZipformer2, + kUnknown, +}; + +} // namespace + +namespace sherpa_onnx { + +static ModelType GetModelType(char *model_data, size_t model_data_length, + bool debug) { + Ort::Env env(ORT_LOGGING_LEVEL_ERROR); + Ort::SessionOptions sess_opts; + sess_opts.SetIntraOpNumThreads(1); + sess_opts.SetInterOpNumThreads(1); + + auto sess = std::make_unique(env, model_data, model_data_length, + sess_opts); + + Ort::ModelMetadata meta_data = sess->GetModelMetadata(); + if (debug) { + std::ostringstream os; + PrintModelMetadata(os, meta_data); +#if __OHOS__ + SHERPA_ONNX_LOGE("%{public}s", os.str().c_str()); +#else + SHERPA_ONNX_LOGE("%s", os.str().c_str()); +#endif + } + + Ort::AllocatorWithDefaultOptions allocator; + auto model_type = + LookupCustomModelMetaData(meta_data, "model_type", allocator); + if (model_type.empty()) { + SHERPA_ONNX_LOGE( + "No model_type in the metadata!\n" + "Please make sure you are using the latest export-onnx.py from icefall " + "to export your transducer models"); + return ModelType::kUnknown; + } + + if (model_type == "conformer") { + return ModelType::kConformer; + } else if (model_type == "ebranchformer") { + return ModelType::kEbranchformer; + } else if (model_type == "lstm") { + return ModelType::kLstm; + } else if (model_type == "zipformer") { + return ModelType::kZipformer; + } else if (model_type == "zipformer2") { + return ModelType::kZipformer2; + } else { + SHERPA_ONNX_LOGE("Unsupported model_type: %s", model_type.c_str()); + return ModelType::kUnknown; + } +} + +std::unique_ptr OnlineTransducerModel::Create( + const OnlineModelConfig &config) { + if (!config.model_type.empty()) { + const auto &model_type = config.model_type; + if (model_type == "conformer") { + return std::make_unique(config); + } else if (model_type == "ebranchformer") { + return std::make_unique(config); + } else if (model_type == "lstm") { + return std::make_unique(config); + } else if (model_type == "zipformer") { + return std::make_unique(config); + } else if (model_type == "zipformer2") { + return std::make_unique(config); + } else { + SHERPA_ONNX_LOGE( + "Invalid model_type: %s. Trying to load the model to get its type", + model_type.c_str()); + } + } + ModelType model_type = ModelType::kUnknown; + + { + auto buffer = ReadFile(config.transducer.encoder); + + model_type = GetModelType(buffer.data(), buffer.size(), config.debug); + } + + switch (model_type) { + case ModelType::kConformer: + return std::make_unique(config); + case ModelType::kEbranchformer: + return std::make_unique(config); + case ModelType::kLstm: + return std::make_unique(config); + case ModelType::kZipformer: + return std::make_unique(config); + case ModelType::kZipformer2: + return std::make_unique(config); + case ModelType::kUnknown: + SHERPA_ONNX_LOGE("Unknown model type in online transducer!"); + return nullptr; + } + + // unreachable code + return nullptr; +} + +Ort::Value OnlineTransducerModel::BuildDecoderInput( + const std::vector &results) { + int32_t batch_size = static_cast(results.size()); + int32_t context_size = ContextSize(); + std::array shape{batch_size, context_size}; + Ort::Value decoder_input = Ort::Value::CreateTensor( + Allocator(), shape.data(), shape.size()); + int64_t *p = decoder_input.GetTensorMutableData(); + + for (const auto &r : results) { + const int64_t *begin = r.tokens.data() + r.tokens.size() - context_size; + const int64_t *end = r.tokens.data() + r.tokens.size(); + std::copy(begin, end, p); + p += context_size; + } + return decoder_input; +} + +Ort::Value OnlineTransducerModel::BuildDecoderInput( + const std::vector &hyps) { + int32_t batch_size = static_cast(hyps.size()); + int32_t context_size = ContextSize(); + std::array shape{batch_size, context_size}; + Ort::Value decoder_input = Ort::Value::CreateTensor( + Allocator(), shape.data(), shape.size()); + int64_t *p = decoder_input.GetTensorMutableData(); + + for (const auto &h : hyps) { + std::copy(h.ys.end() - context_size, h.ys.end(), p); + p += context_size; + } + return decoder_input; +} + +template +std::unique_ptr OnlineTransducerModel::Create( + Manager *mgr, const OnlineModelConfig &config) { + if (!config.model_type.empty()) { + const auto &model_type = config.model_type; + if (model_type == "conformer") { + return std::make_unique(mgr, config); + } else if (model_type == "ebranchformer") { + return std::make_unique(mgr, config); + } else if (model_type == "lstm") { + return std::make_unique(mgr, config); + } else if (model_type == "zipformer") { + return std::make_unique(mgr, config); + } else if (model_type == "zipformer2") { + return std::make_unique(mgr, config); + } else { + SHERPA_ONNX_LOGE( + "Invalid model_type: %s. Trying to load the model to get its type", + model_type.c_str()); + } + } + + auto buffer = ReadFile(mgr, config.transducer.encoder); + auto model_type = GetModelType(buffer.data(), buffer.size(), config.debug); + + switch (model_type) { + case ModelType::kConformer: + return std::make_unique(mgr, config); + case ModelType::kEbranchformer: + return std::make_unique(mgr, config); + case ModelType::kLstm: + return std::make_unique(mgr, config); + case ModelType::kZipformer: + return std::make_unique(mgr, config); + case ModelType::kZipformer2: + return std::make_unique(mgr, config); + case ModelType::kUnknown: + SHERPA_ONNX_LOGE("Unknown model type in online transducer!"); + return nullptr; + } + + // unreachable code + return nullptr; +} + +#if __ANDROID_API__ >= 9 +template std::unique_ptr OnlineTransducerModel::Create( + AAssetManager *mgr, const OnlineModelConfig &config); +#endif + +#if __OHOS__ +template std::unique_ptr OnlineTransducerModel::Create( + NativeResourceManager *mgr, const OnlineModelConfig &config); +#endif + +} // namespace sherpa_onnx diff --git a/audio_processing/sherpa-onnx/csrc/online-transducer-model.h b/audio_processing/sherpa-onnx/csrc/online-transducer-model.h new file mode 100644 index 000000000..a568c1760 --- /dev/null +++ b/audio_processing/sherpa-onnx/csrc/online-transducer-model.h @@ -0,0 +1,147 @@ +// sherpa-onnx/csrc/online-transducer-model.h +// +// Copyright (c) 2023 Xiaomi Corporation +#ifndef SHERPA_ONNX_CSRC_ONLINE_TRANSDUCER_MODEL_H_ +#define SHERPA_ONNX_CSRC_ONLINE_TRANSDUCER_MODEL_H_ + +#include +#include +#include + +#include "onnxruntime_cxx_api.h" // NOLINT +#include "sherpa-onnx/csrc/hypothesis.h" +#include "sherpa-onnx/csrc/online-model-config.h" +#include "sherpa-onnx/csrc/online-transducer-decoder.h" +#include "sherpa-onnx/csrc/online-transducer-model-config.h" + +namespace sherpa_onnx { + +struct OnlineTransducerDecoderResult; + +class OnlineTransducerModel { + public: + virtual ~OnlineTransducerModel() = default; + + static std::unique_ptr Create( + const OnlineModelConfig &config); + + template + static std::unique_ptr Create( + Manager *mgr, const OnlineModelConfig &config); + + /** Stack a list of individual states into a batch. + * + * It is the inverse operation of `UnStackStates`. + * + * @param states states[i] contains the state for the i-th utterance. + * @return Return a single value representing the batched state. + */ + virtual std::vector StackStates( + const std::vector> &states) const = 0; + + /** Unstack a batch state into a list of individual states. + * + * It is the inverse operation of `StackStates`. + * + * @param states A batched state. + * @return ans[i] contains the state for the i-th utterance. + */ + virtual std::vector> UnStackStates( + const std::vector &states) const = 0; + + /** Get the initial encoder states. + * + * @return Return the initial encoder state. + */ + virtual std::vector GetEncoderInitStates() = 0; + + /** Set feature dim. + * + * This is used in `OnlineZipformer2TransducerModel`, + * to pass `feature_dim` for `GetEncoderInitStates()`. + * + * This has to be called before GetEncoderInitStates(), so the `encoder_embed` + * init state has the correct `embed_dim` of its output. + */ + virtual void SetFeatureDim(int32_t /*feature_dim*/) {} + + /** Run the encoder. + * + * @param features A tensor of shape (N, T, C). It is changed in-place. + * @param states Encoder state of the previous chunk. It is changed in-place. + * @param processed_frames Processed frames before subsampling. It is a 1-D + * tensor with data type int64_t. + * + * @return Return a tuple containing: + * - encoder_out, a tensor of shape (N, T', encoder_out_dim) + * - next_states Encoder state for the next chunk. + */ + virtual std::pair> RunEncoder( + Ort::Value features, std::vector states, + Ort::Value processed_frames) = 0; // NOLINT + + /** Run the decoder network. + * + * Caution: We assume there are no recurrent connections in the decoder and + * the decoder is stateless. See + * https://github.com/k2-fsa/icefall/blob/master/egs/librispeech/ASR/pruned_transducer_stateless2/decoder.py + * for an example + * + * @param decoder_input It is usually of shape (N, context_size) + * @return Return a tensor of shape (N, decoder_dim). + */ + virtual Ort::Value RunDecoder(Ort::Value decoder_input) = 0; + + /** Run the joint network. + * + * @param encoder_out Output of the encoder network. A tensor of shape + * (N, joiner_dim). + * @param decoder_out Output of the decoder network. A tensor of shape + * (N, joiner_dim). + * @return Return a tensor of shape (N, vocab_size). In icefall, the last + * last layer of the joint network is `nn.Linear`, + * not `nn.LogSoftmax`. + */ + virtual Ort::Value RunJoiner(Ort::Value encoder_out, + Ort::Value decoder_out) = 0; + + /** If we are using a stateless decoder and if it contains a + * Conv1D, this function returns the kernel size of the convolution layer. + */ + virtual int32_t ContextSize() const = 0; + + /** We send this number of feature frames to the encoder at a time. */ + virtual int32_t ChunkSize() const = 0; + + /** Number of input frames to discard after each call to RunEncoder. + * + * For instance, if we have 30 frames, chunk_size=8, chunk_shift=6. + * + * In the first call of RunEncoder, we use frames 0~7 since chunk_size is 8. + * Then we discard frame 0~5 since chunk_shift is 6. + * In the second call of RunEncoder, we use frames 6~13; and then we discard + * frames 6~11. + * In the third call of RunEncoder, we use frames 12~19; and then we discard + * frames 12~16. + * + * Note: ChunkSize() - ChunkShift() == right context size + */ + virtual int32_t ChunkShift() const = 0; + + virtual int32_t VocabSize() const = 0; + + virtual int32_t SubsamplingFactor() const { return 4; } + + virtual bool UseWhisperFeature() const { return false; } + + virtual OrtAllocator *Allocator() = 0; + + Ort::Value BuildDecoderInput( + const std::vector &results); + + Ort::Value BuildDecoderInput(const std::vector &hyps); +}; + +} // namespace sherpa_onnx + +#endif // SHERPA_ONNX_CSRC_ONLINE_TRANSDUCER_MODEL_H_ diff --git a/audio_processing/sherpa-onnx/csrc/online-zipformer-transducer-model.cc b/audio_processing/sherpa-onnx/csrc/online-zipformer-transducer-model.cc new file mode 100644 index 000000000..7dfaa30ac --- /dev/null +++ b/audio_processing/sherpa-onnx/csrc/online-zipformer-transducer-model.cc @@ -0,0 +1,518 @@ +// sherpa-onnx/csrc/online-zipformer-transducer-model.cc +// +// Copyright (c) 2023 Xiaomi Corporation + +#include "sherpa-onnx/csrc/online-zipformer-transducer-model.h" + +#include +#include +#include +#include +#include +#include +#include + +#if __ANDROID_API__ >= 9 +#include "android/asset_manager.h" +#include "android/asset_manager_jni.h" +#endif + +#if __OHOS__ +#include "rawfile/raw_file_manager.h" +#endif + +#include "onnxruntime_cxx_api.h" // NOLINT +#include "sherpa-onnx/csrc/cat.h" +#include "sherpa-onnx/csrc/file-utils.h" +#include "sherpa-onnx/csrc/macros.h" +#include "sherpa-onnx/csrc/online-transducer-decoder.h" +#include "sherpa-onnx/csrc/onnx-utils.h" +#include "sherpa-onnx/csrc/session.h" +#include "sherpa-onnx/csrc/text-utils.h" +#include "sherpa-onnx/csrc/unbind.h" + +namespace sherpa_onnx { + +OnlineZipformerTransducerModel::OnlineZipformerTransducerModel( + const OnlineModelConfig &config) + : env_(ORT_LOGGING_LEVEL_ERROR), + config_(config), + sess_opts_(GetSessionOptions(config)), + allocator_{} { + { + auto buf = ReadFile(config.transducer.encoder); + InitEncoder(buf.data(), buf.size()); + } + + { + auto buf = ReadFile(config.transducer.decoder); + InitDecoder(buf.data(), buf.size()); + } + + { + auto buf = ReadFile(config.transducer.joiner); + InitJoiner(buf.data(), buf.size()); + } +} + +template +OnlineZipformerTransducerModel::OnlineZipformerTransducerModel( + Manager *mgr, const OnlineModelConfig &config) + : env_(ORT_LOGGING_LEVEL_ERROR), + config_(config), + sess_opts_(GetSessionOptions(config)), + allocator_{} { + { + auto buf = ReadFile(mgr, config.transducer.encoder); + InitEncoder(buf.data(), buf.size()); + } + + { + auto buf = ReadFile(mgr, config.transducer.decoder); + InitDecoder(buf.data(), buf.size()); + } + + { + auto buf = ReadFile(mgr, config.transducer.joiner); + InitJoiner(buf.data(), buf.size()); + } +} + +void OnlineZipformerTransducerModel::InitEncoder(void *model_data, + size_t model_data_length) { + encoder_sess_ = std::make_unique(env_, model_data, + model_data_length, sess_opts_); + + GetInputNames(encoder_sess_.get(), &encoder_input_names_, + &encoder_input_names_ptr_); + + GetOutputNames(encoder_sess_.get(), &encoder_output_names_, + &encoder_output_names_ptr_); + + // get meta data + Ort::ModelMetadata meta_data = encoder_sess_->GetModelMetadata(); + if (config_.debug) { + std::ostringstream os; + os << "---encoder---\n"; + PrintModelMetadata(os, meta_data); +#if __OHOS__ + SHERPA_ONNX_LOGE("%{public}s", os.str().c_str()); +#else + SHERPA_ONNX_LOGE("%s", os.str().c_str()); +#endif + } + + Ort::AllocatorWithDefaultOptions allocator; // used in the macro below + SHERPA_ONNX_READ_META_DATA_VEC(encoder_dims_, "encoder_dims"); + SHERPA_ONNX_READ_META_DATA_VEC(attention_dims_, "attention_dims"); + SHERPA_ONNX_READ_META_DATA_VEC(num_encoder_layers_, "num_encoder_layers"); + SHERPA_ONNX_READ_META_DATA_VEC(cnn_module_kernels_, "cnn_module_kernels"); + SHERPA_ONNX_READ_META_DATA_VEC(left_context_len_, "left_context_len"); + + SHERPA_ONNX_READ_META_DATA(T_, "T"); + SHERPA_ONNX_READ_META_DATA(decode_chunk_len_, "decode_chunk_len"); + + if (config_.debug) { + auto print = [](const std::vector &v, const char *name) { + std::ostringstream os; + os << name << ": "; + for (auto i : v) { + os << i << " "; + } +#if __OHOS__ + SHERPA_ONNX_LOGE("%{public}s\n", os.str().c_str()); +#else + SHERPA_ONNX_LOGE("%s\n", os.str().c_str()); +#endif + }; + print(encoder_dims_, "encoder_dims"); + print(attention_dims_, "attention_dims"); + print(num_encoder_layers_, "num_encoder_layers"); + print(cnn_module_kernels_, "cnn_module_kernels"); + print(left_context_len_, "left_context_len"); +#if __OHOS__ + SHERPA_ONNX_LOGE("T: %{public}d", T_); + SHERPA_ONNX_LOGE("decode_chunk_len_: %{public}d", decode_chunk_len_); +#else + SHERPA_ONNX_LOGE("T: %d", T_); + SHERPA_ONNX_LOGE("decode_chunk_len_: %d", decode_chunk_len_); +#endif + } +} + +void OnlineZipformerTransducerModel::InitDecoder(void *model_data, + size_t model_data_length) { + decoder_sess_ = std::make_unique(env_, model_data, + model_data_length, sess_opts_); + + GetInputNames(decoder_sess_.get(), &decoder_input_names_, + &decoder_input_names_ptr_); + + GetOutputNames(decoder_sess_.get(), &decoder_output_names_, + &decoder_output_names_ptr_); + + // get meta data + Ort::ModelMetadata meta_data = decoder_sess_->GetModelMetadata(); + if (config_.debug) { + std::ostringstream os; + os << "---decoder---\n"; + PrintModelMetadata(os, meta_data); +#if __OHOS__ + SHERPA_ONNX_LOGE("%{public}s", os.str().c_str()); +#else + SHERPA_ONNX_LOGE("%s", os.str().c_str()); +#endif + } + + Ort::AllocatorWithDefaultOptions allocator; // used in the macro below + SHERPA_ONNX_READ_META_DATA(vocab_size_, "vocab_size"); + SHERPA_ONNX_READ_META_DATA(context_size_, "context_size"); +} + +void OnlineZipformerTransducerModel::InitJoiner(void *model_data, + size_t model_data_length) { + joiner_sess_ = std::make_unique(env_, model_data, + model_data_length, sess_opts_); + + GetInputNames(joiner_sess_.get(), &joiner_input_names_, + &joiner_input_names_ptr_); + + GetOutputNames(joiner_sess_.get(), &joiner_output_names_, + &joiner_output_names_ptr_); + + // get meta data + Ort::ModelMetadata meta_data = joiner_sess_->GetModelMetadata(); + if (config_.debug) { + std::ostringstream os; + os << "---joiner---\n"; + PrintModelMetadata(os, meta_data); +#if __OHOS__ + SHERPA_ONNX_LOGE("%{public}s", os.str().c_str()); +#else + SHERPA_ONNX_LOGE("%s", os.str().c_str()); +#endif + } +} + +std::vector OnlineZipformerTransducerModel::StackStates( + const std::vector> &states) const { + int32_t batch_size = static_cast(states.size()); + int32_t num_encoders = static_cast(num_encoder_layers_.size()); + + std::vector buf(batch_size); + + std::vector ans; + ans.reserve(states[0].size()); + + auto allocator = + const_cast(this)->allocator_; + + // cached_len + for (int32_t i = 0; i != num_encoders; ++i) { + for (int32_t n = 0; n != batch_size; ++n) { + buf[n] = &states[n][i]; + } + auto v = Cat(allocator, buf, 1); // (num_layers, 1) + ans.push_back(std::move(v)); + } + + // cached_avg + for (int32_t i = 0; i != num_encoders; ++i) { + for (int32_t n = 0; n != batch_size; ++n) { + buf[n] = &states[n][num_encoders + i]; + } + auto v = Cat(allocator, buf, 1); // (num_layers, 1, encoder_dims) + ans.push_back(std::move(v)); + } + + // cached_key + for (int32_t i = 0; i != num_encoders; ++i) { + for (int32_t n = 0; n != batch_size; ++n) { + buf[n] = &states[n][num_encoders * 2 + i]; + } + // (num_layers, left_context_len, 1, attention_dims) + auto v = Cat(allocator, buf, 2); + ans.push_back(std::move(v)); + } + + // cached_val + for (int32_t i = 0; i != num_encoders; ++i) { + for (int32_t n = 0; n != batch_size; ++n) { + buf[n] = &states[n][num_encoders * 3 + i]; + } + // (num_layers, left_context_len, 1, attention_dims/2) + auto v = Cat(allocator, buf, 2); + ans.push_back(std::move(v)); + } + + // cached_val2 + for (int32_t i = 0; i != num_encoders; ++i) { + for (int32_t n = 0; n != batch_size; ++n) { + buf[n] = &states[n][num_encoders * 4 + i]; + } + // (num_layers, left_context_len, 1, attention_dims/2) + auto v = Cat(allocator, buf, 2); + ans.push_back(std::move(v)); + } + + // cached_conv1 + for (int32_t i = 0; i != num_encoders; ++i) { + for (int32_t n = 0; n != batch_size; ++n) { + buf[n] = &states[n][num_encoders * 5 + i]; + } + // (num_layers, 1, encoder_dims, cnn_module_kernels-1) + auto v = Cat(allocator, buf, 1); + ans.push_back(std::move(v)); + } + + // cached_conv2 + for (int32_t i = 0; i != num_encoders; ++i) { + for (int32_t n = 0; n != batch_size; ++n) { + buf[n] = &states[n][num_encoders * 6 + i]; + } + // (num_layers, 1, encoder_dims, cnn_module_kernels-1) + auto v = Cat(allocator, buf, 1); + ans.push_back(std::move(v)); + } + + return ans; +} + +std::vector> +OnlineZipformerTransducerModel::UnStackStates( + const std::vector &states) const { + assert(states.size() == num_encoder_layers_.size() * 7); + + int32_t batch_size = states[0].GetTensorTypeAndShapeInfo().GetShape()[1]; + int32_t num_encoders = num_encoder_layers_.size(); + + auto allocator = + const_cast(this)->allocator_; + + std::vector> ans; + ans.resize(batch_size); + + // cached_len + for (int32_t i = 0; i != num_encoders; ++i) { + auto v = Unbind(allocator, &states[i], 1); + assert(v.size() == batch_size); + + for (int32_t n = 0; n != batch_size; ++n) { + ans[n].push_back(std::move(v[n])); + } + } + + // cached_avg + for (int32_t i = num_encoders; i != 2 * num_encoders; ++i) { + auto v = Unbind(allocator, &states[i], 1); + assert(v.size() == batch_size); + + for (int32_t n = 0; n != batch_size; ++n) { + ans[n].push_back(std::move(v[n])); + } + } + + // cached_key + for (int32_t i = 2 * num_encoders; i != 3 * num_encoders; ++i) { + auto v = Unbind(allocator, &states[i], 2); + assert(v.size() == batch_size); + + for (int32_t n = 0; n != batch_size; ++n) { + ans[n].push_back(std::move(v[n])); + } + } + + // cached_val + for (int32_t i = 3 * num_encoders; i != 4 * num_encoders; ++i) { + auto v = Unbind(allocator, &states[i], 2); + assert(v.size() == batch_size); + + for (int32_t n = 0; n != batch_size; ++n) { + ans[n].push_back(std::move(v[n])); + } + } + + // cached_val2 + for (int32_t i = 4 * num_encoders; i != 5 * num_encoders; ++i) { + auto v = Unbind(allocator, &states[i], 2); + assert(v.size() == batch_size); + + for (int32_t n = 0; n != batch_size; ++n) { + ans[n].push_back(std::move(v[n])); + } + } + + // cached_conv1 + for (int32_t i = 5 * num_encoders; i != 6 * num_encoders; ++i) { + auto v = Unbind(allocator, &states[i], 1); + assert(v.size() == batch_size); + + for (int32_t n = 0; n != batch_size; ++n) { + ans[n].push_back(std::move(v[n])); + } + } + + // cached_conv2 + for (int32_t i = 6 * num_encoders; i != 7 * num_encoders; ++i) { + auto v = Unbind(allocator, &states[i], 1); + assert(v.size() == batch_size); + + for (int32_t n = 0; n != batch_size; ++n) { + ans[n].push_back(std::move(v[n])); + } + } + + return ans; +} + +std::vector OnlineZipformerTransducerModel::GetEncoderInitStates() { + // Please see + // https://github.com/k2-fsa/icefall/blob/master/egs/librispeech/ASR/pruned_transducer_stateless7_streaming/zipformer.py#L673 + // for details + + int32_t n = static_cast(encoder_dims_.size()); + std::vector cached_len_vec; + std::vector cached_avg_vec; + std::vector cached_key_vec; + std::vector cached_val_vec; + std::vector cached_val2_vec; + std::vector cached_conv1_vec; + std::vector cached_conv2_vec; + + cached_len_vec.reserve(n); + cached_avg_vec.reserve(n); + cached_key_vec.reserve(n); + cached_val_vec.reserve(n); + cached_val2_vec.reserve(n); + cached_conv1_vec.reserve(n); + cached_conv2_vec.reserve(n); + + for (int32_t i = 0; i != n; ++i) { + { + std::array s{num_encoder_layers_[i], 1}; + auto v = + Ort::Value::CreateTensor(allocator_, s.data(), s.size()); + Fill(&v, 0); + cached_len_vec.push_back(std::move(v)); + } + + { + std::array s{num_encoder_layers_[i], 1, encoder_dims_[i]}; + auto v = Ort::Value::CreateTensor(allocator_, s.data(), s.size()); + Fill(&v, 0); + cached_avg_vec.push_back(std::move(v)); + } + + { + std::array s{num_encoder_layers_[i], left_context_len_[i], 1, + attention_dims_[i]}; + auto v = Ort::Value::CreateTensor(allocator_, s.data(), s.size()); + Fill(&v, 0); + cached_key_vec.push_back(std::move(v)); + } + + { + std::array s{num_encoder_layers_[i], left_context_len_[i], 1, + attention_dims_[i] / 2}; + auto v = Ort::Value::CreateTensor(allocator_, s.data(), s.size()); + Fill(&v, 0); + cached_val_vec.push_back(std::move(v)); + } + + { + std::array s{num_encoder_layers_[i], left_context_len_[i], 1, + attention_dims_[i] / 2}; + auto v = Ort::Value::CreateTensor(allocator_, s.data(), s.size()); + Fill(&v, 0); + cached_val2_vec.push_back(std::move(v)); + } + + { + std::array s{num_encoder_layers_[i], 1, encoder_dims_[i], + cnn_module_kernels_[i] - 1}; + auto v = Ort::Value::CreateTensor(allocator_, s.data(), s.size()); + Fill(&v, 0); + cached_conv1_vec.push_back(std::move(v)); + } + + { + std::array s{num_encoder_layers_[i], 1, encoder_dims_[i], + cnn_module_kernels_[i] - 1}; + auto v = Ort::Value::CreateTensor(allocator_, s.data(), s.size()); + Fill(&v, 0); + cached_conv2_vec.push_back(std::move(v)); + } + } + + std::vector ans; + ans.reserve(n * 7); + + for (auto &v : cached_len_vec) ans.push_back(std::move(v)); + for (auto &v : cached_avg_vec) ans.push_back(std::move(v)); + for (auto &v : cached_key_vec) ans.push_back(std::move(v)); + for (auto &v : cached_val_vec) ans.push_back(std::move(v)); + for (auto &v : cached_val2_vec) ans.push_back(std::move(v)); + for (auto &v : cached_conv1_vec) ans.push_back(std::move(v)); + for (auto &v : cached_conv2_vec) ans.push_back(std::move(v)); + + return ans; +} + +std::pair> +OnlineZipformerTransducerModel::RunEncoder(Ort::Value features, + std::vector states, + Ort::Value /* processed_frames */) { + std::vector encoder_inputs; + encoder_inputs.reserve(1 + states.size()); + + encoder_inputs.push_back(std::move(features)); + for (auto &v : states) { + encoder_inputs.push_back(std::move(v)); + } + + auto encoder_out = encoder_sess_->Run( + {}, encoder_input_names_ptr_.data(), encoder_inputs.data(), + encoder_inputs.size(), encoder_output_names_ptr_.data(), + encoder_output_names_ptr_.size()); + + std::vector next_states; + next_states.reserve(states.size()); + + for (int32_t i = 1; i != static_cast(encoder_out.size()); ++i) { + next_states.push_back(std::move(encoder_out[i])); + } + + return {std::move(encoder_out[0]), std::move(next_states)}; +} + +Ort::Value OnlineZipformerTransducerModel::RunDecoder( + Ort::Value decoder_input) { + auto decoder_out = decoder_sess_->Run( + {}, decoder_input_names_ptr_.data(), &decoder_input, 1, + decoder_output_names_ptr_.data(), decoder_output_names_ptr_.size()); + return std::move(decoder_out[0]); +} + +Ort::Value OnlineZipformerTransducerModel::RunJoiner(Ort::Value encoder_out, + Ort::Value decoder_out) { + std::array joiner_input = {std::move(encoder_out), + std::move(decoder_out)}; + auto logit = + joiner_sess_->Run({}, joiner_input_names_ptr_.data(), joiner_input.data(), + joiner_input.size(), joiner_output_names_ptr_.data(), + joiner_output_names_ptr_.size()); + + return std::move(logit[0]); +} + +#if __ANDROID_API__ >= 9 +template OnlineZipformerTransducerModel::OnlineZipformerTransducerModel( + AAssetManager *mgr, const OnlineModelConfig &config); +#endif + +#if __OHOS__ +template OnlineZipformerTransducerModel::OnlineZipformerTransducerModel( + NativeResourceManager *mgr, const OnlineModelConfig &config); +#endif + +} // namespace sherpa_onnx diff --git a/audio_processing/sherpa-onnx/csrc/online-zipformer-transducer-model.h b/audio_processing/sherpa-onnx/csrc/online-zipformer-transducer-model.h new file mode 100644 index 000000000..9e4368a69 --- /dev/null +++ b/audio_processing/sherpa-onnx/csrc/online-zipformer-transducer-model.h @@ -0,0 +1,99 @@ +// sherpa-onnx/csrc/online-zipformer-transducer-model.h +// +// Copyright (c) 2023 Xiaomi Corporation +#ifndef SHERPA_ONNX_CSRC_ONLINE_ZIPFORMER_TRANSDUCER_MODEL_H_ +#define SHERPA_ONNX_CSRC_ONLINE_ZIPFORMER_TRANSDUCER_MODEL_H_ + +#include +#include +#include +#include + +#include "onnxruntime_cxx_api.h" // NOLINT +#include "sherpa-onnx/csrc/online-model-config.h" +#include "sherpa-onnx/csrc/online-transducer-model.h" + +namespace sherpa_onnx { + +class OnlineZipformerTransducerModel : public OnlineTransducerModel { + public: + explicit OnlineZipformerTransducerModel(const OnlineModelConfig &config); + + template + OnlineZipformerTransducerModel(Manager *mgr, const OnlineModelConfig &config); + + std::vector StackStates( + const std::vector> &states) const override; + + std::vector> UnStackStates( + const std::vector &states) const override; + + std::vector GetEncoderInitStates() override; + + std::pair> RunEncoder( + Ort::Value features, std::vector states, + Ort::Value processed_frames) override; + + Ort::Value RunDecoder(Ort::Value decoder_input) override; + + Ort::Value RunJoiner(Ort::Value encoder_out, Ort::Value decoder_out) override; + + int32_t ContextSize() const override { return context_size_; } + + int32_t ChunkSize() const override { return T_; } + + int32_t ChunkShift() const override { return decode_chunk_len_; } + + int32_t VocabSize() const override { return vocab_size_; } + OrtAllocator *Allocator() override { return allocator_; } + + private: + void InitEncoder(void *model_data, size_t model_data_length); + void InitDecoder(void *model_data, size_t model_data_length); + void InitJoiner(void *model_data, size_t model_data_length); + + private: + Ort::Env env_; + Ort::SessionOptions sess_opts_; + Ort::AllocatorWithDefaultOptions allocator_; + + std::unique_ptr encoder_sess_; + std::unique_ptr decoder_sess_; + std::unique_ptr joiner_sess_; + + std::vector encoder_input_names_; + std::vector encoder_input_names_ptr_; + + std::vector encoder_output_names_; + std::vector encoder_output_names_ptr_; + + std::vector decoder_input_names_; + std::vector decoder_input_names_ptr_; + + std::vector decoder_output_names_; + std::vector decoder_output_names_ptr_; + + std::vector joiner_input_names_; + std::vector joiner_input_names_ptr_; + + std::vector joiner_output_names_; + std::vector joiner_output_names_ptr_; + + OnlineModelConfig config_; + + std::vector encoder_dims_; + std::vector attention_dims_; + std::vector num_encoder_layers_; + std::vector cnn_module_kernels_; + std::vector left_context_len_; + + int32_t T_ = 0; + int32_t decode_chunk_len_ = 0; + + int32_t context_size_ = 0; + int32_t vocab_size_ = 0; +}; + +} // namespace sherpa_onnx + +#endif // SHERPA_ONNX_CSRC_ONLINE_ZIPFORMER_TRANSDUCER_MODEL_H_ diff --git a/audio_processing/sherpa-onnx/csrc/online-zipformer2-ctc-model-config.cc b/audio_processing/sherpa-onnx/csrc/online-zipformer2-ctc-model-config.cc new file mode 100644 index 000000000..ed9e7b8a9 --- /dev/null +++ b/audio_processing/sherpa-onnx/csrc/online-zipformer2-ctc-model-config.cc @@ -0,0 +1,42 @@ +// sherpa-onnx/csrc/online-zipformer2-ctc-model-config.cc +// +// Copyright (c) 2023 Xiaomi Corporation + +#include "sherpa-onnx/csrc/online-zipformer2-ctc-model-config.h" + +#include "sherpa-onnx/csrc/file-utils.h" +#include "sherpa-onnx/csrc/macros.h" + +namespace sherpa_onnx { + +void OnlineZipformer2CtcModelConfig::Register(ParseOptions *po) { + po->Register("zipformer2-ctc-model", &model, + "Path to CTC model.onnx. See also " + "https://github.com/k2-fsa/icefall/pull/1413"); +} + +bool OnlineZipformer2CtcModelConfig::Validate() const { + if (model.empty()) { + SHERPA_ONNX_LOGE("--zipformer2-ctc-model is empty!"); + return false; + } + + if (!FileExists(model)) { + SHERPA_ONNX_LOGE("--zipformer2-ctc-model '%s' does not exist", + model.c_str()); + return false; + } + + return true; +} + +std::string OnlineZipformer2CtcModelConfig::ToString() const { + std::ostringstream os; + + os << "OnlineZipformer2CtcModelConfig("; + os << "model=\"" << model << "\")"; + + return os.str(); +} + +} // namespace sherpa_onnx diff --git a/audio_processing/sherpa-onnx/csrc/online-zipformer2-ctc-model-config.h b/audio_processing/sherpa-onnx/csrc/online-zipformer2-ctc-model-config.h new file mode 100644 index 000000000..18115c8fe --- /dev/null +++ b/audio_processing/sherpa-onnx/csrc/online-zipformer2-ctc-model-config.h @@ -0,0 +1,29 @@ +// sherpa-onnx/csrc/online-zipformer2-ctc-model-config.h +// +// Copyright (c) 2023 Xiaomi Corporation +#ifndef SHERPA_ONNX_CSRC_ONLINE_ZIPFORMER2_CTC_MODEL_CONFIG_H_ +#define SHERPA_ONNX_CSRC_ONLINE_ZIPFORMER2_CTC_MODEL_CONFIG_H_ + +#include + +#include "sherpa-onnx/csrc/parse-options.h" + +namespace sherpa_onnx { + +struct OnlineZipformer2CtcModelConfig { + std::string model; + + OnlineZipformer2CtcModelConfig() = default; + + explicit OnlineZipformer2CtcModelConfig(const std::string &model) + : model(model) {} + + void Register(ParseOptions *po); + bool Validate() const; + + std::string ToString() const; +}; + +} // namespace sherpa_onnx + +#endif // SHERPA_ONNX_CSRC_ONLINE_ZIPFORMER2_CTC_MODEL_CONFIG_H_ diff --git a/audio_processing/sherpa-onnx/csrc/online-zipformer2-ctc-model.cc b/audio_processing/sherpa-onnx/csrc/online-zipformer2-ctc-model.cc new file mode 100644 index 000000000..f7cccc434 --- /dev/null +++ b/audio_processing/sherpa-onnx/csrc/online-zipformer2-ctc-model.cc @@ -0,0 +1,494 @@ +// sherpa-onnx/csrc/online-zipformer2-ctc-model.cc +// +// Copyright (c) 2023 Xiaomi Corporation + +#include "sherpa-onnx/csrc/online-zipformer2-ctc-model.h" + +#include +#include +#include +#include +#include + +#if __ANDROID_API__ >= 9 +#include "android/asset_manager.h" +#include "android/asset_manager_jni.h" +#endif + +#if __OHOS__ +#include "rawfile/raw_file_manager.h" +#endif + +#include "sherpa-onnx/csrc/cat.h" +#include "sherpa-onnx/csrc/file-utils.h" +#include "sherpa-onnx/csrc/macros.h" +#include "sherpa-onnx/csrc/onnx-utils.h" +#include "sherpa-onnx/csrc/session.h" +#include "sherpa-onnx/csrc/text-utils.h" +#include "sherpa-onnx/csrc/unbind.h" + +namespace sherpa_onnx { + +class OnlineZipformer2CtcModel::Impl { + public: + explicit Impl(const OnlineModelConfig &config) + : config_(config), + env_(ORT_LOGGING_LEVEL_ERROR), + sess_opts_(GetSessionOptions(config)), + allocator_{} { + { + auto buf = ReadFile(config.zipformer2_ctc.model); + Init(buf.data(), buf.size()); + } + } + + template + Impl(Manager *mgr, const OnlineModelConfig &config) + : config_(config), + env_(ORT_LOGGING_LEVEL_ERROR), + sess_opts_(GetSessionOptions(config)), + allocator_{} { + { + auto buf = ReadFile(mgr, config.zipformer2_ctc.model); + Init(buf.data(), buf.size()); + } + } + + std::vector Forward(Ort::Value features, + std::vector states) { + std::vector inputs; + inputs.reserve(1 + states.size()); + + inputs.push_back(std::move(features)); + for (auto &v : states) { + inputs.push_back(std::move(v)); + } + + return sess_->Run({}, input_names_ptr_.data(), inputs.data(), inputs.size(), + output_names_ptr_.data(), output_names_ptr_.size()); + } + + int32_t VocabSize() const { return vocab_size_; } + + int32_t ChunkLength() const { return T_; } + + int32_t ChunkShift() const { return decode_chunk_len_; } + + bool UseWhisperFeature() const { return use_whisper_feature_; } + + OrtAllocator *Allocator() { return allocator_; } + + // Return a vector containing 3 tensors + // - attn_cache + // - conv_cache + // - offset + std::vector GetInitStates() { + std::vector ans; + ans.reserve(initial_states_.size()); + for (auto &s : initial_states_) { + ans.push_back(View(&s)); + } + return ans; + } + + std::vector StackStates( + std::vector> states) { + int32_t batch_size = static_cast(states.size()); + + std::vector buf(batch_size); + + std::vector ans; + int32_t num_states = static_cast(states[0].size()); + ans.reserve(num_states); + + for (int32_t i = 0; i != (num_states - 2) / 6; ++i) { + { + for (int32_t n = 0; n != batch_size; ++n) { + buf[n] = &states[n][6 * i]; + } + auto v = Cat(allocator_, buf, 1); + ans.push_back(std::move(v)); + } + { + for (int32_t n = 0; n != batch_size; ++n) { + buf[n] = &states[n][6 * i + 1]; + } + auto v = Cat(allocator_, buf, 1); + ans.push_back(std::move(v)); + } + { + for (int32_t n = 0; n != batch_size; ++n) { + buf[n] = &states[n][6 * i + 2]; + } + auto v = Cat(allocator_, buf, 1); + ans.push_back(std::move(v)); + } + { + for (int32_t n = 0; n != batch_size; ++n) { + buf[n] = &states[n][6 * i + 3]; + } + auto v = Cat(allocator_, buf, 1); + ans.push_back(std::move(v)); + } + { + for (int32_t n = 0; n != batch_size; ++n) { + buf[n] = &states[n][6 * i + 4]; + } + auto v = Cat(allocator_, buf, 0); + ans.push_back(std::move(v)); + } + { + for (int32_t n = 0; n != batch_size; ++n) { + buf[n] = &states[n][6 * i + 5]; + } + auto v = Cat(allocator_, buf, 0); + ans.push_back(std::move(v)); + } + } + + { + for (int32_t n = 0; n != batch_size; ++n) { + buf[n] = &states[n][num_states - 2]; + } + auto v = Cat(allocator_, buf, 0); + ans.push_back(std::move(v)); + } + + { + for (int32_t n = 0; n != batch_size; ++n) { + buf[n] = &states[n][num_states - 1]; + } + auto v = Cat(allocator_, buf, 0); + ans.push_back(std::move(v)); + } + return ans; + } + + std::vector> UnStackStates( + std::vector states) { + int32_t m = std::accumulate(num_encoder_layers_.begin(), + num_encoder_layers_.end(), 0); + assert(states.size() == m * 6 + 2); + + int32_t batch_size = states[0].GetTensorTypeAndShapeInfo().GetShape()[1]; + + std::vector> ans; + ans.resize(batch_size); + + for (int32_t i = 0; i != m; ++i) { + { + auto v = Unbind(allocator_, &states[i * 6], 1); + assert(v.size() == batch_size); + + for (int32_t n = 0; n != batch_size; ++n) { + ans[n].push_back(std::move(v[n])); + } + } + { + auto v = Unbind(allocator_, &states[i * 6 + 1], 1); + assert(v.size() == batch_size); + + for (int32_t n = 0; n != batch_size; ++n) { + ans[n].push_back(std::move(v[n])); + } + } + { + auto v = Unbind(allocator_, &states[i * 6 + 2], 1); + assert(v.size() == batch_size); + + for (int32_t n = 0; n != batch_size; ++n) { + ans[n].push_back(std::move(v[n])); + } + } + { + auto v = Unbind(allocator_, &states[i * 6 + 3], 1); + assert(v.size() == batch_size); + + for (int32_t n = 0; n != batch_size; ++n) { + ans[n].push_back(std::move(v[n])); + } + } + { + auto v = Unbind(allocator_, &states[i * 6 + 4], 0); + assert(v.size() == batch_size); + + for (int32_t n = 0; n != batch_size; ++n) { + ans[n].push_back(std::move(v[n])); + } + } + { + auto v = Unbind(allocator_, &states[i * 6 + 5], 0); + assert(v.size() == batch_size); + + for (int32_t n = 0; n != batch_size; ++n) { + ans[n].push_back(std::move(v[n])); + } + } + } + + { + auto v = Unbind(allocator_, &states[m * 6], 0); + assert(v.size() == batch_size); + + for (int32_t n = 0; n != batch_size; ++n) { + ans[n].push_back(std::move(v[n])); + } + } + { + auto v = Unbind(allocator_, &states[m * 6 + 1], 0); + assert(v.size() == batch_size); + + for (int32_t n = 0; n != batch_size; ++n) { + ans[n].push_back(std::move(v[n])); + } + } + + return ans; + } + + private: + void Init(void *model_data, size_t model_data_length) { + sess_ = std::make_unique(env_, model_data, model_data_length, + sess_opts_); + + GetInputNames(sess_.get(), &input_names_, &input_names_ptr_); + + GetOutputNames(sess_.get(), &output_names_, &output_names_ptr_); + + // get meta data + Ort::ModelMetadata meta_data = sess_->GetModelMetadata(); + if (config_.debug) { + std::ostringstream os; + os << "---zipformer2_ctc---\n"; + PrintModelMetadata(os, meta_data); +#if __OHOS__ + SHERPA_ONNX_LOGE("%{public}s", os.str().c_str()); +#else + SHERPA_ONNX_LOGE("%s", os.str().c_str()); +#endif + } + + Ort::AllocatorWithDefaultOptions allocator; // used in the macro below + SHERPA_ONNX_READ_META_DATA_VEC(encoder_dims_, "encoder_dims"); + SHERPA_ONNX_READ_META_DATA_VEC(query_head_dims_, "query_head_dims"); + SHERPA_ONNX_READ_META_DATA_VEC(value_head_dims_, "value_head_dims"); + SHERPA_ONNX_READ_META_DATA_VEC(num_heads_, "num_heads"); + SHERPA_ONNX_READ_META_DATA_VEC(num_encoder_layers_, "num_encoder_layers"); + SHERPA_ONNX_READ_META_DATA_VEC(cnn_module_kernels_, "cnn_module_kernels"); + SHERPA_ONNX_READ_META_DATA_VEC(left_context_len_, "left_context_len"); + + SHERPA_ONNX_READ_META_DATA(T_, "T"); + SHERPA_ONNX_READ_META_DATA(decode_chunk_len_, "decode_chunk_len"); + + std::string feature_type; + SHERPA_ONNX_READ_META_DATA_STR_WITH_DEFAULT(feature_type, "feature", ""); + if (feature_type == "whisper") { + use_whisper_feature_ = true; + } + + { + auto shape = + sess_->GetOutputTypeInfo(0).GetTensorTypeAndShapeInfo().GetShape(); + vocab_size_ = shape[2]; + } + + if (config_.debug) { + auto print = [](const std::vector &v, const char *name) { + std::ostringstream os; + os << name << ": "; + for (auto i : v) { + os << i << " "; + } + SHERPA_ONNX_LOGE("%s\n", os.str().c_str()); + }; + print(encoder_dims_, "encoder_dims"); + print(query_head_dims_, "query_head_dims"); + print(value_head_dims_, "value_head_dims"); + print(num_heads_, "num_heads"); + print(num_encoder_layers_, "num_encoder_layers"); + print(cnn_module_kernels_, "cnn_module_kernels"); + print(left_context_len_, "left_context_len"); + SHERPA_ONNX_LOGE("T: %d", T_); + SHERPA_ONNX_LOGE("decode_chunk_len_: %d", decode_chunk_len_); + SHERPA_ONNX_LOGE("vocab_size_: %d", vocab_size_); + } + + InitStates(); + } + + void InitStates() { + int32_t n = static_cast(encoder_dims_.size()); + int32_t m = std::accumulate(num_encoder_layers_.begin(), + num_encoder_layers_.end(), 0); + initial_states_.reserve(m * 6 + 2); + + for (int32_t i = 0; i != n; ++i) { + int32_t num_layers = num_encoder_layers_[i]; + int32_t key_dim = query_head_dims_[i] * num_heads_[i]; + int32_t value_dim = value_head_dims_[i] * num_heads_[i]; + int32_t nonlin_attn_head_dim = 3 * encoder_dims_[i] / 4; + + for (int32_t j = 0; j != num_layers; ++j) { + { + std::array s{left_context_len_[i], 1, key_dim}; + auto v = + Ort::Value::CreateTensor(allocator_, s.data(), s.size()); + Fill(&v, 0); + initial_states_.push_back(std::move(v)); + } + + { + std::array s{1, 1, left_context_len_[i], + nonlin_attn_head_dim}; + auto v = + Ort::Value::CreateTensor(allocator_, s.data(), s.size()); + Fill(&v, 0); + initial_states_.push_back(std::move(v)); + } + + { + std::array s{left_context_len_[i], 1, value_dim}; + auto v = + Ort::Value::CreateTensor(allocator_, s.data(), s.size()); + Fill(&v, 0); + initial_states_.push_back(std::move(v)); + } + + { + std::array s{left_context_len_[i], 1, value_dim}; + auto v = + Ort::Value::CreateTensor(allocator_, s.data(), s.size()); + Fill(&v, 0); + initial_states_.push_back(std::move(v)); + } + + { + std::array s{1, encoder_dims_[i], + cnn_module_kernels_[i] / 2}; + auto v = + Ort::Value::CreateTensor(allocator_, s.data(), s.size()); + Fill(&v, 0); + initial_states_.push_back(std::move(v)); + } + + { + std::array s{1, encoder_dims_[i], + cnn_module_kernels_[i] / 2}; + auto v = + Ort::Value::CreateTensor(allocator_, s.data(), s.size()); + Fill(&v, 0); + initial_states_.push_back(std::move(v)); + } + } + } + + { + std::array s{1, 128, 3, 19}; + auto v = Ort::Value::CreateTensor(allocator_, s.data(), s.size()); + Fill(&v, 0); + initial_states_.push_back(std::move(v)); + } + + { + std::array s{1}; + auto v = + Ort::Value::CreateTensor(allocator_, s.data(), s.size()); + Fill(&v, 0); + initial_states_.push_back(std::move(v)); + } + } + + private: + OnlineModelConfig config_; + Ort::Env env_; + Ort::SessionOptions sess_opts_; + Ort::AllocatorWithDefaultOptions allocator_; + + std::unique_ptr sess_; + + std::vector input_names_; + std::vector input_names_ptr_; + + std::vector output_names_; + std::vector output_names_ptr_; + + std::vector initial_states_; + + std::vector encoder_dims_; + std::vector query_head_dims_; + std::vector value_head_dims_; + std::vector num_heads_; + std::vector num_encoder_layers_; + std::vector cnn_module_kernels_; + std::vector left_context_len_; + + int32_t T_ = 0; + int32_t decode_chunk_len_ = 0; + int32_t vocab_size_ = 0; + + // for models from + // https://github.com/k2-fsa/icefall/blob/master/egs/multi_zh-hans/ASR/RESULTS.md#streaming-with-ctc-head + bool use_whisper_feature_ = false; +}; + +OnlineZipformer2CtcModel::OnlineZipformer2CtcModel( + const OnlineModelConfig &config) + : impl_(std::make_unique(config)) {} + +template +OnlineZipformer2CtcModel::OnlineZipformer2CtcModel( + Manager *mgr, const OnlineModelConfig &config) + : impl_(std::make_unique(mgr, config)) {} + +OnlineZipformer2CtcModel::~OnlineZipformer2CtcModel() = default; + +std::vector OnlineZipformer2CtcModel::Forward( + Ort::Value x, std::vector states) const { + return impl_->Forward(std::move(x), std::move(states)); +} + +int32_t OnlineZipformer2CtcModel::VocabSize() const { + return impl_->VocabSize(); +} + +int32_t OnlineZipformer2CtcModel::ChunkLength() const { + return impl_->ChunkLength(); +} + +int32_t OnlineZipformer2CtcModel::ChunkShift() const { + return impl_->ChunkShift(); +} + +bool OnlineZipformer2CtcModel::UseWhisperFeature() const { + return impl_->UseWhisperFeature(); +} + +OrtAllocator *OnlineZipformer2CtcModel::Allocator() const { + return impl_->Allocator(); +} + +std::vector OnlineZipformer2CtcModel::GetInitStates() const { + return impl_->GetInitStates(); +} + +std::vector OnlineZipformer2CtcModel::StackStates( + std::vector> states) const { + return impl_->StackStates(std::move(states)); +} + +std::vector> OnlineZipformer2CtcModel::UnStackStates( + std::vector states) const { + return impl_->UnStackStates(std::move(states)); +} + +#if __ANDROID_API__ >= 9 +template OnlineZipformer2CtcModel::OnlineZipformer2CtcModel( + AAssetManager *mgr, const OnlineModelConfig &config); +#endif + +#if __OHOS__ +template OnlineZipformer2CtcModel::OnlineZipformer2CtcModel( + NativeResourceManager *mgr, const OnlineModelConfig &config); +#endif + +} // namespace sherpa_onnx diff --git a/audio_processing/sherpa-onnx/csrc/online-zipformer2-ctc-model.h b/audio_processing/sherpa-onnx/csrc/online-zipformer2-ctc-model.h new file mode 100644 index 000000000..3cbd4cc7a --- /dev/null +++ b/audio_processing/sherpa-onnx/csrc/online-zipformer2-ctc-model.h @@ -0,0 +1,76 @@ +// sherpa-onnx/csrc/online-zipformer2-ctc-model.h +// +// Copyright (c) 2023 Xiaomi Corporation +#ifndef SHERPA_ONNX_CSRC_ONLINE_ZIPFORMER2_CTC_MODEL_H_ +#define SHERPA_ONNX_CSRC_ONLINE_ZIPFORMER2_CTC_MODEL_H_ + +#include +#include +#include + +#include "onnxruntime_cxx_api.h" // NOLINT +#include "sherpa-onnx/csrc/online-ctc-model.h" +#include "sherpa-onnx/csrc/online-model-config.h" + +namespace sherpa_onnx { + +class OnlineZipformer2CtcModel : public OnlineCtcModel { + public: + explicit OnlineZipformer2CtcModel(const OnlineModelConfig &config); + + template + OnlineZipformer2CtcModel(Manager *mgr, const OnlineModelConfig &config); + + ~OnlineZipformer2CtcModel() override; + + // A list of tensors. + // See also + // https://github.com/k2-fsa/icefall/pull/1413 + // and + // https://github.com/k2-fsa/icefall/pull/1415 + std::vector GetInitStates() const override; + + std::vector StackStates( + std::vector> states) const override; + + std::vector> UnStackStates( + std::vector states) const override; + + /** + * + * @param x A 3-D tensor of shape (N, T, C). N has to be 1. + * @param states It is from GetInitStates() or returned from this method. + * + * @return Return a list of tensors + * - ans[0] contains log_probs, of shape (N, T, C) + * - ans[1:] contains next_states + */ + std::vector Forward( + Ort::Value x, std::vector states) const override; + + /** Return the vocabulary size of the model + */ + int32_t VocabSize() const override; + + /** Return an allocator for allocating memory + */ + OrtAllocator *Allocator() const override; + + // The model accepts this number of frames before subsampling as input + int32_t ChunkLength() const override; + + // Similar to frame_shift in feature extractor, after processing + // ChunkLength() frames, we advance by ChunkShift() frames + // before we process the next chunk. + int32_t ChunkShift() const override; + + bool UseWhisperFeature() const override; + + private: + class Impl; + std::unique_ptr impl_; +}; + +} // namespace sherpa_onnx + +#endif // SHERPA_ONNX_CSRC_ONLINE_ZIPFORMER2_CTC_MODEL_H_ diff --git a/audio_processing/sherpa-onnx/online-decode-files.py b/audio_processing/sherpa-onnx/online-decode-files.py new file mode 100644 index 000000000..586741ffd --- /dev/null +++ b/audio_processing/sherpa-onnx/online-decode-files.py @@ -0,0 +1,449 @@ +#!/usr/bin/env python3 + +""" +This file demonstrates how to use sherpa-onnx Python API to transcribe +file(s) with a streaming model. + +Usage: + +(1) Streaming transducer + +curl -SL -O https://github.com/k2-fsa/sherpa-onnx/releases/download/asr-models/sherpa-onnx-streaming-zipformer-en-2023-06-26.tar.bz2 +tar xvf sherpa-onnx-streaming-zipformer-en-2023-06-26.tar.bz2 +rm sherpa-onnx-streaming-zipformer-en-2023-06-26.tar.bz2 + +./python-api-examples/online-decode-files.py \ + --tokens=./sherpa-onnx-streaming-zipformer-en-2023-06-26/tokens.txt \ + --encoder=./sherpa-onnx-streaming-zipformer-en-2023-06-26/encoder-epoch-99-avg-1-chunk-16-left-64.onnx \ + --decoder=./sherpa-onnx-streaming-zipformer-en-2023-06-26/decoder-epoch-99-avg-1-chunk-16-left-64.onnx \ + --joiner=./sherpa-onnx-streaming-zipformer-en-2023-06-26/joiner-epoch-99-avg-1-chunk-16-left-64.onnx \ + ./sherpa-onnx-streaming-zipformer-en-2023-06-26/test_wavs/0.wav \ + ./sherpa-onnx-streaming-zipformer-en-2023-06-26/test_wavs/1.wav \ + ./sherpa-onnx-streaming-zipformer-en-2023-06-26/test_wavs/8k.wav + +or with RNN LM rescoring and LODR: + +./python-api-examples/online-decode-files.py \ + --tokens=./sherpa-onnx-streaming-zipformer-en-2023-06-26/tokens.txt \ + --encoder=./sherpa-onnx-streaming-zipformer-en-2023-06-26/encoder-epoch-99-avg-1-chunk-16-left-64.onnx \ + --decoder=./sherpa-onnx-streaming-zipformer-en-2023-06-26/decoder-epoch-99-avg-1-chunk-16-left-64.onnx \ + --joiner=./sherpa-onnx-streaming-zipformer-en-2023-06-26/joiner-epoch-99-avg-1-chunk-16-left-64.onnx \ + --decoding-method=modified_beam_search \ + --lm=/path/to/lm.onnx \ + --lm-scale=0.1 \ + --lodr-fst=/path/to/lodr.fst \ + --lodr-scale=-0.1 \ + ./sherpa-onnx-streaming-zipformer-en-2023-06-26/test_wavs/0.wav \ + ./sherpa-onnx-streaming-zipformer-en-2023-06-26/test_wavs/1.wav \ + ./sherpa-onnx-streaming-zipformer-en-2023-06-26/test_wavs/8k.wav + +(2) Streaming paraformer + +curl -SL -O https://github.com/k2-fsa/sherpa-onnx/releases/download/asr-models/sherpa-onnx-streaming-paraformer-bilingual-zh-en.tar.bz2 +tar xvf sherpa-onnx-streaming-paraformer-bilingual-zh-en.tar.bz2 +rm sherpa-onnx-streaming-paraformer-bilingual-zh-en.tar.bz2 + +./python-api-examples/online-decode-files.py \ + --tokens=./sherpa-onnx-streaming-paraformer-bilingual-zh-en/tokens.txt \ + --paraformer-encoder=./sherpa-onnx-streaming-paraformer-bilingual-zh-en/encoder.int8.onnx \ + --paraformer-decoder=./sherpa-onnx-streaming-paraformer-bilingual-zh-en/decoder.int8.onnx \ + ./sherpa-onnx-streaming-paraformer-bilingual-zh-en/test_wavs/0.wav \ + ./sherpa-onnx-streaming-paraformer-bilingual-zh-en/test_wavs/1.wav \ + ./sherpa-onnx-streaming-paraformer-bilingual-zh-en/test_wavs/2.wav \ + ./sherpa-onnx-streaming-paraformer-bilingual-zh-en/test_wavs/3.wav \ + ./sherpa-onnx-streaming-paraformer-bilingual-zh-en/test_wavs/8k.wav + +(3) Streaming Zipformer2 CTC + +wget https://github.com/k2-fsa/sherpa-onnx/releases/download/asr-models/sherpa-onnx-streaming-zipformer-ctc-multi-zh-hans-2023-12-13.tar.bz2 +tar xvf sherpa-onnx-streaming-zipformer-ctc-multi-zh-hans-2023-12-13.tar.bz2 +rm sherpa-onnx-streaming-zipformer-ctc-multi-zh-hans-2023-12-13.tar.bz2 +ls -lh sherpa-onnx-streaming-zipformer-ctc-multi-zh-hans-2023-12-13 + +./python-api-examples/online-decode-files.py \ + --zipformer2-ctc=./sherpa-onnx-streaming-zipformer-ctc-multi-zh-hans-2023-12-13/ctc-epoch-20-avg-1-chunk-16-left-128.onnx \ + --tokens=./sherpa-onnx-streaming-zipformer-ctc-multi-zh-hans-2023-12-13/tokens.txt \ + ./sherpa-onnx-streaming-zipformer-ctc-multi-zh-hans-2023-12-13/test_wavs/DEV_T0000000000.wav \ + ./sherpa-onnx-streaming-zipformer-ctc-multi-zh-hans-2023-12-13/test_wavs/DEV_T0000000001.wav + +(4) Streaming Conformer CTC from WeNet + +curl -SL -O https://github.com/k2-fsa/sherpa-onnx/releases/download/asr-models/sherpa-onnx-zh-wenet-wenetspeech.tar.bz2 +tar xvf sherpa-onnx-zh-wenet-wenetspeech.tar.bz2 +rm sherpa-onnx-zh-wenet-wenetspeech.tar.bz2 + +./python-api-examples/online-decode-files.py \ + --tokens=./sherpa-onnx-zh-wenet-wenetspeech/tokens.txt \ + --wenet-ctc=./sherpa-onnx-zh-wenet-wenetspeech/model-streaming.onnx \ + ./sherpa-onnx-zh-wenet-wenetspeech/test_wavs/0.wav \ + ./sherpa-onnx-zh-wenet-wenetspeech/test_wavs/1.wav \ + ./sherpa-onnx-zh-wenet-wenetspeech/test_wavs/8k.wav + + +Please refer to +https://k2-fsa.github.io/sherpa/onnx/pretrained_models/index.html +to download streaming pre-trained models. +""" +import argparse +import time +import wave +from pathlib import Path +from typing import List, Tuple + +import numpy as np +import sherpa_onnx + + +def get_args(): + parser = argparse.ArgumentParser( + formatter_class=argparse.ArgumentDefaultsHelpFormatter + ) + + parser.add_argument( + "--tokens", + type=str, + help="Path to tokens.txt", + ) + + parser.add_argument( + "--encoder", + type=str, + help="Path to the transducer encoder model", + ) + + parser.add_argument( + "--decoder", + type=str, + help="Path to the transducer decoder model", + ) + + parser.add_argument( + "--joiner", + type=str, + help="Path to the transducer joiner model", + ) + + parser.add_argument( + "--zipformer2-ctc", + type=str, + help="Path to the zipformer2 ctc model", + ) + + parser.add_argument( + "--paraformer-encoder", + type=str, + help="Path to the paraformer encoder model", + ) + + parser.add_argument( + "--paraformer-decoder", + type=str, + help="Path to the paraformer decoder model", + ) + + parser.add_argument( + "--wenet-ctc", + type=str, + help="Path to the wenet ctc model", + ) + + parser.add_argument( + "--wenet-ctc-chunk-size", + type=int, + default=16, + help="The --chunk-size parameter for streaming WeNet models", + ) + + parser.add_argument( + "--wenet-ctc-num-left-chunks", + type=int, + default=4, + help="The --num-left-chunks parameter for streaming WeNet models", + ) + + parser.add_argument( + "--num-threads", + type=int, + default=1, + help="Number of threads for neural network computation", + ) + + parser.add_argument( + "--decoding-method", + type=str, + default="greedy_search", + help="Valid values are greedy_search and modified_beam_search", + ) + + parser.add_argument( + "--max-active-paths", + type=int, + default=4, + help="""Used only when --decoding-method is modified_beam_search. + It specifies number of active paths to keep during decoding. + """, + ) + + parser.add_argument( + "--lm", + type=str, + default="", + help="""Used only when --decoding-method is modified_beam_search. + path of language model. + """, + ) + + parser.add_argument( + "--lm-scale", + type=float, + default=0.1, + help="""Used only when --decoding-method is modified_beam_search. + scale of language model. + """, + ) + + parser.add_argument( + "--lodr-fst", + metavar="file", + type=str, + default="", + help="Path to LODR FST model. Used only when --lm is given.", + ) + + parser.add_argument( + "--lodr-scale", + metavar="lodr_scale", + type=float, + default=-0.1, + help="LODR scale for rescoring.Used only when --lodr_fst is given.", + ) + + parser.add_argument( + "--provider", + type=str, + default="cpu", + help="Valid values: cpu, cuda, coreml", + ) + + parser.add_argument( + "--hotwords-file", + type=str, + default="", + help=""" + The file containing hotwords, one words/phrases per line, like + HELLO WORLD + 你好世界 + """, + ) + + parser.add_argument( + "--hotwords-score", + type=float, + default=1.5, + help=""" + The hotword score of each token for biasing word/phrase. Used only if + --hotwords-file is given. + """, + ) + + parser.add_argument( + "--modeling-unit", + type=str, + default="", + help=""" + The modeling unit of the model, valid values are cjkchar, bpe, cjkchar+bpe. + Used only when hotwords-file is given. + """, + ) + + parser.add_argument( + "--bpe-vocab", + type=str, + default="", + help=""" + The path to the bpe vocabulary, the bpe vocabulary is generated by + sentencepiece, you can also export the bpe vocabulary through a bpe model + by `scripts/export_bpe_vocab.py`. Used only when hotwords-file is given + and modeling-unit is bpe or cjkchar+bpe. + """, + ) + + parser.add_argument( + "--blank-penalty", + type=float, + default=0.0, + help=""" + The penalty applied on blank symbol during decoding. + Note: It is a positive value that would be applied to logits like + this `logits[:, 0] -= blank_penalty` (suppose logits.shape is + [batch_size, vocab] and blank id is 0). + """, + ) + + parser.add_argument( + "sound_files", + type=str, + nargs="+", + help="The input sound file(s) to decode. Each file must be of WAVE" + "format with a single channel, and each sample has 16-bit, " + "i.e., int16_t. " + "The sample rate of the file can be arbitrary and does not need to " + "be 16 kHz", + ) + + return parser.parse_args() + + +def assert_file_exists(filename: str): + assert Path(filename).is_file(), ( + f"{filename} does not exist!\n" + "Please refer to " + "https://k2-fsa.github.io/sherpa/onnx/pretrained_models/index.html to download it" + ) + + +def read_wave(wave_filename: str) -> Tuple[np.ndarray, int]: + """ + Args: + wave_filename: + Path to a wave file. It should be single channel and each sample should + be 16-bit. Its sample rate does not need to be 16kHz. + Returns: + Return a tuple containing: + - A 1-D array of dtype np.float32 containing the samples, which are + normalized to the range [-1, 1]. + - sample rate of the wave file + """ + + with wave.open(wave_filename) as f: + assert f.getnchannels() == 1, f.getnchannels() + assert f.getsampwidth() == 2, f.getsampwidth() # it is in bytes + num_samples = f.getnframes() + samples = f.readframes(num_samples) + samples_int16 = np.frombuffer(samples, dtype=np.int16) + samples_float32 = samples_int16.astype(np.float32) + + samples_float32 = samples_float32 / 32768 + return samples_float32, f.getframerate() + + +def main(): + args = get_args() + assert_file_exists(args.tokens) + + if args.encoder: + assert_file_exists(args.encoder) + assert_file_exists(args.decoder) + assert_file_exists(args.joiner) + + assert not args.paraformer_encoder, args.paraformer_encoder + assert not args.paraformer_decoder, args.paraformer_decoder + + recognizer = sherpa_onnx.OnlineRecognizer.from_transducer( + tokens=args.tokens, + encoder=args.encoder, + decoder=args.decoder, + joiner=args.joiner, + num_threads=args.num_threads, + provider=args.provider, + sample_rate=16000, + feature_dim=80, + decoding_method=args.decoding_method, + max_active_paths=args.max_active_paths, + lm=args.lm, + lm_scale=args.lm_scale, + lodr_fst=args.lodr_fst, + lodr_scale=args.lodr_scale, + hotwords_file=args.hotwords_file, + hotwords_score=args.hotwords_score, + modeling_unit=args.modeling_unit, + bpe_vocab=args.bpe_vocab, + blank_penalty=args.blank_penalty, + ) + elif args.zipformer2_ctc: + recognizer = sherpa_onnx.OnlineRecognizer.from_zipformer2_ctc( + tokens=args.tokens, + model=args.zipformer2_ctc, + num_threads=args.num_threads, + provider=args.provider, + sample_rate=16000, + feature_dim=80, + decoding_method="greedy_search", + ) + elif args.paraformer_encoder: + recognizer = sherpa_onnx.OnlineRecognizer.from_paraformer( + tokens=args.tokens, + encoder=args.paraformer_encoder, + decoder=args.paraformer_decoder, + num_threads=args.num_threads, + provider=args.provider, + sample_rate=16000, + feature_dim=80, + decoding_method="greedy_search", + ) + elif args.wenet_ctc: + recognizer = sherpa_onnx.OnlineRecognizer.from_wenet_ctc( + tokens=args.tokens, + model=args.wenet_ctc, + chunk_size=args.wenet_ctc_chunk_size, + num_left_chunks=args.wenet_ctc_num_left_chunks, + num_threads=args.num_threads, + provider=args.provider, + sample_rate=16000, + feature_dim=80, + decoding_method="greedy_search", + ) + else: + raise ValueError("Please provide a model") + + print("Started!") + start_time = time.time() + + streams = [] + total_duration = 0 + for wave_filename in args.sound_files: + assert_file_exists(wave_filename) + samples, sample_rate = read_wave(wave_filename) + duration = len(samples) / sample_rate + total_duration += duration + + s = recognizer.create_stream() + + s.accept_waveform(sample_rate, samples) + + tail_paddings = np.zeros(int(0.66 * sample_rate), dtype=np.float32) + s.accept_waveform(sample_rate, tail_paddings) + + s.input_finished() + + streams.append(s) + + while True: + ready_list = [] + for s in streams: + if recognizer.is_ready(s): + ready_list.append(s) + if len(ready_list) == 0: + break + recognizer.decode_streams(ready_list) + results = [recognizer.get_result(s) for s in streams] + end_time = time.time() + print("Done!") + + for wave_filename, result in zip(args.sound_files, results): + print(f"{wave_filename}\n{result}") + print("-" * 10) + + elapsed_seconds = end_time - start_time + rtf = elapsed_seconds / total_duration + print(f"num_threads: {args.num_threads}") + print(f"decoding_method: {args.decoding_method}") + print(f"Wave duration: {total_duration:.3f} s") + print(f"Elapsed time: {elapsed_seconds:.3f} s") + print( + f"Real time factor (RTF): {elapsed_seconds:.3f}/{total_duration:.3f} = {rtf:.3f}" + ) + + +if __name__ == "__main__": + main() diff --git a/audio_processing/sherpa-onnx/sherpa-onnx.py b/audio_processing/sherpa-onnx/sherpa-onnx.py new file mode 100644 index 000000000..9d6b5ac29 --- /dev/null +++ b/audio_processing/sherpa-onnx/sherpa-onnx.py @@ -0,0 +1,325 @@ +import sys +import os +import time +import platform +import numpy as np +import queue + +# import original modules +sys.path.append("../../util") +from arg_utils import get_base_parser, get_savepath, update_parser # noqa +from model_utils import check_and_download_models, check_and_download_file # noqa +from microphone_utils import start_microphone_input # noqa + +# logger +from logging import getLogger # noqa: E402 +logger = getLogger(__name__) + + + +# ====================== +# Parameters +# ====================== +WAV_PATH = "demo.wav" +SAVE_TEXT_PATH = "output.txt" + +# ====================== +# Arguemnt Parser Config +# ====================== +parser = get_base_parser("Sherpa-onnx", WAV_PATH, SAVE_TEXT_PATH, input_ftype="audio") +# ... (引数定義は後で追加) + +# ====================== +# Models +# ====================== +from collections import namedtuple + +# モデルの次元情報など、共通の構造が必要な場合はnamedtupleを定義 +SherpaOnnxModelDims = namedtuple( + "SherpaOnnxModelDims", + [ + "sample_rate", + "feature_dim", + ], +) + +# sherpa-onnxモデルの識別名定数 +MODEL_ZIPFORMER_JA_REAZONSPEECH = "zipformer-ja-reazonspeech" +MODEL_ZIPFORMER_MULTI_LANG_STREAMING = "zipformer-multi-lang-streaming" +MODEL_PARAFORMER_BILINGUAL_STREAMING = "paraformer-bilingual-streaming" +# 他のモデルタイプをここに追加 + +# モデルの詳細辞書 +MODEL_CONFIGS = { + MODEL_ZIPFORMER_JA_REAZONSPEECH: { + "model_type": "transducer", + "remote_base_url": "https://github.com/k2-fsa/sherpa-onnx/releases/download/asr-models/", + "model_dir_name": "sherpa-onnx-zipformer-ja-reazonspeech-2024-08-01", + "files": { + "tokens": "tokens.txt", + "encoder": "encoder-epoch-99-avg-1.onnx", + "decoder": "decoder-epoch-99-avg-1.onnx", + "joiner": "joiner-epoch-99-avg-1.onnx", + }, + "dims": SherpaOnnxModelDims(sample_rate=16000, feature_dim=80), + "languages": ["ja"], + "description": "Japanese offline Zipformer-Transducer model trained on ReazonSpeech.", + "is_streaming": False, + }, + MODEL_ZIPFORMER_MULTI_LANG_STREAMING: { + "model_type": "transducer", + "remote_base_url": "https://github.com/k2-fsa/sherpa-onnx/releases/download/asr-models/", + "model_dir_name": "sherpa-onnx-streaming-zipformer-ar_en_id_ja_ru_th_vi_zh-2025-02-10", + "files": { + "tokens": "tokens.txt", + "encoder": "encoder-epoch-75-avg-11-chunk-16-left-128.int8.onnx", + "decoder": "decoder-epoch-75-avg-11-chunk-16-left-128.onnx", + "joiner": "joiner-epoch-75-avg-11-chunk-16-left-128.int8.onnx", + }, + "dims": SherpaOnnxModelDims(sample_rate=16000, feature_dim=80), + "languages": ["ar", "en", "id", "ja", "ru", "th", "vi", "zh"], + "description": "Multi-lingual streaming Zipformer-Transducer model.", + "is_streaming": True, + "chunk_size": 16, + "num_left_chunks": 128, + }, + MODEL_PARAFORMER_BILINGUAL_STREAMING: { + "model_type": "paraformer", + "remote_base_url": "https://github.com/k2-fsa/sherpa-onnx/releases/download/asr-models/", + "model_dir_name": "sherpa-onnx-streaming-paraformer-bilingual-zh-en", + "files": { + "tokens": "tokens.txt", + "paraformer_encoder": "encoder.int8.onnx", + "paraformer_decoder": "decoder.int8.onnx", + }, + "dims": SherpaOnnxModelDims(sample_rate=16000, feature_dim=80), + "languages": ["zh", "en"], + "description": "Bilingual Chinese+English streaming Paraformer model.", + "is_streaming": True, + }, +} + +parser.add_argument( + "-m", + "--model_type", + default=MODEL_ZIPFORMER_JA_REAZONSPEECH, + choices=MODEL_CONFIGS.keys(), + help="sherpa-onnx model type", +) +parser.add_argument( + "-V", + action="store_true", + help="use microphone input", +) +parser.add_argument( + "--num-threads", + type=int, + default=1, + help="Number of threads for neural network computation", +) +parser.add_argument( + "--decoding-method", + type=str, + default="greedy_search", + choices=("greedy_search", "modified_beam_search"), + help="Valid values are greedy_search and modified_beam_search", +) +parser.add_argument( + "--provider", + type=str, + default="cpu", + choices=("cpu", "cuda", "coreml"), + help="Valid values: cpu, cuda, coreml", +) +parser.add_argument( + "--max-active-paths", + type=int, + default=4, + help="Used only when --decoding-method is modified_beam_search. It specifies number of active paths to keep during decoding.", +) +parser.add_argument( + "--hotwords-file", + type=str, + default="", + help="The file containing hotwords, one words/phrases per line, like HELLO WORLD 你好世界", +) +parser.add_argument( + "--hotwords-score", + type=float, + default=1.5, + help="The hotword score of each token for biasing word/phrase. Used only if --hotwords-file is given.", +) +parser.add_argument( + "--modeling-unit", + type=str, + default="", + help="The modeling unit of the model, valid values are cjkchar, bpe, cjkchar+bpe. Used only when hotwords-file is given.", +) +parser.add_argument( + "--bpe-vocab", + type=str, + default="", + help="The path to the bpe vocabulary. Used only when hotwords-file is given and modeling-unit is bpe or cjkchar+bpe.", +) +parser.add_argument( + "--blank-penalty", + type=float, + default=0.0, + help="The penalty applied on blank symbol during decoding.", +) + +args = update_parser(parser) + +from ailia_audio_utils import load_audio + +def recognize_from_audio(recognizer): + model_config = MODEL_CONFIGS[args.model_type] + is_streaming = model_config["is_streaming"] + + for audio_path in args.input: + logger.info(audio_path) + + wav, sample_rate = load_audio(audio_path, for_speech_recognition=True) + + # inference + logger.info("Start inference...") + if args.benchmark: + logger.info("BENCHMARK mode") + start_time = time.time() + + if is_streaming: + stream = recognizer.create_stream() + chunk_size = int(0.1 * sample_rate) # 100ms + for i in range(0, len(wav), chunk_size): + chunk = wav[i : i + chunk_size] + stream.accept_waveform(sample_rate, chunk) + while recognizer.is_ready(stream): + recognizer.decode_streams([stream]) + result = recognizer.get_result(stream) + if result: + logger.info(f"Partial result: {result}") + + stream.input_finished() + while recognizer.is_ready(stream): + recognizer.decode_streams([stream]) + result = recognizer.get_result(stream) + logger.info(f"Final result: {result}") + else: + stream = recognizer.create_stream() + stream.accept_waveform(sample_rate, wav) + recognizer.decode_streams([stream]) + result = stream.result.text + logger.info(f"Final result: {result}") + + if args.benchmark: + end_time = time.time() + estimation_time = (end_time - start_time) * 1000 + logger.info(f"\ttotal processing time {estimation_time:.3f} ms") + + logger.info("Script finished successfully.") + +def recognize_from_microphone(recognizer, mic_info): + p = mic_info["p"] + que = mic_info["que"] + pause = mic_info["pause"] + fin = mic_info["fin"] + + model_config = MODEL_CONFIGS[args.model_type] + sample_rate = model_config["dims"].sample_rate + + stream = recognizer.create_stream() + + try: + logger.info("Please speak something") + while p.is_alive(): + try: + wav = que.get(timeout=0.1) + stream.accept_waveform(sample_rate, wav) + while recognizer.is_ready(stream): + recognizer.decode_streams([stream]) + result = recognizer.get_result(stream) + if result: + logger.info(f"Partial result: {result}") + except queue.Empty: + continue + except KeyboardInterrupt: + pass + finally: + stream.input_finished() + while recognizer.is_ready(stream): + recognizer.decode_streams([stream]) + result = recognizer.get_result(stream) + logger.info(f"Final result: {result}") + fin.set() + + logger.info("script finished successfully.") + +def main(): + model_config = MODEL_CONFIGS[args.model_type] + model_dir_name = model_config["model_dir_name"] + remote_path = model_config["remote_base_url"] + + # モデルのダウンロード + for file_name in model_config["files"].values(): + check_and_download_file(os.path.join(model_dir_name, file_name), remote_path) + + mic_info = None + if args.V: + # in microphone input mode, start thread before load the model. + mic_info = start_microphone_input(model_config["dims"].sample_rate, sc=False, speaker=False) + + pf = platform.system() + if pf == "Darwin": + logger.info( + "This model not optimized for macOS GPU currently." + " So we will use BLAS (env_id = 1)." + ) + args.env_id = 1 + else: + logger.info( + "This model uses a lot of memory." + " If an error occurs during execution, specify -e 0 and execute on the CPU." + ) + + # initialize + import ailia + + model_config = MODEL_CONFIGS[args.model_type] + model_dir_name = model_config["model_dir_name"] + model_type = model_config["model_type"] + files = model_config["files"] + + # ailia.Netの初期化 + enc_net = ailia.Net( + os.path.join(model_dir_name, files["encoder"] + ".prototxt"), # .prototxtが必要 + os.path.join(model_dir_name, files["encoder"]), + env_id=args.env_id, + ) + dec_net = ailia.Net( + os.path.join(model_dir_name, files["decoder"] + ".prototxt"), + os.path.join(model_dir_name, files["decoder"]), + env_id=args.env_id, + ) + joi_net = ailia.Net( + os.path.join(model_dir_name, files["joiner"] + ".prototxt"), + os.path.join(model_dir_name, files["joiner"]), + env_id=args.env_id, + ) + + if args.V: + # microphone input mode + recognize_from_microphone(enc_net, dec_net, joi_net, mic_info) + else: + recognize_from_audio(enc_net, dec_net, joi_net) + + if args.profile: + if args.onnx: + prof_file = dec_net.end_profiling() + print(prof_file) + else: + print(dec_net.get_summary()) + + +if __name__ == "__main__": + main() + From 45704fd28a8235c1fc8fb0336afa1db6ca268959 Mon Sep 17 00:00:00 2001 From: ailia_watanabe Date: Tue, 23 Dec 2025 13:42:34 +0900 Subject: [PATCH 02/15] =?UTF-8?q?sherpa-onnx=E3=83=A9=E3=82=A4=E3=83=96?= =?UTF-8?q?=E3=83=A9=E3=83=AA=E3=82=92=E4=BD=BF=E7=94=A8=E3=81=97=E3=81=9F?= =?UTF-8?q?=E3=83=AC=E3=82=B3=E3=82=B0=E3=83=8A=E3=82=A4=E3=82=B6=E3=83=BC?= =?UTF-8?q?=E3=81=AB=E3=82=88=E3=82=8B=E6=8E=A8=E8=AB=96=E9=96=A2=E6=95=B0?= =?UTF-8?q?=E3=81=AE=E4=BD=9C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- audio_processing/sherpa-onnx/sherpa-onnx.py | 376 +++----------------- 1 file changed, 57 insertions(+), 319 deletions(-) diff --git a/audio_processing/sherpa-onnx/sherpa-onnx.py b/audio_processing/sherpa-onnx/sherpa-onnx.py index 9d6b5ac29..8ce370db2 100644 --- a/audio_processing/sherpa-onnx/sherpa-onnx.py +++ b/audio_processing/sherpa-onnx/sherpa-onnx.py @@ -1,325 +1,63 @@ -import sys -import os -import time -import platform -import numpy as np -import queue - +import ailia # import original modules -sys.path.append("../../util") -from arg_utils import get_base_parser, get_savepath, update_parser # noqa -from model_utils import check_and_download_models, check_and_download_file # noqa -from microphone_utils import start_microphone_input # noqa - -# logger -from logging import getLogger # noqa: E402 -logger = getLogger(__name__) - - - -# ====================== -# Parameters -# ====================== -WAV_PATH = "demo.wav" -SAVE_TEXT_PATH = "output.txt" - -# ====================== -# Arguemnt Parser Config -# ====================== -parser = get_base_parser("Sherpa-onnx", WAV_PATH, SAVE_TEXT_PATH, input_ftype="audio") -# ... (引数定義は後で追加) - -# ====================== -# Models -# ====================== -from collections import namedtuple - -# モデルの次元情報など、共通の構造が必要な場合はnamedtupleを定義 -SherpaOnnxModelDims = namedtuple( - "SherpaOnnxModelDims", - [ - "sample_rate", - "feature_dim", - ], -) - -# sherpa-onnxモデルの識別名定数 -MODEL_ZIPFORMER_JA_REAZONSPEECH = "zipformer-ja-reazonspeech" -MODEL_ZIPFORMER_MULTI_LANG_STREAMING = "zipformer-multi-lang-streaming" -MODEL_PARAFORMER_BILINGUAL_STREAMING = "paraformer-bilingual-streaming" -# 他のモデルタイプをここに追加 - -# モデルの詳細辞書 -MODEL_CONFIGS = { - MODEL_ZIPFORMER_JA_REAZONSPEECH: { - "model_type": "transducer", - "remote_base_url": "https://github.com/k2-fsa/sherpa-onnx/releases/download/asr-models/", - "model_dir_name": "sherpa-onnx-zipformer-ja-reazonspeech-2024-08-01", - "files": { - "tokens": "tokens.txt", - "encoder": "encoder-epoch-99-avg-1.onnx", - "decoder": "decoder-epoch-99-avg-1.onnx", - "joiner": "joiner-epoch-99-avg-1.onnx", - }, - "dims": SherpaOnnxModelDims(sample_rate=16000, feature_dim=80), - "languages": ["ja"], - "description": "Japanese offline Zipformer-Transducer model trained on ReazonSpeech.", - "is_streaming": False, - }, - MODEL_ZIPFORMER_MULTI_LANG_STREAMING: { - "model_type": "transducer", - "remote_base_url": "https://github.com/k2-fsa/sherpa-onnx/releases/download/asr-models/", - "model_dir_name": "sherpa-onnx-streaming-zipformer-ar_en_id_ja_ru_th_vi_zh-2025-02-10", - "files": { - "tokens": "tokens.txt", - "encoder": "encoder-epoch-75-avg-11-chunk-16-left-128.int8.onnx", - "decoder": "decoder-epoch-75-avg-11-chunk-16-left-128.onnx", - "joiner": "joiner-epoch-75-avg-11-chunk-16-left-128.int8.onnx", - }, - "dims": SherpaOnnxModelDims(sample_rate=16000, feature_dim=80), - "languages": ["ar", "en", "id", "ja", "ru", "th", "vi", "zh"], - "description": "Multi-lingual streaming Zipformer-Transducer model.", - "is_streaming": True, - "chunk_size": 16, - "num_left_chunks": 128, - }, - MODEL_PARAFORMER_BILINGUAL_STREAMING: { - "model_type": "paraformer", - "remote_base_url": "https://github.com/k2-fsa/sherpa-onnx/releases/download/asr-models/", - "model_dir_name": "sherpa-onnx-streaming-paraformer-bilingual-zh-en", - "files": { - "tokens": "tokens.txt", - "paraformer_encoder": "encoder.int8.onnx", - "paraformer_decoder": "decoder.int8.onnx", - }, - "dims": SherpaOnnxModelDims(sample_rate=16000, feature_dim=80), - "languages": ["zh", "en"], - "description": "Bilingual Chinese+English streaming Paraformer model.", - "is_streaming": True, - }, -} - -parser.add_argument( - "-m", - "--model_type", - default=MODEL_ZIPFORMER_JA_REAZONSPEECH, - choices=MODEL_CONFIGS.keys(), - help="sherpa-onnx model type", -) -parser.add_argument( - "-V", - action="store_true", - help="use microphone input", -) -parser.add_argument( - "--num-threads", - type=int, - default=1, - help="Number of threads for neural network computation", -) -parser.add_argument( - "--decoding-method", - type=str, - default="greedy_search", - choices=("greedy_search", "modified_beam_search"), - help="Valid values are greedy_search and modified_beam_search", -) -parser.add_argument( - "--provider", - type=str, - default="cpu", - choices=("cpu", "cuda", "coreml"), - help="Valid values: cpu, cuda, coreml", -) -parser.add_argument( - "--max-active-paths", - type=int, - default=4, - help="Used only when --decoding-method is modified_beam_search. It specifies number of active paths to keep during decoding.", -) -parser.add_argument( - "--hotwords-file", - type=str, - default="", - help="The file containing hotwords, one words/phrases per line, like HELLO WORLD 你好世界", -) -parser.add_argument( - "--hotwords-score", - type=float, - default=1.5, - help="The hotword score of each token for biasing word/phrase. Used only if --hotwords-file is given.", -) -parser.add_argument( - "--modeling-unit", - type=str, - default="", - help="The modeling unit of the model, valid values are cjkchar, bpe, cjkchar+bpe. Used only when hotwords-file is given.", -) -parser.add_argument( - "--bpe-vocab", - type=str, - default="", - help="The path to the bpe vocabulary. Used only when hotwords-file is given and modeling-unit is bpe or cjkchar+bpe.", -) -parser.add_argument( - "--blank-penalty", - type=float, - default=0.0, - help="The penalty applied on blank symbol during decoding.", -) - -args = update_parser(parser) - -from ailia_audio_utils import load_audio - -def recognize_from_audio(recognizer): - model_config = MODEL_CONFIGS[args.model_type] - is_streaming = model_config["is_streaming"] - - for audio_path in args.input: - logger.info(audio_path) - - wav, sample_rate = load_audio(audio_path, for_speech_recognition=True) - - # inference - logger.info("Start inference...") - if args.benchmark: - logger.info("BENCHMARK mode") - start_time = time.time() - - if is_streaming: - stream = recognizer.create_stream() - chunk_size = int(0.1 * sample_rate) # 100ms - for i in range(0, len(wav), chunk_size): - chunk = wav[i : i + chunk_size] - stream.accept_waveform(sample_rate, chunk) - while recognizer.is_ready(stream): - recognizer.decode_streams([stream]) - result = recognizer.get_result(stream) - if result: - logger.info(f"Partial result: {result}") - - stream.input_finished() - while recognizer.is_ready(stream): - recognizer.decode_streams([stream]) - result = recognizer.get_result(stream) - logger.info(f"Final result: {result}") - else: - stream = recognizer.create_stream() - stream.accept_waveform(sample_rate, wav) - recognizer.decode_streams([stream]) - result = stream.result.text - logger.info(f"Final result: {result}") - - if args.benchmark: - end_time = time.time() - estimation_time = (end_time - start_time) * 1000 - logger.info(f"\ttotal processing time {estimation_time:.3f} ms") - - logger.info("Script finished successfully.") - -def recognize_from_microphone(recognizer, mic_info): - p = mic_info["p"] - que = mic_info["que"] - pause = mic_info["pause"] - fin = mic_info["fin"] - - model_config = MODEL_CONFIGS[args.model_type] - sample_rate = model_config["dims"].sample_rate - - stream = recognizer.create_stream() - - try: - logger.info("Please speak something") - while p.is_alive(): - try: - wav = que.get(timeout=0.1) - stream.accept_waveform(sample_rate, wav) - while recognizer.is_ready(stream): - recognizer.decode_streams([stream]) - result = recognizer.get_result(stream) - if result: - logger.info(f"Partial result: {result}") - except queue.Empty: - continue - except KeyboardInterrupt: - pass - finally: - stream.input_finished() - while recognizer.is_ready(stream): - recognizer.decode_streams([stream]) - result = recognizer.get_result(stream) - logger.info(f"Final result: {result}") - fin.set() - - logger.info("script finished successfully.") - -def main(): - model_config = MODEL_CONFIGS[args.model_type] - model_dir_name = model_config["model_dir_name"] - remote_path = model_config["remote_base_url"] - - # モデルのダウンロード - for file_name in model_config["files"].values(): - check_and_download_file(os.path.join(model_dir_name, file_name), remote_path) - - mic_info = None - if args.V: - # in microphone input mode, start thread before load the model. - mic_info = start_microphone_input(model_config["dims"].sample_rate, sc=False, speaker=False) - - pf = platform.system() - if pf == "Darwin": - logger.info( - "This model not optimized for macOS GPU currently." - " So we will use BLAS (env_id = 1)." - ) - args.env_id = 1 - else: - logger.info( - "This model uses a lot of memory." - " If an error occurs during execution, specify -e 0 and execute on the CPU." - ) - - # initialize - import ailia - - model_config = MODEL_CONFIGS[args.model_type] - model_dir_name = model_config["model_dir_name"] - model_type = model_config["model_type"] - files = model_config["files"] - - # ailia.Netの初期化 - enc_net = ailia.Net( - os.path.join(model_dir_name, files["encoder"] + ".prototxt"), # .prototxtが必要 - os.path.join(model_dir_name, files["encoder"]), - env_id=args.env_id, +sys.path.append('../../util') +from arg_utils import get_base_parser, update_parser # noqa: E402 +from model_utils import check_and_download_models # noqa: E402 + +WEIGHT_ENC_PATH = "encoder-epoch-75-avg-11-chunk-16-left-128.int8.onnx" +WEIGHT_DEC_PATH = "decoder-epoch-75-avg-11-chunk-16-left-128.onnx" +JOINER_PATH = "joiner-epoch-75-avg-11-chunk-16-left-128.int8.onnx" +TOKEN_PATH = "tokens.txt" +USE_AILIANET = False + +if args.ailia_audio: + from ailia_audio_utils import ( + CHUNK_LENGTH, + HOP_LENGTH, + N_FRAMES, + N_SAMPLES, + SAMPLE_RATE, + load_audio, + log_mel_spectrogram, + pad_or_trim, ) - dec_net = ailia.Net( - os.path.join(model_dir_name, files["decoder"] + ".prototxt"), - os.path.join(model_dir_name, files["decoder"]), - env_id=args.env_id, - ) - joi_net = ailia.Net( - os.path.join(model_dir_name, files["joiner"] + ".prototxt"), - os.path.join(model_dir_name, files["joiner"]), - env_id=args.env_id, +else: + from audio_utils import ( + CHUNK_LENGTH, + HOP_LENGTH, + N_FRAMES, + N_SAMPLES, + SAMPLE_RATE, + load_audio, + log_mel_spectrogram, + pad_or_trim, ) - if args.V: - # microphone input mode - recognize_from_microphone(enc_net, dec_net, joi_net, mic_info) +def recognize_from_wave(): + if USE_AILIANET: + enc_net = ailia.Net() else: - recognize_from_audio(enc_net, dec_net, joi_net) - - if args.profile: - if args.onnx: - prof_file = dec_net.end_profiling() - print(prof_file) - else: - print(dec_net.get_summary()) - - -if __name__ == "__main__": - main() + import sherpa_onnx + recognizer = sherpa_onnx.OnlineRecognizer.from_transducer( + tokens=TOKEN_PATH, + encoder=WEIGHT_ENC_PATH, + decoder=WEIGHT_DEC_PATH, + joiner=JOINER_PATH, + num_threads=1, + provider="cpu", # "gpu", + sample_rate=SAMPLE_RATE, + feature_dim=80, + decoding_method="greedy_search", # "modified_beam_search" + max_active_paths=4, + lm="", + lm_scale=0.1, + lodr_fst="", + lodr_scale=0.1, + hotwords_file="", + hotwords_score=1.5, + modeling_unit="", + bpe_vocab="", + blank_penalty=0.0, + ) + From 40174ef48b57899caf448997d54e492929be6f59 Mon Sep 17 00:00:00 2001 From: ailia_watanabe Date: Thu, 25 Dec 2025 13:53:31 +0900 Subject: [PATCH 03/15] =?UTF-8?q?feature=20onnx-runtime=E3=81=AB=E3=82=88?= =?UTF-8?q?=E3=82=8B=E6=8E=A8=E8=AB=96=E3=81=AE=E5=AE=9F=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- audio_processing/sherpa-onnx/sherpa-onnx.py | 238 +++++++++++++++++--- 1 file changed, 209 insertions(+), 29 deletions(-) diff --git a/audio_processing/sherpa-onnx/sherpa-onnx.py b/audio_processing/sherpa-onnx/sherpa-onnx.py index 8ce370db2..c57d6e0f3 100644 --- a/audio_processing/sherpa-onnx/sherpa-onnx.py +++ b/audio_processing/sherpa-onnx/sherpa-onnx.py @@ -1,14 +1,39 @@ import ailia -# import original modules +import time +from logging import getLogger +import numpy as np +from typing import Tuple +import wave +import librosa +import sys sys.path.append('../../util') from arg_utils import get_base_parser, update_parser # noqa: E402 from model_utils import check_and_download_models # noqa: E402 +logger = getLogger(__name__) + +# ====================== +# Parameters +# ====================== + +WAV_PATH = "ja.wav" +SAVE_TEXT_PATH = "output.txt" + WEIGHT_ENC_PATH = "encoder-epoch-75-avg-11-chunk-16-left-128.int8.onnx" WEIGHT_DEC_PATH = "decoder-epoch-75-avg-11-chunk-16-left-128.onnx" -JOINER_PATH = "joiner-epoch-75-avg-11-chunk-16-left-128.int8.onnx" +WEIGHT_JOI_PATH = "joiner-epoch-75-avg-11-chunk-16-left-128.int8.onnx" TOKEN_PATH = "tokens.txt" -USE_AILIANET = False + +# ====================== +# Arguemnt Parser Config +# ====================== +parser = get_base_parser("sherpa-onnx", WAV_PATH, SAVE_TEXT_PATH, input_ftype="audio") +parser.add_argument("--memory_mode", default=-1, type=int, help="memory mode") +parser.add_argument("--ailia_audio", action="store_true", help="use ailia audio.") +parser.add_argument("--disable_ailia_tokenizer", action="store_true", help="disable ailia tokenizer.") +parser.add_argument("--onnx", action="store_true", help="execute onnxruntime version.") + +args = update_parser(parser) if args.ailia_audio: from ailia_audio_utils import ( @@ -33,31 +58,186 @@ pad_or_trim, ) -def recognize_from_wave(): - if USE_AILIANET: - enc_net = ailia.Net() - else: - import sherpa_onnx - recognizer = sherpa_onnx.OnlineRecognizer.from_transducer( - tokens=TOKEN_PATH, - encoder=WEIGHT_ENC_PATH, - decoder=WEIGHT_DEC_PATH, - joiner=JOINER_PATH, - num_threads=1, - provider="cpu", # "gpu", - sample_rate=SAMPLE_RATE, - feature_dim=80, - decoding_method="greedy_search", # "modified_beam_search" - max_active_paths=4, - lm="", - lm_scale=0.1, - lodr_fst="", - lodr_scale=0.1, - hotwords_file="", - hotwords_score=1.5, - modeling_unit="", - bpe_vocab="", - blank_penalty=0.0, - ) +if not args.disable_ailia_tokenizer: + from ailia_tokenizer import get_tokenizer +else: + from tokenizer import get_tokenizer + +def read_wave(wave_filename: str) -> Tuple[np.ndarray, int]: + with wave.open(wave_filename) as f: + assert f.getnchannels() == 1, f.getnchannels() + assert f.getsampwidth() == 2, f.getsampwidth() # it is in bytes + num_samples = f.getnframes() + samples = f.readframes(num_samples) + samples_int16 = np.frombuffer(samples, dtype=np.int16) + samples_float32 = samples_int16.astype(np.float32) + + samples_float32 = samples_float32 / 32768 + return samples_float32, f.getframerate() +def init_states(enc_net): + input_info = enc_net.get_inputs() + states = [] + for i in input_info[1:]: + shape = [1 if (s is None or isinstance(s, str)) else s for s in i.shape] + dtype_str = getattr(i, "type", "") or "" + dtype = np.int64 if "int64" in dtype_str else np.float32 + states.append(np.zeros(shape, dtype=dtype)) + return states + + +def build_enc_inputs(enc_net, x_input, current_states): + input_info = enc_net.get_inputs() + inputs_dict = {input_info[0].name: x_input.astype(np.float32)} + for i, info in enumerate(input_info[1:]): + inputs_dict[info.name] = current_states[i] + + return inputs_dict + +def get_features(samples, n_mels, sr=16000): + """ + 音声波形(samples)からLog-Melスペクトログラム(80次元)をすべて抽出する + """ + # 1. メルスペクトログラムの抽出 + # Zipformer設定: 25ms窓(400), 10ms歩進(160) + S = librosa.feature.melspectrogram( + y=samples, + sr=sr, + n_fft=512, + hop_length=160, + win_length=400, + n_mels=n_mels, + center=False # ストリーミングでは未来の音を見ないためFalse + ) + + # 2. 対数(Log)に変換 + log_S = librosa.power_to_db(S, ref=np.max).astype(np.float32) + + # 3. 転置して [時間, 80次元] の形にする + return log_S.T + +def process_full_audio(enc_net, dec_net, joi_net, samples, sr=16000, segment_length=45, offset=32, n_mels=80): + + context_size = 2 # デコーダの文脈サイズ + + # --- STEP 1. 初期準備 --- + features = get_features(samples, n_mels, sr=sr) # (Total_Frames, 80) + + # --- STEP 2: 状態(キャッシュ)の初期化 --- + states = init_states(enc_net) # Encoder の記憶 + hyp = [0] * context_size # デコーダの履歴 + + # 最初の文脈ベクトルを生成 + decoder_input = np.array([hyp], dtype=np.int64) + decoder_out = dec_net.run(None, {dec_net.get_inputs()[0].name: decoder_input})[0] + + num_processed_frames = 0 + final_hyp = [] + + # --- STEP 3: ストリーミング・推論ループ --- + while (len(features) - num_processed_frames) >= segment_length: + x_chunk = features[num_processed_frames : num_processed_frames + segment_length][np.newaxis, :, :] + + # A. Encoder 実行 + enc_inputs = build_enc_inputs(enc_net, x_chunk, states) + outputs = enc_net.run(None, enc_inputs) + + encoder_out = outputs[0] # (1, T', 512) + states = outputs[1:] # 記憶を更新して次のループへ + + # B. Greedy Search + encoder_out = encoder_out[0] # バッチ次元を消す + for t in range(encoder_out.shape[0]): + cur_enc = encoder_out[t:t+1] # 今の瞬間の音ベクトル + + # Joiner で確率計算 + logits = joi_net.run(None, { + joi_net.get_inputs()[0].name: cur_enc, + joi_net.get_inputs()[1].name: decoder_out + })[0] + + y = np.argmax(logits) # 最も可能性の高い文字ID + + # 文字が確定(Blank以外)したらデコーダを更新 + if y != 0: + final_hyp.append(y) + hyp.append(y) + + # 直近 2文字の履歴で新しい文脈ベクトルを作成 + decoder_input = np.array([hyp[-context_size:]], dtype=np.int64) + decoder_out = dec_net.run(None, {dec_net.get_inputs()[0].name: decoder_input})[0] + + # C. 32フレーム進める + num_processed_frames += offset + + return final_hyp # 確定したトークンIDのリスト + +def load_tokens(tokens_path): + """tokens.txt を読み込んで ID から文字を引く辞書を返す""" + token_table = {} + with open(tokens_path, 'r', encoding='utf-8') as f: + for line in f: + parts = line.strip().split() + if len(parts) >= 2: + # 文字 ID の順で並んでいると想定 + token = parts[0] + token_id = int(parts[1]) + token_table[token_id] = token + elif len(parts) == 1: + # 空白文字(ID: 0 等)が単独で存在する場合の考慮 + token_table[int(parts[0])] = " " + return token_table + +def tokens_to_text(token_ids, token_table): + """トークンIDのリストを人間が読める文字列に変換する""" + text = "" + for tid in token_ids: + # 辞書から文字を取得(ID 0 などは無視されることが多い) + token = token_table.get(tid, "") + + # 特殊な空白記号 '▁' を半角スペースに置換 + if token == "▁": + text += " " + else: + text += token + + # 文頭・文末の余計な空白を削除して返す + return text.strip() + + +def main(): + samples, sr = read_wave(WAV_PATH) + + if not args.onnx: + enc_net = ailia.Net(None, WEIGHT_ENC_PATH, env_id=args.env_id, memory_mode=args.memory_mode) + joi_net = ailia.Net(None, WEIGHT_JOI_PATH, env_id=args.env_id, memory_mode=args.memory_mode) + dec_net = ailia.Net(None, WEIGHT_DEC_PATH, env_id=args.env_id, memory_mode=args.memory_mode) + + else: + import onnxruntime + providers = ["CPUExecutionProvider"] + # providers = ["CUDAExecutionProvider"] + enc_net = onnxruntime.InferenceSession(WEIGHT_ENC_PATH, providers=providers) + dec_net = onnxruntime.InferenceSession(WEIGHT_DEC_PATH, providers=providers) + joi_net = onnxruntime.InferenceSession(WEIGHT_JOI_PATH, providers=providers) + + # モデル入力から期待フレーム数を推定する + enc_input_shape = enc_net.get_inputs()[0] + shape = enc_input_shape.shape # 例: [1, 45, 80] または [45, 80] + if len(shape) == 3: + expected_frames = shape[1] + n_mels = shape[2] + elif len(shape) == 2: + expected_frames = shape[0] + n_mels = shape[1] + + token_list = process_full_audio(enc_net, dec_net, joi_net, samples=samples, sr=sr, segment_length=expected_frames, offset=32, n_mels=n_mels) + + token_table = load_tokens(TOKEN_PATH) + result_text = tokens_to_text(token_list, token_table) + print(f"認識結果: {result_text}") + + +if __name__ == "__main__": + main() From 9b3bd2b8ec562e8be0a6b283bfad2e183b2ec39f Mon Sep 17 00:00:00 2001 From: ailia_watanabe Date: Thu, 25 Dec 2025 14:12:38 +0900 Subject: [PATCH 04/15] =?UTF-8?q?fix=20=E6=8A=BD=E5=87=BA=E3=81=97?= =?UTF-8?q?=E3=81=9F=E9=9F=B3=E5=A3=B0=E3=81=AE=E5=AF=BE=E6=95=B0=E3=82=B9?= =?UTF-8?q?=E3=82=B1=E3=83=BC=E3=83=AB=E3=81=B8=E3=81=AE=E5=A4=89=E6=8F=9B?= =?UTF-8?q?=E3=81=AE=E4=BB=95=E6=96=B9=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- audio_processing/sherpa-onnx/sherpa-onnx.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/audio_processing/sherpa-onnx/sherpa-onnx.py b/audio_processing/sherpa-onnx/sherpa-onnx.py index c57d6e0f3..e444e8f84 100644 --- a/audio_processing/sherpa-onnx/sherpa-onnx.py +++ b/audio_processing/sherpa-onnx/sherpa-onnx.py @@ -112,7 +112,7 @@ def get_features(samples, n_mels, sr=16000): ) # 2. 対数(Log)に変換 - log_S = librosa.power_to_db(S, ref=np.max).astype(np.float32) + log_S = np.log(S + 1e-10).astype(np.float32) # 3. 転置して [時間, 80次元] の形にする return log_S.T @@ -174,7 +174,7 @@ def process_full_audio(enc_net, dec_net, joi_net, samples, sr=16000, segment_len return final_hyp # 確定したトークンIDのリスト def load_tokens(tokens_path): - """tokens.txt を読み込んで ID から文字を引く辞書を返す""" + """トークンファイル を読み込んで ID から文字を引く辞書を返す""" token_table = {} with open(tokens_path, 'r', encoding='utf-8') as f: for line in f: From 681ae6b3919eed455fdcc0df0685e42ba45efd39 Mon Sep 17 00:00:00 2001 From: ailia_watanabe Date: Thu, 25 Dec 2025 14:15:19 +0900 Subject: [PATCH 05/15] =?UTF-8?q?refactor=20=E4=B8=8D=E8=A6=81=E3=81=AA?= =?UTF-8?q?=E3=83=A2=E3=82=B8=E3=83=A5=E3=83=BC=E3=83=AB=E3=81=AE=E3=82=A4?= =?UTF-8?q?=E3=83=B3=E3=83=9D=E3=83=BC=E3=83=88=E3=82=92=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- audio_processing/sherpa-onnx/sherpa-onnx.py | 33 ++------------------- 1 file changed, 2 insertions(+), 31 deletions(-) diff --git a/audio_processing/sherpa-onnx/sherpa-onnx.py b/audio_processing/sherpa-onnx/sherpa-onnx.py index e444e8f84..d2af048d1 100644 --- a/audio_processing/sherpa-onnx/sherpa-onnx.py +++ b/audio_processing/sherpa-onnx/sherpa-onnx.py @@ -8,7 +8,6 @@ import sys sys.path.append('../../util') from arg_utils import get_base_parser, update_parser # noqa: E402 -from model_utils import check_and_download_models # noqa: E402 logger = getLogger(__name__) @@ -35,34 +34,6 @@ args = update_parser(parser) -if args.ailia_audio: - from ailia_audio_utils import ( - CHUNK_LENGTH, - HOP_LENGTH, - N_FRAMES, - N_SAMPLES, - SAMPLE_RATE, - load_audio, - log_mel_spectrogram, - pad_or_trim, - ) -else: - from audio_utils import ( - CHUNK_LENGTH, - HOP_LENGTH, - N_FRAMES, - N_SAMPLES, - SAMPLE_RATE, - load_audio, - log_mel_spectrogram, - pad_or_trim, - ) - -if not args.disable_ailia_tokenizer: - from ailia_tokenizer import get_tokenizer -else: - from tokenizer import get_tokenizer - def read_wave(wave_filename: str) -> Tuple[np.ndarray, int]: with wave.open(wave_filename) as f: assert f.getnchannels() == 1, f.getnchannels() @@ -164,11 +135,11 @@ def process_full_audio(enc_net, dec_net, joi_net, samples, sr=16000, segment_len final_hyp.append(y) hyp.append(y) - # 直近 2文字の履歴で新しい文脈ベクトルを作成 + # 直近 context_size文字の履歴で新しい文脈ベクトルを作成 decoder_input = np.array([hyp[-context_size:]], dtype=np.int64) decoder_out = dec_net.run(None, {dec_net.get_inputs()[0].name: decoder_input})[0] - # C. 32フレーム進める + # C. offsetフレーム進める num_processed_frames += offset return final_hyp # 確定したトークンIDのリスト From f889b67bc8534e0d7ac1b7a6e46264e3f3cd14c8 Mon Sep 17 00:00:00 2001 From: ailia_watanabe Date: Thu, 25 Dec 2025 15:34:18 +0900 Subject: [PATCH 06/15] =?UTF-8?q?refactor=20=5Fget=5Finput=5Finfos?= =?UTF-8?q?=E3=81=AB=E3=82=88=E3=82=8Bailia=E3=81=A8ort=E3=81=AE=E5=85=B1?= =?UTF-8?q?=E9=80=9A=E5=85=A5=E5=8A=9B=E5=8F=96=E5=BE=97=E3=82=92=E5=AE=9F?= =?UTF-8?q?=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- audio_processing/sherpa-onnx/sherpa-onnx.py | 156 +++++++++++++++++--- 1 file changed, 133 insertions(+), 23 deletions(-) diff --git a/audio_processing/sherpa-onnx/sherpa-onnx.py b/audio_processing/sherpa-onnx/sherpa-onnx.py index d2af048d1..f91ce1424 100644 --- a/audio_processing/sherpa-onnx/sherpa-onnx.py +++ b/audio_processing/sherpa-onnx/sherpa-onnx.py @@ -45,13 +45,29 @@ def read_wave(wave_filename: str) -> Tuple[np.ndarray, int]: samples_float32 = samples_float32 / 32768 return samples_float32, f.getframerate() + +def _get_input_infos(net): + """ + {"name":..., "shape":..., "type":...} の辞書のリストを返す。 + onnxruntime.InferenceSession と ailia.Net の両方に対応 + """ + infos = [] + if not args.onnx: + for idx in net.get_input_blob_list(): + name = net.get_blob_name(idx) + shape = net.get_blob_shape(idx) + infos.append({"name": name, "shape": tuple(shape), "type": None}) + else: + for inp in net.get_inputs(): + infos.append({"name": inp.name, "shape": tuple(inp.shape), "type": getattr(inp, "type", "")}) + return infos def init_states(enc_net): - input_info = enc_net.get_inputs() + input_info = _get_input_infos(enc_net) states = [] for i in input_info[1:]: - shape = [1 if (s is None or isinstance(s, str)) else s for s in i.shape] - dtype_str = getattr(i, "type", "") or "" + shape = [1 if (s is None or isinstance(s, str)) else s for s in i["shape"]] + dtype_str = i.get("type", "") or "" dtype = np.int64 if "int64" in dtype_str else np.float32 states.append(np.zeros(shape, dtype=dtype)) @@ -59,10 +75,10 @@ def init_states(enc_net): def build_enc_inputs(enc_net, x_input, current_states): - input_info = enc_net.get_inputs() - inputs_dict = {input_info[0].name: x_input.astype(np.float32)} + input_info = _get_input_infos(enc_net) + inputs_dict = {input_info[0]["name"]: x_input.astype(np.float32)} for i, info in enumerate(input_info[1:]): - inputs_dict[info.name] = current_states[i] + inputs_dict[info["name"]] = current_states[i] return inputs_dict @@ -88,7 +104,7 @@ def get_features(samples, n_mels, sr=16000): # 3. 転置して [時間, 80次元] の形にする return log_S.T -def process_full_audio(enc_net, dec_net, joi_net, samples, sr=16000, segment_length=45, offset=32, n_mels=80): +def recognize_from_audio(enc_net, dec_net, joi_net, samples, sr=16000, segment_length=45, offset=32, n_mels=80): context_size = 2 # デコーダの文脈サイズ @@ -101,7 +117,7 @@ def process_full_audio(enc_net, dec_net, joi_net, samples, sr=16000, segment_len # 最初の文脈ベクトルを生成 decoder_input = np.array([hyp], dtype=np.int64) - decoder_out = dec_net.run(None, {dec_net.get_inputs()[0].name: decoder_input})[0] + decoder_out = dec_net.run(None, { _get_input_infos(dec_net)[0]["name"]: decoder_input})[0] num_processed_frames = 0 final_hyp = [] @@ -124,8 +140,8 @@ def process_full_audio(enc_net, dec_net, joi_net, samples, sr=16000, segment_len # Joiner で確率計算 logits = joi_net.run(None, { - joi_net.get_inputs()[0].name: cur_enc, - joi_net.get_inputs()[1].name: decoder_out + _get_input_infos(joi_net)[0]["name"]: cur_enc, + _get_input_infos(joi_net)[1]["name"]: decoder_out })[0] y = np.argmax(logits) # 最も可能性の高い文字ID @@ -137,13 +153,106 @@ def process_full_audio(enc_net, dec_net, joi_net, samples, sr=16000, segment_len # 直近 context_size文字の履歴で新しい文脈ベクトルを作成 decoder_input = np.array([hyp[-context_size:]], dtype=np.int64) - decoder_out = dec_net.run(None, {dec_net.get_inputs()[0].name: decoder_input})[0] + decoder_out = dec_net.run(None, { _get_input_infos(dec_net)[0]["name"]: decoder_input})[0] # C. offsetフレーム進める num_processed_frames += offset return final_hyp # 確定したトークンIDのリスト +class RealtimeEstimator: + def __init__(self, enc_net, dec_net, joi_net, token_table, sr=16000, segment_length=45, offset=32, n_mels=80): + self.enc_net = enc_net + self.dec_net = dec_net + self.joi_net = joi_net + self.token_table = token_table + + # 内部状態の初期化 + self.states = init_states(enc_net) + self.hyp = [0, 0] # context_size=2 を想定 + self.decoder_out = self._init_decoder() + + # サンプル蓄積用バッファ + self.sample_buffer = np.array([], dtype=np.float32) + + # 定数 (16kHz想定) + self.OFFSET_SAMPLES = int(offset * sr *0.01) # 10ms歩進 + self.SEGMENT_SAMPLES = int(segment_length * sr *0.01) # segment_lengthフレーム分 + + def _init_decoder(self): + """初期文脈ベクトルの生成""" + decoder_input = np.array([self.hyp], dtype=np.int64) + return self.dec_net.run(None, {self.dec_net.get_inputs()[0].name: decoder_input})[0] + + def decode_chunk(self): + """バッファ内の音声を特徴量に変換し、推論を実行""" + # 1. 特徴量抽出 (45フレーム分) + chunk_samples = self.sample_buffer[:self.SEGMENT_SAMPLES] + features = get_features(chunk_samples) + x_input = features[np.newaxis, :, :] + + # 2. Encoder 実行 + enc_inputs = build_enc_inputs(self.enc_net, x_input, self.states) + outputs = self.enc_net.run(None, enc_inputs) + + encoder_out = outputs[0][0] + self.states = outputs[1:] + + # 3. Greedy Search (Joiner + Decoder) + new_text = "" + for t in range(encoder_out.shape[0]): + cur_enc = encoder_out[t:t+1] + logits = self.joi_net.run(None, { + self.joi_net.get_inputs()[0].name: cur_enc, + self.joi_net.get_inputs()[1].name: self.decoder_out + })[0] + + y = np.argmax(logits) + if y != 0: # blank_id 以外 + token = self.token_table.get(y, "") + new_text += token.replace("▁", " ") # ▁をスペースに置換 + + # デコーダ更新 + self.hyp.append(y) + decoder_input = np.array([self.hyp[-2:]], dtype=np.int64) + self.decoder_out = self.dec_net.run(None, {self.dec_net.get_inputs()[0].name: decoder_input})[0] + + return new_text + +def main_inference_loop(mic_info, estimator): + que = mic_info["que"] + fin = mic_info["fin"] + pause = mic_info["pause"] + + print("--- リアルタイム音声認識開始 (終了は CTRL+C またはアプリ操作) ---") + try: + while not fin.is_set(): + if pause.is_set(): + time.sleep(0.1) + continue + + try: + # 1. マイクから届いたデータを取得 (Timeout 0.1s) + new_samples = que.get(timeout=0.1) + estimator.sample_buffer = np.concatenate([estimator.sample_buffer, new_samples]) + + # 2. 十分なデータが溜まっていれば推論実行 + while len(estimator.sample_buffer) >= estimator.SEGMENT_SAMPLES: + # 推論実行 + recognized_text = estimator.decode_chunk() + + if recognized_text: + print(recognized_text, end="", flush=True) + estimator.sample_buffer = estimator.sample_buffer[estimator.OFFSET_SAMPLES:] + + except que.Empty: + # キューが空のときは次の入力を待つ + continue + except KeyboardInterrupt: + print("\n認識を終了します...") + finally: + print("\nDone.") + def load_tokens(tokens_path): """トークンファイル を読み込んで ID から文字を引く辞書を返す""" token_table = {} @@ -179,12 +288,13 @@ def tokens_to_text(token_ids, token_table): def main(): samples, sr = read_wave(WAV_PATH) + tail_paddings = np.zeros(int(0.66 * sr), dtype=np.float32) # 0.66s相当のゼロパディングを末尾に追加 + samples = np.concatenate([samples, tail_paddings]) if not args.onnx: enc_net = ailia.Net(None, WEIGHT_ENC_PATH, env_id=args.env_id, memory_mode=args.memory_mode) - joi_net = ailia.Net(None, WEIGHT_JOI_PATH, env_id=args.env_id, memory_mode=args.memory_mode) dec_net = ailia.Net(None, WEIGHT_DEC_PATH, env_id=args.env_id, memory_mode=args.memory_mode) - + joi_net = ailia.Net(None, WEIGHT_JOI_PATH, env_id=args.env_id, memory_mode=args.memory_mode) else: import onnxruntime providers = ["CPUExecutionProvider"] @@ -193,17 +303,17 @@ def main(): dec_net = onnxruntime.InferenceSession(WEIGHT_DEC_PATH, providers=providers) joi_net = onnxruntime.InferenceSession(WEIGHT_JOI_PATH, providers=providers) - # モデル入力から期待フレーム数を推定する - enc_input_shape = enc_net.get_inputs()[0] - shape = enc_input_shape.shape # 例: [1, 45, 80] または [45, 80] - if len(shape) == 3: - expected_frames = shape[1] - n_mels = shape[2] - elif len(shape) == 2: - expected_frames = shape[0] - n_mels = shape[1] + # モデル入力から期待フレーム数を推定する + enc_input_shape = _get_input_infos(enc_net)[0]["shape"] + shape = enc_input_shape # 例: [1, 45, 80] または [45, 80] + if len(shape) == 3: + expected_frames = shape[1] + n_mels = shape[2] + elif len(shape) == 2: + expected_frames = shape[0] + n_mels = shape[1] - token_list = process_full_audio(enc_net, dec_net, joi_net, samples=samples, sr=sr, segment_length=expected_frames, offset=32, n_mels=n_mels) + token_list = recognize_from_audio(enc_net, dec_net, joi_net, samples=samples, sr=sr, segment_length=expected_frames, offset=32, n_mels=n_mels) token_table = load_tokens(TOKEN_PATH) result_text = tokens_to_text(token_list, token_table) From 7a6884e01866416497ba16093ca83c1600e23016 Mon Sep 17 00:00:00 2001 From: ailia_watanabe Date: Thu, 25 Dec 2025 16:19:36 +0900 Subject: [PATCH 07/15] =?UTF-8?q?refactor=20=E3=83=A2=E3=83=87=E3=83=AB?= =?UTF-8?q?=E3=83=BB=E3=83=88=E3=83=BC=E3=82=AF=E3=83=B3=E3=83=95=E3=82=A1?= =?UTF-8?q?=E3=82=A4=E3=83=AB=E3=82=92=E5=8F=AF=E5=A4=89=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- audio_processing/sherpa-onnx/sherpa-onnx.py | 50 ++++++++++++++++----- 1 file changed, 39 insertions(+), 11 deletions(-) diff --git a/audio_processing/sherpa-onnx/sherpa-onnx.py b/audio_processing/sherpa-onnx/sherpa-onnx.py index f91ce1424..9f56c6173 100644 --- a/audio_processing/sherpa-onnx/sherpa-onnx.py +++ b/audio_processing/sherpa-onnx/sherpa-onnx.py @@ -18,19 +18,32 @@ WAV_PATH = "ja.wav" SAVE_TEXT_PATH = "output.txt" -WEIGHT_ENC_PATH = "encoder-epoch-75-avg-11-chunk-16-left-128.int8.onnx" -WEIGHT_DEC_PATH = "decoder-epoch-75-avg-11-chunk-16-left-128.onnx" -WEIGHT_JOI_PATH = "joiner-epoch-75-avg-11-chunk-16-left-128.int8.onnx" -TOKEN_PATH = "tokens.txt" +WEIGHT_ENC_ONLINE_ZIPFORMER_PATH = "encoder-epoch-75-avg-11-chunk-16-left-128.int8.onnx" +WEIGHT_DEC_ONLINE_ZIPFORMER_PATH = "decoder-epoch-75-avg-11-chunk-16-left-128.onnx" +WEIGHT_JOI_ONLINE_ZIPFORMER_PATH = "joiner-epoch-75-avg-11-chunk-16-left-128.int8.onnx" +TOKEN_ONLINE_ZIPFORMER_PATH = "tokens.txt" +REMOTE_PATH = "https://storage.googleapis.com/ailia-models/sherpa-onnx/" # ====================== # Arguemnt Parser Config # ====================== parser = get_base_parser("sherpa-onnx", WAV_PATH, SAVE_TEXT_PATH, input_ftype="audio") parser.add_argument("--memory_mode", default=-1, type=int, help="memory mode") -parser.add_argument("--ailia_audio", action="store_true", help="use ailia audio.") -parser.add_argument("--disable_ailia_tokenizer", action="store_true", help="disable ailia tokenizer.") parser.add_argument("--onnx", action="store_true", help="execute onnxruntime version.") +parser.add_argument( + "-V", + action="store_true", + help="use microphone input", +) +parser.add_argument( + "-m", + "--model_type", + default="online-zipformer", + choices=( + "online-zipformer", + ), + help="model type", +) args = update_parser(parser) @@ -287,14 +300,29 @@ def tokens_to_text(token_ids, token_table): def main(): + global WEIGHT_DEC_PATH, MODEL_DEC_PATH, WEIGHT_ENC_PATH, MODEL_ENC_PATH, WEIGHT_JOI_PATH, MODEL_JOI_PATH, TOKEN_PATH + model_dic = { + "online-zipformer": {"enc": (WEIGHT_ENC_ONLINE_ZIPFORMER_PATH, None), + "dec": (WEIGHT_DEC_ONLINE_ZIPFORMER_PATH, None), + "joi": (WEIGHT_JOI_ONLINE_ZIPFORMER_PATH, None), + "token": TOKEN_ONLINE_ZIPFORMER_PATH + }, + } + model_info = model_dic[args.model_type] + + WEIGHT_ENC_PATH, MODEL_ENC_PATH = model_info["enc"] + WEIGHT_DEC_PATH, MODEL_DEC_PATH = model_info["dec"] + WEIGHT_JOI_PATH, MODEL_JOI_PATH = model_info["joi"] + TOKEN_PATH = model_info["token"] + samples, sr = read_wave(WAV_PATH) tail_paddings = np.zeros(int(0.66 * sr), dtype=np.float32) # 0.66s相当のゼロパディングを末尾に追加 samples = np.concatenate([samples, tail_paddings]) if not args.onnx: - enc_net = ailia.Net(None, WEIGHT_ENC_PATH, env_id=args.env_id, memory_mode=args.memory_mode) - dec_net = ailia.Net(None, WEIGHT_DEC_PATH, env_id=args.env_id, memory_mode=args.memory_mode) - joi_net = ailia.Net(None, WEIGHT_JOI_PATH, env_id=args.env_id, memory_mode=args.memory_mode) + enc_net = ailia.Net(MODEL_ENC_PATH, WEIGHT_ENC_PATH, env_id=args.env_id, memory_mode=args.memory_mode) + dec_net = ailia.Net(MODEL_DEC_PATH, WEIGHT_DEC_PATH, env_id=args.env_id, memory_mode=args.memory_mode) + joi_net = ailia.Net(MODEL_JOI_PATH, WEIGHT_JOI_PATH, env_id=args.env_id, memory_mode=args.memory_mode) else: import onnxruntime providers = ["CPUExecutionProvider"] @@ -311,8 +339,8 @@ def main(): n_mels = shape[2] elif len(shape) == 2: expected_frames = shape[0] - n_mels = shape[1] - + n_mels = shape[1] + token_list = recognize_from_audio(enc_net, dec_net, joi_net, samples=samples, sr=sr, segment_length=expected_frames, offset=32, n_mels=n_mels) token_table = load_tokens(TOKEN_PATH) From e4224985fce89be4d5d7f118ef53b06d6dfd4657 Mon Sep 17 00:00:00 2001 From: ailia_watanabe Date: Thu, 25 Dec 2025 16:46:52 +0900 Subject: [PATCH 08/15] =?UTF-8?q?refactor=20net.run=E3=81=AEailia=20sdk?= =?UTF-8?q?=E4=BB=95=E6=A7=98=E3=81=B8=E3=81=AE=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- audio_processing/sherpa-onnx/sherpa-onnx.py | 58 ++++++++++++++------- 1 file changed, 39 insertions(+), 19 deletions(-) diff --git a/audio_processing/sherpa-onnx/sherpa-onnx.py b/audio_processing/sherpa-onnx/sherpa-onnx.py index 9f56c6173..042282dba 100644 --- a/audio_processing/sherpa-onnx/sherpa-onnx.py +++ b/audio_processing/sherpa-onnx/sherpa-onnx.py @@ -30,11 +30,7 @@ parser = get_base_parser("sherpa-onnx", WAV_PATH, SAVE_TEXT_PATH, input_ftype="audio") parser.add_argument("--memory_mode", default=-1, type=int, help="memory mode") parser.add_argument("--onnx", action="store_true", help="execute onnxruntime version.") -parser.add_argument( - "-V", - action="store_true", - help="use microphone input", -) +parser.add_argument("-V", action="store_true", help="use microphone input",) parser.add_argument( "-m", "--model_type", @@ -130,7 +126,10 @@ def recognize_from_audio(enc_net, dec_net, joi_net, samples, sr=16000, segment_l # 最初の文脈ベクトルを生成 decoder_input = np.array([hyp], dtype=np.int64) - decoder_out = dec_net.run(None, { _get_input_infos(dec_net)[0]["name"]: decoder_input})[0] + if not args.onnx: + decoder_out = dec_net.run(decoder_input)[0] + else: + decoder_out = dec_net.run(None, { _get_input_infos(dec_net)[0]["name"]: decoder_input})[0] num_processed_frames = 0 final_hyp = [] @@ -141,7 +140,10 @@ def recognize_from_audio(enc_net, dec_net, joi_net, samples, sr=16000, segment_l # A. Encoder 実行 enc_inputs = build_enc_inputs(enc_net, x_chunk, states) - outputs = enc_net.run(None, enc_inputs) + if not args.onnx: + outputs = enc_net.run(enc_inputs) + else: + outputs = enc_net.run(None, enc_inputs) encoder_out = outputs[0] # (1, T', 512) states = outputs[1:] # 記憶を更新して次のループへ @@ -152,10 +154,13 @@ def recognize_from_audio(enc_net, dec_net, joi_net, samples, sr=16000, segment_l cur_enc = encoder_out[t:t+1] # 今の瞬間の音ベクトル # Joiner で確率計算 - logits = joi_net.run(None, { - _get_input_infos(joi_net)[0]["name"]: cur_enc, - _get_input_infos(joi_net)[1]["name"]: decoder_out - })[0] + if not args.onnx: + logits = joi_net.run(cur_enc, decoder_out)[0] + else: + logits = joi_net.run(None, { + _get_input_infos(joi_net)[0]["name"]: cur_enc, + _get_input_infos(joi_net)[1]["name"]: decoder_out + })[0] y = np.argmax(logits) # 最も可能性の高い文字ID @@ -166,7 +171,10 @@ def recognize_from_audio(enc_net, dec_net, joi_net, samples, sr=16000, segment_l # 直近 context_size文字の履歴で新しい文脈ベクトルを作成 decoder_input = np.array([hyp[-context_size:]], dtype=np.int64) - decoder_out = dec_net.run(None, { _get_input_infos(dec_net)[0]["name"]: decoder_input})[0] + if not args.onnx: + decoder_out = dec_net.run(decoder_input)[0] + else: + decoder_out = dec_net.run(None, { _get_input_infos(dec_net)[0]["name"]: decoder_input})[0] # C. offsetフレーム進める num_processed_frames += offset @@ -195,7 +203,10 @@ def __init__(self, enc_net, dec_net, joi_net, token_table, sr=16000, segment_len def _init_decoder(self): """初期文脈ベクトルの生成""" decoder_input = np.array([self.hyp], dtype=np.int64) - return self.dec_net.run(None, {self.dec_net.get_inputs()[0].name: decoder_input})[0] + if not args.onnx: + return self.dec_net.run(decoder_input)[0] + else: + return self.dec_net.run(None, {self.dec_net.get_inputs()[0].name: decoder_input})[0] def decode_chunk(self): """バッファ内の音声を特徴量に変換し、推論を実行""" @@ -206,7 +217,10 @@ def decode_chunk(self): # 2. Encoder 実行 enc_inputs = build_enc_inputs(self.enc_net, x_input, self.states) - outputs = self.enc_net.run(None, enc_inputs) + if not args.onnx: + outputs = self.enc_net.run(enc_inputs) + else: + outputs = self.enc_net.run(None, enc_inputs) encoder_out = outputs[0][0] self.states = outputs[1:] @@ -215,10 +229,13 @@ def decode_chunk(self): new_text = "" for t in range(encoder_out.shape[0]): cur_enc = encoder_out[t:t+1] - logits = self.joi_net.run(None, { - self.joi_net.get_inputs()[0].name: cur_enc, - self.joi_net.get_inputs()[1].name: self.decoder_out - })[0] + if not args.onnx: + logits = self.joi_net.run(cur_enc, self.decoder_out)[0] + else: + logits = self.joi_net.run(None, { + self.joi_net.get_inputs()[0].name: cur_enc, + self.joi_net.get_inputs()[1].name: self.decoder_out + })[0] y = np.argmax(logits) if y != 0: # blank_id 以外 @@ -228,7 +245,10 @@ def decode_chunk(self): # デコーダ更新 self.hyp.append(y) decoder_input = np.array([self.hyp[-2:]], dtype=np.int64) - self.decoder_out = self.dec_net.run(None, {self.dec_net.get_inputs()[0].name: decoder_input})[0] + if not args.onnx: + self.decoder_out = self.dec_net.run(decoder_input)[0] + else: + self.decoder_out = self.dec_net.run(None, {self.dec_net.get_inputs()[0].name: decoder_input})[0] return new_text From 66f4cb70e23d9687f2905dad67c75536c15f8446 Mon Sep 17 00:00:00 2001 From: ailia_watanabe Date: Thu, 19 Feb 2026 16:47:32 +0900 Subject: [PATCH 09/15] =?UTF-8?q?memory-mode=E3=81=AB=E3=81=A4=E3=81=84?= =?UTF-8?q?=E3=81=A6=E3=81=AE=E6=9D=A1=E4=BB=B6=E5=88=86=E5=B2=90=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- audio_processing/sherpa-onnx/sherpa-onnx.py | 74 ++++++++++++++++----- 1 file changed, 56 insertions(+), 18 deletions(-) diff --git a/audio_processing/sherpa-onnx/sherpa-onnx.py b/audio_processing/sherpa-onnx/sherpa-onnx.py index 042282dba..4cc7880d2 100644 --- a/audio_processing/sherpa-onnx/sherpa-onnx.py +++ b/audio_processing/sherpa-onnx/sherpa-onnx.py @@ -6,8 +6,10 @@ import wave import librosa import sys +import queue sys.path.append('../../util') -from arg_utils import get_base_parser, update_parser # noqa: E402 +from arg_utils import get_base_parser, update_parser +from microphone_utils import start_microphone_input logger = getLogger(__name__) @@ -21,6 +23,7 @@ WEIGHT_ENC_ONLINE_ZIPFORMER_PATH = "encoder-epoch-75-avg-11-chunk-16-left-128.int8.onnx" WEIGHT_DEC_ONLINE_ZIPFORMER_PATH = "decoder-epoch-75-avg-11-chunk-16-left-128.onnx" WEIGHT_JOI_ONLINE_ZIPFORMER_PATH = "joiner-epoch-75-avg-11-chunk-16-left-128.int8.onnx" +MODEL_OFFSET_ONLINE_ZIPFORMER = 32 TOKEN_ONLINE_ZIPFORMER_PATH = "tokens.txt" REMOTE_PATH = "https://storage.googleapis.com/ailia-models/sherpa-onnx/" @@ -187,6 +190,9 @@ def __init__(self, enc_net, dec_net, joi_net, token_table, sr=16000, segment_len self.dec_net = dec_net self.joi_net = joi_net self.token_table = token_table + + self.n_mels = n_mels + self.sr = sr # 内部状態の初期化 self.states = init_states(enc_net) @@ -197,8 +203,10 @@ def __init__(self, enc_net, dec_net, joi_net, token_table, sr=16000, segment_len self.sample_buffer = np.array([], dtype=np.float32) # 定数 (16kHz想定) - self.OFFSET_SAMPLES = int(offset * sr *0.01) # 10ms歩進 - self.SEGMENT_SAMPLES = int(segment_length * sr *0.01) # segment_lengthフレーム分 + win_length = 400 + hop_length = 160 + self.SEGMENT_SAMPLES = int(win_length + segment_length * hop_length) + self.OFFSET_SAMPLES = int(offset * hop_length) def _init_decoder(self): """初期文脈ベクトルの生成""" @@ -212,7 +220,7 @@ def decode_chunk(self): """バッファ内の音声を特徴量に変換し、推論を実行""" # 1. 特徴量抽出 (45フレーム分) chunk_samples = self.sample_buffer[:self.SEGMENT_SAMPLES] - features = get_features(chunk_samples) + features = get_features(chunk_samples, n_mels=self.n_mels, sr=self.sr) x_input = features[np.newaxis, :, :] # 2. Encoder 実行 @@ -278,8 +286,8 @@ def main_inference_loop(mic_info, estimator): print(recognized_text, end="", flush=True) estimator.sample_buffer = estimator.sample_buffer[estimator.OFFSET_SAMPLES:] - except que.Empty: - # キューが空のときは次の入力を待つ + except queue.Empty: + # キューが空のときはの入力を待つ continue except KeyboardInterrupt: print("\n認識を終了します...") @@ -320,26 +328,36 @@ def tokens_to_text(token_ids, token_table): def main(): - global WEIGHT_DEC_PATH, MODEL_DEC_PATH, WEIGHT_ENC_PATH, MODEL_ENC_PATH, WEIGHT_JOI_PATH, MODEL_JOI_PATH, TOKEN_PATH + global WEIGHT_DEC_PATH, MODEL_DEC_PATH, WEIGHT_ENC_PATH, MODEL_ENC_PATH, WEIGHT_JOI_PATH, MODEL_JOI_PATH, MODEL_OFFSET, TOKEN_PATH model_dic = { "online-zipformer": {"enc": (WEIGHT_ENC_ONLINE_ZIPFORMER_PATH, None), "dec": (WEIGHT_DEC_ONLINE_ZIPFORMER_PATH, None), "joi": (WEIGHT_JOI_ONLINE_ZIPFORMER_PATH, None), - "token": TOKEN_ONLINE_ZIPFORMER_PATH + "token": TOKEN_ONLINE_ZIPFORMER_PATH, + "offset": MODEL_OFFSET_ONLINE_ZIPFORMER }, } + model_info = model_dic[args.model_type] WEIGHT_ENC_PATH, MODEL_ENC_PATH = model_info["enc"] WEIGHT_DEC_PATH, MODEL_DEC_PATH = model_info["dec"] WEIGHT_JOI_PATH, MODEL_JOI_PATH = model_info["joi"] + MODEL_OFFSET = model_info["offset"] TOKEN_PATH = model_info["token"] - samples, sr = read_wave(WAV_PATH) - tail_paddings = np.zeros(int(0.66 * sr), dtype=np.float32) # 0.66s相当のゼロパディングを末尾に追加 - samples = np.concatenate([samples, tail_paddings]) + token_table = load_tokens(TOKEN_PATH) if not args.onnx: + if args.memory_mode == -1: + args.memory_mode = ailia.get_memory_mode( + reduce_constant=True, + ignore_input_with_initializer=True, + reduce_interstage=False, + reuse_interstage=True, + ) + if (args.memory_mode & 16) != 0: + ailia.set_temporary_cache_path("./") enc_net = ailia.Net(MODEL_ENC_PATH, WEIGHT_ENC_PATH, env_id=args.env_id, memory_mode=args.memory_mode) dec_net = ailia.Net(MODEL_DEC_PATH, WEIGHT_DEC_PATH, env_id=args.env_id, memory_mode=args.memory_mode) joi_net = ailia.Net(MODEL_JOI_PATH, WEIGHT_JOI_PATH, env_id=args.env_id, memory_mode=args.memory_mode) @@ -360,13 +378,33 @@ def main(): elif len(shape) == 2: expected_frames = shape[0] n_mels = shape[1] - - token_list = recognize_from_audio(enc_net, dec_net, joi_net, samples=samples, sr=sr, segment_length=expected_frames, offset=32, n_mels=n_mels) - - token_table = load_tokens(TOKEN_PATH) - result_text = tokens_to_text(token_list, token_table) - print(f"認識結果: {result_text}") - + + if args.V: + # A. マイク入力モード + mic_info = start_microphone_input(sample_rate=16000, sc=False) + # 推論エンジンの初期化 + estimator = RealtimeEstimator( + enc_net, dec_net, joi_net, token_table, + sr=16000, segment_length=expected_frames, offset=MODEL_OFFSET, n_mels=n_mels + ) + + # マイク入力を開始(ここでは既存の mic ユーティリティ等を使う想定) + # start_microphone_thread(mic_info) + + main_inference_loop(mic_info, estimator) + else: + # B. ファイル入力モード + samples, sr = read_wave(WAV_PATH) + tail_paddings = np.zeros(int(0.66 * sr), dtype=np.float32) # 0.66s相当のゼロパディングを末尾に追加 + samples = np.concatenate([samples, tail_paddings]) + + token_list = recognize_from_audio( + enc_net, dec_net, joi_net, samples=samples, sr=sr, + segment_length=expected_frames, offset=MODEL_OFFSET, n_mels=n_mels + ) + + result_text = tokens_to_text(token_list, token_table) + print(f"認識結果: {result_text}") if __name__ == "__main__": main() From 15ab63536d8c727d55f932ec81b988ffb192cbac Mon Sep 17 00:00:00 2001 From: ailia_watanabe Date: Tue, 24 Feb 2026 12:22:22 +0900 Subject: [PATCH 10/15] add some files --- audio_processing/sherpa-onnx/.gitignore | 4 + audio_processing/sherpa-onnx/LICENSE | 202 + audio_processing/sherpa-onnx/README.md | 58 + audio_processing/sherpa-onnx/ja.wav | Bin 0 -> 446868 bytes audio_processing/sherpa-onnx/tokens.txt | 16016 ++++++++++++++++++++++ 5 files changed, 16280 insertions(+) create mode 100644 audio_processing/sherpa-onnx/.gitignore create mode 100644 audio_processing/sherpa-onnx/LICENSE create mode 100644 audio_processing/sherpa-onnx/README.md create mode 100644 audio_processing/sherpa-onnx/ja.wav create mode 100644 audio_processing/sherpa-onnx/tokens.txt diff --git a/audio_processing/sherpa-onnx/.gitignore b/audio_processing/sherpa-onnx/.gitignore new file mode 100644 index 000000000..c098dc215 --- /dev/null +++ b/audio_processing/sherpa-onnx/.gitignore @@ -0,0 +1,4 @@ +*.onnx +development_memo.md +sherpa-onnx.code-workspace +test.py \ No newline at end of file diff --git a/audio_processing/sherpa-onnx/LICENSE b/audio_processing/sherpa-onnx/LICENSE new file mode 100644 index 000000000..d64569567 --- /dev/null +++ b/audio_processing/sherpa-onnx/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/audio_processing/sherpa-onnx/README.md b/audio_processing/sherpa-onnx/README.md new file mode 100644 index 000000000..e4c17290a --- /dev/null +++ b/audio_processing/sherpa-onnx/README.md @@ -0,0 +1,58 @@ +# sherpa-onnx : Streaming Speech Recognition using Zipformer Transducer + +## Input + +Audio file (WAV, mono, 16kHz, 16-bit PCM) + +## Output + +Recognized speech text + +## Requirements +This model requires additional module. +``` +pip3 install librosa +pip3 install pyaudio # for microphone input mode +pip3 install onnxruntime # for --onnx option +``` + +## Usage +Automatically downloads the onnx and prototxt files on the first run. +It is necessary to be connected to the Internet while downloading. + +For the sample wav, +```bash +$ python3 sherpa-onnx.py +``` + +If inference fails because the model contains operators that are not supported by the ailia SDK, you can perform inference with ONNX Runtime by +```bash +python3 sherpa-onnx.py --onnx +``` +. + +If you want to specify the audio, put the file path after the `--input` option. +```bash +python3 sherpa-onnx.py --input AUDIO_FILE +``` + +If you specify the `-V` option, it will be in input mode from the microphone. + +```bash +python3 sherpa-onnx.py -V +``` + +1. speak into the microphone +2. the recognized text is printed in real time as you speak +3. type `Ctrl+c` to exit + + +## Reference + +- [sherpa-onnx](https://github.com/k2-fsa/sherpa-onnx) +- [icefall](https://github.com/k2-fsa/icefall) +- [PengChengStarling](https://github.com/PCL-Voice/PengChengStarling) +- [Hugging Face - sherpa-onnx-streaming-zipformer (ONNX model, token file, sample audio file)](https://huggingface.co/csukuangfj/sherpa-onnx-streaming-zipformer-ar_en_id_ja_ru_th_vi_zh-2025-02-10/tree/main) + +## Framework +PyTorch \ No newline at end of file diff --git a/audio_processing/sherpa-onnx/ja.wav b/audio_processing/sherpa-onnx/ja.wav new file mode 100644 index 0000000000000000000000000000000000000000..2622b434c735c29439a0eccdf623932e4c85a0ed GIT binary patch literal 446868 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
c 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 ZNqz6S&RXYp)pZYK 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 +▁ 11 +S 12 +▁JA 13 +< 14 +▁> 15 +▁的 16 +▁THE 17 +▁の 18 +▁我 19 +▁是 20 +▁一 21 +▁你 22 +▁TO 23 +▁て 24 +' 25 +▁に 26 +▁В 27 +▁了 28 +▁là 29 +А 30 +▁OF 31 +AN 32 +▁不 33 +▁DI 34 +I 35 +▁ال 36 +▁A 37 +▁が 38 +▁这 39 +▁は 40 +▁ก็ 41 +▁た 42 +▁YANG 43 +ة 44 +▁と 45 +И 46 +T 47 +▁を 48 +▁ที่ 49 +▁có 50 +▁で 51 +▁个 52 +▁AND 53 +▁THAT 54 +▁НА 55 +▁không 56 +NYA 57 +▁IN 58 +▁И 59 +▁นะ 60 +KAN 61 +▁有 62 +▁就 63 +▁ไป 64 +▁人 65 +D 66 +RE 67 +▁في 68 +▁มี 69 +▁НЕ 70 +▁INI 71 +▁です 72 +▁của 73 +▁ครับ 74 +▁ไม่ 75 +ING 76 +ن 77 +Е 78 +▁在 79 +AND 80 +▁们 81 +▁С 82 +▁ПО 83 +▁YOU 84 +▁他 85 +ي 86 +n 87 +ت 88 +▁เป็น 89 +Я 90 +ED 91 +▁么 92 +َ 93 +▁来 94 +▁し 95 +▁ว่า 96 +▁من 97 +У 98 +▁IS 99 +▁một 100 +▁จะ 101 +▁มา 102 +A 103 +น 104 +В 105 +▁và 106 +▁cái 107 +▁ЧТО 108 +▁も 109 +▁KE 110 +ا 111 +▁ของ 112 +▁ます 113 +m 114 +ม 115 +▁说 116 +▁ITU 117 +M 118 +▁แล้ว 119 +ه 120 +НО 121 +t 122 +▁那 123 +▁เขา 124 +ng 125 +▁IT 126 +▁大 127 +▁ได้ 128 +▁DAN 129 +▁được 130 +▁ใน 131 +IN 132 +ก 133 +い 134 +- 135 +▁ให้ 136 +▁要 137 +ية 138 +▁tôi 139 +▁I 140 +ร 141 +▁か 142 +▁เลย 143 +IT 144 +ُ 145 +▁thì 146 +▁các 147 +AL 148 +م 149 +▁好 150 +▁上 151 +▁م 152 +▁người 153 +▁เนี่ย 154 +▁ЗА 155 +▁คน 156 +▁FOR 157 +▁أن 158 +▁な 159 +О 160 +ات 161 +▁到 162 +K 163 +▁KITA 164 +▁WE 165 +М 166 +ТО 167 +▁cho 168 +▁đã 169 +▁ت 170 +▁啊 171 +i 172 +▁الم 173 +▁คือ 174 +و 175 +ً 176 +▁ค่ะ 177 +С 178 +▁JUGA 179 +E 180 +▁นะคะ 181 +▁những 182 +ك 183 +▁มัน 184 +▁การ 185 +▁ね 186 +▁У 187 +c 188 +▁会 189 +▁BE 190 +บ 191 +▁WAS 192 +▁ん 193 +▁trong 194 +ب 195 +▁ADA 196 +▁都 197 +ด 198 +▁này 199 +ال 200 +ِ 201 +▁去 202 +ف 203 +▁能 204 +▁也 205 +▁mà 206 +LY 207 +▁و 208 +N 209 +▁أ 210 +▁นี้ 211 +▁ЭТО 212 +ع 213 +▁DARI 214 +▁没 215 +ها 216 +っ 217 +▁thể 218 +▁以 219 +AT 220 +▁得 221 +DI 222 +▁ta 223 +▁为 224 +SO 225 +▁คุณ 226 +▁THIS 227 +▁子 228 +▁可 229 +Т 230 +Д 231 +▁いう 232 +ЛИ 233 +Ы 234 +▁với 235 +ง 236 +ย 237 +Y 238 +▁DENGAN 239 +▁出 240 +▁على 241 +КА 242 +▁还 243 +▁phải 244 +▁อยู่ 245 +▁แล้วก็ 246 +▁ME 247 +▁Я 248 +▁时 249 +▁家 250 +a 251 +▁HAVE 252 +▁กับ 253 +ท 254 +▁中 255 +ل 256 +▁sẽ 257 +▁UNTUK 258 +SE 259 +▁กัน 260 +▁から 261 +ين 262 +o 263 +▁事 264 +▁まし 265 +THE 266 +▁để 267 +▁DUA 268 +ล 269 +▁ทํา 270 +▁ON 271 +▁小 272 +▁什 273 +▁十 274 +▁như 275 +▁WITH 276 +▁กว่า 277 +▁hai 278 +▁看 279 +▁下 280 +TA 281 +▁TIDAK 282 +ER 283 +▁เรา 284 +ว 285 +SI 286 +ส 287 +▁rất 288 +Р 289 +▁BER 290 +▁ARE 291 +u 292 +▁天 293 +ون 294 +Й 295 +НА 296 +ต 297 +▁cũng 298 +▁后 299 +▁แต่ 300 +نا 301 +ح 302 +▁年 303 +▁ない 304 +د 305 +▁ở 306 +▁自 307 +LE 308 +▁mình 309 +س 310 +า 311 +YA 312 +▁chúng 313 +G 314 +▁PER 315 +▁ต้อง 316 +▁ي 317 +ق 318 +▁AS 319 +وا 320 +OR 321 +▁こと 322 +▁多 323 +▁想 324 +▁三 325 +К 326 +▁YA 327 +BUT 328 +▁お 329 +▁ВЫ 330 +▁二 331 +▁đến 332 +▁ДО 333 +▁生 334 +▁บอ 335 +▁КАК 336 +AS 337 +▁だ 338 +し 339 +▁đó 340 +る 341 +▁nó 342 +り 343 +▁BISA 344 +Х 345 +▁ra 346 +RA 347 +▁ПРО 348 +ر 349 +▁nhiều 350 +▁О 351 +▁NOT 352 +▁làm 353 +▁い 354 +R 355 +ДА 356 +y 357 +Л 358 +▁ب 359 +▁DO 360 +U 361 +▁里 362 +▁МНЕ 363 +▁năm 364 +ОВ 365 +▁点 366 +КИ 367 +▁さん 368 +▁着 369 +▁THEY 370 +YANG 371 +▁học 372 +▁hàng 373 +Ж 374 +▁CAN 375 +Ш 376 +▁ОТ 377 +▁SUDAH 378 +▁công 379 +▁AKAN 380 +▁đi 381 +▁ПРИ 382 +Ю 383 +อ 384 +▁ด้วย 385 +LI 386 +▁anh 387 +O 388 +nh 389 +▁về 390 +B 391 +ค 392 +هم 393 +▁nhà 394 +▁よ 395 +▁地 396 +▁国 397 +▁道 398 +ん 399 +TI 400 +P 401 +ج 402 +РА 403 +▁إلى 404 +ป 405 +ン 406 +▁ВОТ 407 +▁وال 408 +▁khi 409 +ОМ 410 +▁bạn 411 +▁心 412 +p 413 +▁行 414 +▁HE 415 +LA 416 +▁ABOUT 417 +▁อะไร 418 +▁SAYA 419 +ー 420 +TE 421 +ПО 422 +▁lại 423 +▁PULUH 424 +VE 425 +WE 426 +▁LIKE 427 +▁方 428 +НЕ 429 +ЛА 430 +▁然 431 +MA 432 +ط 433 +▁前 434 +TER 435 +▁nào 436 +▁和 437 +ТЬ 438 +▁回 439 +SA 440 +Н 441 +▁thế 442 +▁ấy 443 +▁WHAT 444 +KE 445 +ス 446 +▁SO 447 +МИ 448 +▁今 449 +TH 450 +▁知 451 +TO 452 +КУ 453 +TAPI 454 +НУ 455 +▁vào 456 +▁และ 457 +ْ 458 +く 459 +JA 460 +RI 461 +▁هذا 462 +▁日 463 +ТЕ 464 +▁所 465 +▁لل 466 +▁SATU 467 +▁việc 468 +МА 469 +▁mươi 470 +tôi 471 +▁DALAM 472 +▁SE 473 +AR 474 +▁ИЗ 475 +▁РАЗ 476 +ان 477 +▁ฮะ 478 +ิ 479 +CE 480 +▁เรื่อง 481 +▁هذه 482 +اء 483 +▁把 484 +▁dụng 485 +AH 486 +YOU 487 +▁เอา 488 +▁TER 489 +▁最 490 +▁当 491 +▁さ 492 +▁JUST 493 +▁بال 494 +أ 495 +ช 496 +L 497 +NA 498 +▁ALL 499 +ES 500 +Б 501 +▁AT 502 +▁老 503 +▁いる 504 +GA 505 +▁นี่ 506 +З 507 +▁之 508 +▁FROM 509 +▁trăm 510 +Ч 511 +IF 512 +▁分 513 +IL 514 +Ь 515 +ГО 516 +▁YOUR 517 +C 518 +▁この 519 +NAH 520 +IS 521 +▁五 522 +RO 523 +▁thành 524 +▁起 525 +▁ما 526 +▁sự 527 +▁từ 528 +▁ONE 529 +▁面 530 +▁bị 531 +ON 532 +▁KNOW 533 +▁する 534 +US 535 +ص 536 +▁trên 537 +▁gì 538 +ら 539 +▁أو 540 +▁真 541 +▁لا 542 +▁成 543 +▁MY 544 +LL 545 +れ 546 +ITU 547 +▁ЕСТЬ 548 +▁จาก 549 +▁К 550 +▁情 551 +ЛО 552 +th 553 +ANG 554 +▁con 555 +▁ผม 556 +НИ 557 +▁THERE 558 +П 559 +▁れ 560 +ى 561 +▁PEOPLE 562 +▁ТАК 563 +พ 564 +RU 565 +▁em 566 +ИТЬ 567 +▁本 568 +LU 569 +▁nên 570 +▁مع 571 +▁động 572 +▁đầu 573 +▁ATAU 574 +ข 575 +▁บอก 576 +▁ba 577 +▁МЫ 578 +▁って 579 +▁四 580 +INI 581 +EN 582 +▁MENG 583 +▁如 584 +▁nhất 585 +▁ПОД 586 +▁用 587 +BER 588 +▁意 589 +ИМ 590 +▁ADALAH 591 +้า 592 +▁そう 593 +▁عن 594 +Г 595 +▁PAK 596 +KU 597 +▁ยัง 598 +ЛЕ 599 +HE 600 +▁OUT 601 +▁手 602 +ОЙ 603 +▁MEN 604 +DU 605 +يا 606 +▁候 607 +▁己 608 +▁作 609 +KALAU 610 +▁trường 611 +ЗА 612 +▁ถ้า 613 +▁cả 614 +▁APA 615 +▁น้ํา 616 +▁СО 617 +▁HAD 618 +き 619 +▁nước 620 +DE 621 +ّ 622 +▁đang 623 +ТИ 624 +và 625 +▁これ 626 +ุ 627 +▁ل 628 +▁者 629 +▁rồi 630 +CA 631 +▁定 632 +ờ 633 +ル 634 +▁INDONESIA 635 +UN 636 +え 637 +MAN 638 +НЫЙ 639 +▁ความ 640 +لا 641 +▁الأ 642 +ห 643 +ASI 644 +▁ngày 645 +▁hơn 646 +ض 647 +わ 648 +خ 649 +PA 650 +▁何 651 +▁เห็น 652 +▁HARUS 653 +▁ЕГО 654 +KA 655 +ST 656 +ТА 657 +▁tại 658 +▁MENJADI 659 +▁ТЫ 660 +▁v 661 +▁HIS 662 +F 663 +▁打 664 +DA 665 +ENT 666 +▁อีก 667 +▁THINK 668 +▁DE 669 +▁BY 670 +TU 671 +か 672 +W 673 +▁l 674 +ТЫ 675 +ش 676 +ОН 677 +H 678 +▁公 679 +▁UP 680 +แ 681 +▁PADA 682 +▁ทาง 683 +▁quan 684 +▁nam 685 +▁ดู 686 +▁hiện 687 +▁再 688 +▁OLEH 689 +▁nói 690 +▁高 691 +▁gia 692 +ما 693 +ใจ 694 +▁chỉ 695 +่ 696 +▁chính 697 +▁Э 698 +▁走 699 +à 700 +▁ํา 701 +▁giờ 702 +▁ผู้ชม 703 +ЛЬ 704 +▁แบบ 705 +▁WERE 706 +▁先 707 +▁OR 708 +▁ปี 709 +▁ORANG 710 +▁BELAS 711 +▁PRO 712 +▁nay 713 +▁đây 714 +َّ 715 +▁百 716 +▁๒ 717 +СЯ 718 +TING 719 +▁điều 720 +▁อย่าง 721 +GI 722 +▁số 723 +ตัว 724 +GU 725 +ول 726 +▁ВСЁ 727 +▁因 728 +KITA 729 +▁ある 730 +ЧЕ 731 +AK 732 +ЕМ 733 +้ 734 +ث 735 +МО 736 +▁や 737 +MEN 738 +▁ДЛЯ 739 +ADA 740 +▁WHO 741 +НЫЕ 742 +ذ 743 +▁ОН 744 +▁thời 745 +▁nhân 746 +▁KALAU 747 +▁thấy 748 +▁WOULD 749 +UM 750 +ВА 751 +▁KEMUDIAN 752 +▁ВСЕ 753 +▁ตํารวจ 754 +Ф 755 +NE 756 +▁التي 757 +ز 758 +▁PEN 759 +▁全 760 +▁còn 761 +▁b 762 +VI 763 +IC 764 +КО 765 +▁ОЧЕНЬ 766 +▁果 767 +▁MORE 768 +▁biết 769 +▁ซึ่ง 770 +CK 771 +THAT 772 +▁ОБ 773 +▁MEMANG 774 +▁vì 775 +ู 776 +▁ТАМ 777 +▁学 778 +▁mới 779 +PER 780 +▁OUR 781 +▁HAS 782 +ЕЙ 783 +АТЬ 784 +▁比 785 +▁次 786 +HA 787 +ME 788 +▁บ้าน 789 +ВЕР 790 +▁thực 791 +す 792 +▁TIGA 793 +▁الت 794 +▁PE 795 +▁SOME 796 +CI 797 +▁而 798 +ch 799 +▁其 800 +في 801 +ПОКАЖИ 802 +▁LEBIH 803 +BU 804 +▁đ 805 +▁định 806 +▁THEIR 807 +▁việt 808 +РЕ 809 +ور 810 +▁МЕНЯ 811 +▁ส 812 +ま 813 +▁その 814 +▁新 815 +НОЙ 816 +▁cơ 817 +▁WILL 818 +▁đồng 819 +▁เพราะว่า 820 +▁cô 821 +▁ผู้ 822 +PE 823 +▁cao 824 +▁THEM 825 +▁太 826 +▁同 827 +▁dân 828 +▁八 829 +▁GITU 830 +ET 831 +AD 832 +ัง 833 +▁cần 834 +▁ТО 835 +▁SEPERTI 836 +ạ 837 +СТ 838 +▁БЫ 839 +▁DON 840 +▁明 841 +▁sinh 842 +▁มาก 843 +▁يعني 844 +▁ăn 845 +เ 846 +▁bộ 847 +КАК 848 +BA 849 +▁thông 850 +▁หนึ่ง 851 +▁mười 852 +UR 853 +▁ЖЕ 854 +MI 855 +ЛЯ 856 +ะ 857 +▁KARENA 858 +▁ถูก 859 +▁แบบนี้ 860 +▁月 861 +ี 862 +▁นาย 863 +▁nhưng 864 +▁ОДИН 865 +▁DIA 866 +▁HARI 867 +▁TAHUN 868 +▁БУДЕТ 869 +GO 870 +ト 871 +▁なっ 872 +จ 873 +ATION 874 +▁RIBU 875 +▁هو 876 +ВО 877 +▁sản 878 +ار 879 +▁إ 880 +WA 881 +▁ЧТОБЫ 882 +من 883 +่า 884 +▁SEE 885 +▁GET 886 +▁六 887 +ЕТ 888 +▁ถึง 889 +▁MEREKA 890 +ٍ 891 +▁目 892 +▁感 893 +う 894 +▁TIME 895 +▁主 896 +▁VERY 897 +▁แม่ 898 +UT 899 +▁ใช่ 900 +▁PEM 901 +▁phát 902 +▁GOING 903 +▁女 904 +み 905 +▁الله 906 +MU 907 +▁พอ 908 +▁KA 909 +▁正 910 +▁viên 911 +НЫХ 912 +Z 913 +ERS 914 +▁IF 915 +▁น้อง 916 +▁市 917 +▁hình 918 +▁ЗДЕСЬ 919 +SAYA 920 +▁ตัว 921 +▁WHEN 922 +▁theo 923 +▁KAMI 924 +TAN 925 +▁qua 926 +▁重 927 +IA 928 +▁trình 929 +БА 930 +ศ 931 +▁REALLY 932 +▁MASIH 933 +▁พี่ 934 +▁BEEN 935 +▁รถ 936 +▁西 937 +▁هناك 938 +▁九 939 +▁ไหม 940 +h 941 +ク 942 +▁hợp 943 +ОГО 944 +▁trung 945 +กัน 946 +▁それ 947 +▁ОНИ 948 +UNTUK 949 +▁ตาม 950 +▁tin 951 +▁รู้ 952 +▁h 953 +▁BAHWA 954 +▁法 955 +tr 956 +NI 957 +▁จริง 958 +وب 959 +▁万 960 +КЕ 961 +▁力 962 +▁いい 963 +▁七 964 +▁๓ 965 +TION 966 +▁工 967 +▁bệnh 968 +CH 969 +ОК 970 +▁ก่อน 971 +▁ประ 972 +▁quốc 973 +ONE 974 +▁見 975 +NO 976 +▁相 977 +▁LAGI 978 +▁TADI 979 +การ 980 +リ 981 +▁けど 982 +СТИ 983 +▁よう 984 +▁GO 985 +MIN 986 +▁ใช้ 987 +▁LIMA 988 +ЕНИЯ 989 +▁外 990 +▁OTHER 991 +▁hay 992 +▁БЫЛО 993 +▁ПЕРЕ 994 +▁ПРОСТО 995 +▁ý 996 +▁hội 997 +▁MEM 998 +АЛ 999 +▁cùng 1000 +ัด 1001 +▁BU 1002 +LAH 1003 +▁giá 1004 +▁УЖЕ 1005 +▁特 1006 +▁đề 1007 +ИЗ 1008 +▁才 1009 +▁HOW 1010 +▁ДВА 1011 +ID 1012 +МЕ 1013 +イ 1014 +có 1015 +ถ 1016 +▁tế 1017 +CU 1018 +ИЛИ 1019 +UL 1020 +▁ขึ้น 1021 +▁อยาก 1022 +▁chín 1023 +РО 1024 +▁身 1025 +SH 1026 +▁cách 1027 +▁كل 1028 +▁sao 1029 +غ 1030 +▁đấy 1031 +ЧИ 1032 +▁vị 1033 +d 1034 +▁ท่าน 1035 +▁s 1036 +ШЕ 1037 +▁ส่วน 1038 +▁vậy 1039 +MENT 1040 +▁又 1041 +▁muốn 1042 +た 1043 +▁等 1044 +ГА 1045 +▁НАС 1046 +め 1047 +EL 1048 +AM 1049 +ДИ 1050 +ัน 1051 +▁khác 1052 +▁CO 1053 +THEY 1054 +▁lý 1055 +RY 1056 +▁СЛОВО 1057 +▁ứng 1058 +▁MA 1059 +DO 1060 +á 1061 +▁ДА 1062 +▁位 1063 +MP 1064 +▁THEN 1065 +OL 1066 +▁นั้น 1067 +НОГО 1068 +▁被 1069 +▁sau 1070 +AKAN 1071 +MO 1072 +▁常 1073 +▁理 1074 +▁วันนี้ 1075 +IK 1076 +ВЫ 1077 +▁bảo 1078 +▁ใคร 1079 +▁لم 1080 +يد 1081 +▁WANT 1082 +thì 1083 +▁ตอนนี้ 1084 +▁机 1085 +▁ลูก 1086 +▁ТРИ 1087 +▁ờ 1088 +PI 1089 +▁信 1090 +▁快 1091 +МУ 1092 +СА 1093 +СТО 1094 +LO 1095 +▁nghiệp 1096 +▁通 1097 +▁SAAT 1098 +▁あり 1099 +▁เพราะ 1100 +▁C 1101 +▁họ 1102 +▁tư 1103 +▁nghìn 1104 +▁安 1105 +▁ขอ 1106 +Э 1107 +НАЯ 1108 +▁ต่อ 1109 +▁RIGHT 1110 +▁lên 1111 +▁SEMBILAN 1112 +▁BECAUSE 1113 +▁BANYAK 1114 +▁てる 1115 +์ 1116 +ИТ 1117 +▁الع 1118 +▁放 1119 +▁第 1120 +▁ЕСЛИ 1121 +▁ทั้ง 1122 +▁tốt 1123 +GE 1124 +ИИ 1125 +▁THESE 1126 +▁khách 1127 +▁ดี 1128 +▁体 1129 +▁phần 1130 +▁TWO 1131 +▁直 1132 +АН 1133 +▁INTO 1134 +ДЕ 1135 +РИ 1136 +anh 1137 +▁bốn 1138 +▁活 1139 +▁HER 1140 +s 1141 +ИН 1142 +▁thường 1143 +▁bao 1144 +▁СЕМЬ 1145 +อง 1146 +ラ 1147 +▁非 1148 +▁cảm 1149 +ที่ 1150 +้น 1151 +KEMUDIAN 1152 +IAN 1153 +عد 1154 +▁度 1155 +AP 1156 +▁độ 1157 +ư 1158 +ЧА 1159 +PU 1160 +ДО 1161 +ち 1162 +▁NO 1163 +▁โดย 1164 +ở 1165 +▁HERE 1166 +▁ALSO 1167 +ИЕ 1168 +▁nhận 1169 +▁美 1170 +ผ 1171 +▁LAIN 1172 +▁水 1173 +▁vẫn 1174 +▁gian 1175 +▁CON 1176 +ير 1177 +▁ป 1178 +▁الس 1179 +TOR 1180 +▁ลง 1181 +さ 1182 +▁الق 1183 +▁เกิด 1184 +▁金 1185 +▁ПЯТЬ 1186 +UNG 1187 +TRI 1188 +UP 1189 +▁НО 1190 +▁كان 1191 +KI 1192 +BE 1193 +▁など 1194 +ИЯ 1195 +▁EMPAT 1196 +▁จังหวัด 1197 +ABLE 1198 +▁r 1199 +THIS 1200 +▁الذي 1201 +て 1202 +BANG 1203 +▁الح 1204 +▁ЕЩЁ 1205 +g 1206 +IR 1207 +▁الج 1208 +▁เข้า 1209 +▁tâm 1210 +e 1211 +▁解 1212 +け 1213 +ЭТО 1214 +▁干 1215 +OK 1216 +عا 1217 +CT 1218 +АХ 1219 +▁เพื่อ 1220 +▁SHE 1221 +▁WAY 1222 +▁ANAK 1223 +▁เดี๋ยว 1224 +ЖЕ 1225 +▁vụ 1226 +АМ 1227 +▁trước 1228 +つ 1229 +▁พระ 1230 +СИ 1231 +SU 1232 +▁kinh 1233 +ệ 1234 +l 1235 +▁tám 1236 +▁bản 1237 +▁quá 1238 +▁วัน 1239 +▁WHICH 1240 +▁像 1241 +BI 1242 +Ц 1243 +▁NOW 1244 +▁SAY 1245 +ั 1246 +▁เจอ 1247 +▁じゃ 1248 +JU 1249 +ITY 1250 +ИЙ 1251 +APA 1252 +▁รับ 1253 +МЫ 1254 +▁d 1255 +▁КОГДА 1256 +▁nữa 1257 +▁điểm 1258 +▁tình 1259 +▁đại 1260 +▁白 1261 +▁đối 1262 +▁هي 1263 +▁KEPADA 1264 +UH 1265 +АЯ 1266 +▁完 1267 +▁rằng 1268 +СО 1269 +đ 1270 +มา 1271 +X 1272 +ATE 1273 +КОВ 1274 +▁友 1275 +ام 1276 +▁性 1277 +▁thích 1278 +รา 1279 +▁thị 1280 +BO 1281 +▁toàn 1282 +TED 1283 +▁更 1284 +DIA 1285 +ست 1286 +ติ 1287 +▁mọi 1288 +▁sống 1289 +УЮ 1290 +▁少 1291 +▁ЧЕТЫРЕ 1292 +▁加 1293 +KO 1294 +▁OVER 1295 +▁MASYARAKAT 1296 +▁thứ 1297 +▁ОНА 1298 +b 1299 +▁chưa 1300 +▁tiếp 1301 +▁hành 1302 +▁住 1303 +▁xuất 1304 +▁死 1305 +▁ông 1306 +ISI 1307 +▁US 1308 +▁MO 1309 +▁SAJA 1310 +РУ 1311 +ЖД 1312 +▁WORK 1313 +GRA 1314 +▁RATUS 1315 +▁JADI 1316 +▁接 1317 +▁sáu 1318 +▁BA 1319 +ЕВ 1320 +ว่า 1321 +▁MELAKUKAN 1322 +▁F 1323 +اس 1324 +▁平 1325 +▁EX 1326 +▁tiền 1327 +▁部 1328 +WHAT 1329 +▁ไว้ 1330 +ЫЙ 1331 +▁ยังไง 1332 +يب 1333 +▁SU 1334 +ัก 1335 +▁SEBAGAI 1336 +▁まで 1337 +▁ออก 1338 +▁tự 1339 +▁時 1340 +▁NEED 1341 +▁หรือ 1342 +▁yêu 1343 +▁tháng 1344 +▁HAL 1345 +ATAN 1346 +وي 1347 +▁เธอ 1348 +▁どう 1349 +▁BUT 1350 +▁BACK 1351 +ซ 1352 +ПЕР 1353 +▁БЫЛ 1354 +▁luôn 1355 +ГИ 1356 +ดี 1357 +▁sĩ 1358 +▁BEGITU 1359 +▁ВОСЕМЬ 1360 +▁dịch 1361 +أن 1362 +CO 1363 +▁الن 1364 +دي 1365 +ANNYA 1366 +▁名 1367 +▁الآن 1368 +ド 1369 +▁phòng 1370 +หน้า 1371 +ЕНИЕ 1372 +▁JAKARTA 1373 +FI 1374 +▁พื้นที่ 1375 +▁triển 1376 +▁海 1377 +▁ไทย 1378 +▁思い 1379 +▁lịch 1380 +THERE 1381 +ฟ 1382 +ИЛ 1383 +IM 1384 +▁RUMAH 1385 +▁tác 1386 +▁ออกมา 1387 +BAN 1388 +ПОЖАЛУЙСТА 1389 +TEN 1390 +▁ที่จะ 1391 +▁คํา 1392 +▁lớn 1393 +▁นํา 1394 +▁ถาม 1395 +▁HANYA 1396 +▁SAID 1397 +▁งาน 1398 +gi 1399 +่ง 1400 +▁thức 1401 +▁THOSE 1402 +ТОР 1403 +▁THINGS 1404 +▁PEMERINTAH 1405 +HU 1406 +▁合 1407 +▁nghĩ 1408 +▁表 1409 +▁TERJADI 1410 +▁千 1411 +ОТ 1412 +BAIK 1413 +EST 1414 +▁ส่ง 1415 +▁mua 1416 +▁HIM 1417 +▁山 1418 +▁à 1419 +▁NANTI 1420 +▁ШЕСТЬ 1421 +اد 1422 +▁日本 1423 +▁khu 1424 +หา 1425 +▁năng 1426 +▁NEW 1427 +▁P 1428 +▁SAMA 1429 +PH 1430 +▁COULD 1431 +VER 1432 +▁x 1433 +▁あ 1434 +▁phương 1435 +▁lượng 1436 +مر 1437 +▁sử 1438 +▁cuộc 1439 +▁DILAKUKAN 1440 +ีย 1441 +BAT 1442 +ION 1443 +▁叫 1444 +ته 1445 +▁き 1446 +▁giới 1447 +PEN 1448 +▁ช่วง 1449 +▁EVERY 1450 +▁หลาย 1451 +ЮТ 1452 +▁เคย 1453 +▁MUNGKIN 1454 +▁あっ 1455 +▁MAKE 1456 +▁trọng 1457 +▁НУ 1458 +ิน 1459 +▁กํา 1460 +ษ 1461 +يل 1462 +▁ลัง 1463 +▁内 1464 +НИМ 1465 +子 1466 +▁入 1467 +▁tăng 1468 +▁ДЕВЯТЬ 1469 +ông 1470 +▁แต่ว่า 1471 +▁du 1472 +chúng 1473 +▁hóa 1474 +▁ВО 1475 +▁保 1476 +▁จํา 1477 +▁姐 1478 +ئ 1479 +งาน 1480 +ؤ 1481 +▁FIRST 1482 +อก 1483 +▁أي 1484 +▁bảy 1485 +▁ЯЗЫК 1486 +TIDAK 1487 +ХО 1488 +▁กระ 1489 +▁ANDA 1490 +▁НОЛЬ 1491 +BAR 1492 +▁เอง 1493 +▁— 1494 +PAK 1495 +▁文 1496 +▁hát 1497 +วง 1498 +▁khó 1499 +DARI 1500 +▁bà 1501 +ANT 1502 +AI 1503 +▁tập 1504 +▁đường 1505 +OT 1506 +▁ТОЛЬКО 1507 +РЫ 1508 +▁do 1509 +▁数 1510 +▁điện 1511 +▁chuyện 1512 +▁告 1513 +▁SANGAT 1514 +АМИ 1515 +▁将 1516 +СУ 1517 +▁なる 1518 +▁MUCH 1519 +شر 1520 +▁早 1521 +▁thu 1522 +▁chủ 1523 +ДЕЛ 1524 +▁kết 1525 +▁tới 1526 +グ 1527 +▁代 1528 +ตา 1529 +FOR 1530 +▁私 1531 +▁РАС 1532 +▁xe 1533 +▁零 1534 +▁PARA 1535 +ائ 1536 +МЕР 1537 +v 1538 +▁văn 1539 +▁ذلك 1540 +ЫЕ 1541 +nhà 1542 +▁ちょっと 1543 +НОВ 1544 +▁bằng 1545 +▁giáo 1546 +▁喜 1547 +▁SAMPAI 1548 +▁nhau 1549 +▁男 1550 +را 1551 +▁g 1552 +▁pháp 1553 +FE 1554 +▁LOT 1555 +ПИ 1556 +▁SEKARANG 1557 +k 1558 +▁giải 1559 +▁СЛОВА 1560 +▁เด็ก 1561 +▁王 1562 +▁ค 1563 +با 1564 +▁なり 1565 +▁ف 1566 +な 1567 +▁ЭТОГО 1568 +НЯ 1569 +▁GOT 1570 +▁交 1571 +▁ДАЖЕ 1572 +ТУ 1573 +ЫХ 1574 +kh 1575 +مة 1576 +▁จุด 1577 +TRA 1578 +▁МОЖНО 1579 +ับ 1580 +▁DID 1581 +ЩЕ 1582 +▁原 1583 +COM 1584 +ПРАВ 1585 +ッ 1586 +ДУ 1587 +▁たら 1588 +▁GOOD 1589 +АЕТ 1590 +▁件 1591 +▁จ 1592 +▁cầu 1593 +▁もう 1594 +▁WHERE 1595 +▁อย่างนี้ 1596 +▁đều 1597 +▁始 1598 +นี้ 1599 +▁ЭТОМ 1600 +▁bình 1601 +▁MAS 1602 +nhưng 1603 +▁SECARA 1604 +LAN 1605 +▁อันนี้ 1606 +ริ 1607 +JI 1608 +▁BARU 1609 +ВЕ 1610 +▁lần 1611 +وس 1612 +▁思 1613 +OP 1614 +GER 1615 +▁hà 1616 +HAN 1617 +▁MELIHAT 1618 +▁受 1619 +▁chức 1620 +こ 1621 +ТЕР 1622 +間 1623 +▁ANY 1624 +▁เหตุการณ์ 1625 +ПЕ 1626 +▁tạo 1627 +▁向 1628 +▁THAN 1629 +▁อาจจะ 1630 +▁trở 1631 +▁もの 1632 +田 1633 +▁ここ 1634 +▁الش 1635 +▁提 1636 +ЯТ 1637 +TY 1638 +▁พูด 1639 +▁SENDIRI 1640 +NOW 1641 +▁nhiên 1642 +▁NEGARA 1643 +▁đổi 1644 +НОЕ 1645 +▁ห 1646 +▁vấn 1647 +بي 1648 +▁ПОТОМУ 1649 +ア 1650 +بر 1651 +V 1652 +ธ 1653 +SEHINGGA 1654 +MB 1655 +▁liên 1656 +▁tính 1657 +▁بين 1658 +ПА 1659 +▁คิด 1660 +ЗНА 1661 +▁PRESIDEN 1662 +▁chị 1663 +▁đúng 1664 +▁ข่าว 1665 +DER 1666 +كم 1667 +▁ph 1668 +▁つ 1669 +تم 1670 +▁UN 1671 +▁世 1672 +HI 1673 +▁たい 1674 +▁口 1675 +НАЙДИ 1676 +▁đình 1677 +ОД 1678 +▁НЕТ 1679 +▁ไหน 1680 +コ 1681 +اب 1682 +▁KIND 1683 +▁đâu 1684 +▁cấp 1685 +قة 1686 +▁bài 1687 +▁truyền 1688 +▁บาท 1689 +▁กา 1690 +▁phẩm 1691 +TAK 1692 +▁СЕЙЧАС 1693 +▁KOTA 1694 +các 1695 +▁MISALNYA 1696 +▁PARTAI 1697 +▁trẻ 1698 +▁เงิน 1699 +▁วิ 1700 +▁vừa 1701 +▁朋 1702 +НЫ 1703 +ớ 1704 +▁mẹ 1705 +▁SOMETHING 1706 +trong 1707 +DENGAN 1708 +TUR 1709 +ХОД 1710 +آ 1711 +دا 1712 +▁tìm 1713 +▁BAGAIMANA 1714 +سم 1715 +فا 1716 +ジ 1717 +▁花 1718 +LANG 1719 +▁TUJUH 1720 +▁КОН 1721 +وت 1722 +СТА 1723 +▁เข้าไป 1724 +▁ENAM 1725 +▁系 1726 +▁ИХ 1727 +صل 1728 +▁وت 1729 +وم 1730 +นา 1731 +МЕН 1732 +OKE 1733 +НЫМ 1734 +▁phố 1735 +ني 1736 +J 1737 +▁TAKE 1738 +EK 1739 +▁dự 1740 +không 1741 +ФИ 1742 +▁mặt 1743 +▁化 1744 +БЫ 1745 +AB 1746 +سي 1747 +ろ 1748 +АЛИ 1749 +▁物 1750 +▁tiếng 1751 +▁ませ 1752 +▁北 1753 +▁quả 1754 +ANGAN 1755 +▁BELUM 1756 +PAN 1757 +▁任 1758 +▁สํา 1759 +▁NGGAK 1760 +1 1761 +WI 1762 +UND 1763 +▁UNDANG 1764 +▁câu 1765 +▁trị 1766 +MER 1767 +СКИЙ 1768 +▁หน่อย 1769 +ПУ 1770 +دة 1771 +▁sạn 1772 +เท 1773 +▁ต่าง 1774 +▁SP 1775 +SEN 1776 +ЕН 1777 +▁ติด 1778 +جر 1779 +PAS 1780 +▁thôi 1781 +ือ 1782 +▁الإ 1783 +▁管 1784 +▁tài 1785 +▁BEING 1786 +▁医 1787 +an 1788 +▁そして 1789 +СЕ 1790 +▁giúp 1791 +▁SEMUA 1792 +HO 1793 +AGE 1794 +▁ngoài 1795 +▁๔ 1796 +رة 1797 +▁เมื่อ 1798 +▁WAKTU 1799 +DIS 1800 +▁ร้าน 1801 +СКОЛЬКО 1802 +▁PO 1803 +▁ฟัง 1804 +▁nội 1805 +▁doanh 1806 +▁・ 1807 +▁ВРЕМЯ 1808 +ЧТО 1809 +▁ГДЕ 1810 +▁期 1811 +АВ 1812 +FUL 1813 +เด 1814 +▁อายุ 1815 +▁lực 1816 +ИХ 1817 +ГУ 1818 +نت 1819 +ظ 1820 +يات 1821 +▁YEARS 1822 +▁WORLD 1823 +▁nh 1824 +▁พา 1825 +▁ТЕБЯ 1826 +▁司 1827 +▁คะ 1828 +PAR 1829 +▁DOWN 1830 +▁品 1831 +ЕТСЯ 1832 +LOW 1833 +▁thật 1834 +หล 1835 +▁tiêu 1836 +СКОГО 1837 +▁反 1838 +▁minh 1839 +▁quý 1840 +▁tổ 1841 +▁เกิดขึ้น 1842 +▁使 1843 +レ 1844 +มือ 1845 +ОБ 1846 +▁ACTUALLY 1847 +ЕЗ 1848 +وال 1849 +▁DELAPAN 1850 +▁TERSEBUT 1851 +▁WARGA 1852 +▁LOOK 1853 +ТРА 1854 +ٌ 1855 +▁chất 1856 +OH 1857 +อบ 1858 +▁quy 1859 +▁BEBERAPA 1860 +▁بعد 1861 +NG 1862 +▁hết 1863 +▁THROUGH 1864 +▁an 1865 +ả 1866 +▁PA 1867 +▁الب 1868 +▁ば 1869 +TAR 1870 +OUR 1871 +ó 1872 +▁ТОЖЕ 1873 +▁xã 1874 +▁เดิน 1875 +้ง 1876 +ยา 1877 +DIRI 1878 +ПРИ 1879 +人 1880 +END 1881 +ود 1882 +SHE 1883 +▁PART 1884 +ء 1885 +НИК 1886 +▁二十 1887 +▁路 1888 +▁حتى 1889 +▁BERSAMA 1890 +JO 1891 +قا 1892 +▁lúc 1893 +كل 1894 +▁sức 1895 +▁SEKALI 1896 +▁nếu 1897 +فر 1898 +▁พบ 1899 +▁教 1900 +▁biệt 1901 +▁立 1902 +▁THING 1903 +ロ 1904 +ИС 1905 +▁元 1906 +НОМ 1907 +БО 1908 +HAM 1909 +▁คดี 1910 +じ 1911 +СКОЙ 1912 +▁ạ 1913 +ên 1914 +フ 1915 +▁ИЛИ 1916 +▁MAU 1917 +▁РЕ 1918 +▁รอ 1919 +قل 1920 +SEBELUM 1921 +▁BAIK 1922 +▁量 1923 +ทาง 1924 +▁เหมือน 1925 +▁算 1926 +▁なく 1927 +در 1928 +DALAM 1929 +ТЬСЯ 1930 +RAN 1931 +ú 1932 +▁เจ้าหน้าที่ 1933 +็ 1934 +▁こちら 1935 +▁LITTLE 1936 +TON 1937 +يق 1938 +▁อ่ะ 1939 +ANCE 1940 +▁ช่วย 1941 +▁LIFE 1942 +▁父 1943 +▁DATA 1944 +▁أنه 1945 +▁ПРЕД 1946 +ТЕЛЬ 1947 +AU 1948 +▁たち 1949 +▁โอ้โห 1950 +▁ONLY 1951 +▁máy 1952 +▁KASUS 1953 +SON 1954 +НУЮ 1955 +▁КОТОРЫЕ 1956 +ระ 1957 +▁ア 1958 +▁ảnh 1959 +▁指 1960 +かっ 1961 +▁WELL 1962 +▁POLITIK 1963 +IVE 1964 +ЖИ 1965 +▁quyết 1966 +ША 1967 +▁БЫЛА 1968 +▁bắt 1969 +▁PENG 1970 +▁บ้าง 1971 +ЛУ 1972 +AC 1973 +▁EVEN 1974 +IST 1975 +▁JAWA 1976 +RUS 1977 +▁FA 1978 +▁ประมาณ 1979 +▁PUNYA 1980 +ЛЮБ 1981 +▁MANY 1982 +เบ 1983 +▁声 1984 +▁ТОГО 1985 +▁เปิด 1986 +▁へ 1987 +キ 1988 +▁KO 1989 +も 1990 +▁清 1991 +▁КО 1992 +▁SHOW 1993 +▁หน้า 1994 +▁命 1995 +▁BESAR 1996 +▁tỉnh 1997 +▁hiệu 1998 +▁B 1999 +ЕШЬ 2000 +ATAU 2001 +▁พ 2002 +▁hoạt 2003 +PUT 2004 +اص 2005 +▁địa 2006 +تك 2007 +GEN 2008 +▁báo 2009 +بد 2010 +▁tham 2011 +TIK 2012 +POS 2013 +LET 2014 +ПЕРЕВЕДИ 2015 +▁đất 2016 +▁xem 2017 +▁МНОГО 2018 +วย 2019 +▁GREAT 2020 +▁dùng 2021 +▁أيضا 2022 +▁やっ 2023 +▁НУЖНО 2024 +РОВ 2025 +لت 2026 +▁thương 2027 +لو 2028 +TIC 2029 +ộ 2030 +▁الر 2031 +▁cậu 2032 +▁与 2033 +ЛЮ 2034 +ОС 2035 +▁hệ 2036 +▁xin 2037 +▁เข้ามา 2038 +▁近 2039 +nếu 2040 +FA 2041 +جن 2042 +Ё 2043 +▁空 2044 +إ 2045 +▁tiên 2046 +▁chương 2047 +▁ai 2048 +อย 2049 +▁hoàn 2050 +▁เหมือนกัน 2051 +้อง 2052 +▁KON 2053 +▁SHOULD 2054 +▁MOST 2055 +▁П 2056 +▁แค่ 2057 +ОР 2058 +อด 2059 +▁眼 2060 +▁THREE 2061 +يم 2062 +▁hôm 2063 +▁ところ 2064 +▁สิ 2065 +▁民 2066 +▁られ 2067 +タ 2068 +TERIMA 2069 +▁房 2070 +BUR 2071 +▁phim 2072 +๒ 2073 +▁こう 2074 +ATED 2075 +WELL 2076 +▁KEMBALI 2077 +СТВО 2078 +▁投 2079 +يش 2080 +▁sách 2081 +ВОТ 2082 +▁消 2083 +▁ТОМ 2084 +РОД 2085 +と 2086 +ร์ 2087 +СТАВ 2088 +▁だっ 2089 +لم 2090 +▁ภาพ 2091 +UNT 2092 +MAS 2093 +UK 2094 +СЬ 2095 +ã 2096 +▁BO 2097 +RED 2098 +ري 2099 +EM 2100 +▁คลิป 2101 +▁ทีนี้ 2102 +▁БЫТЬ 2103 +ương 2104 +PUN 2105 +▁БОЛЬШЕ 2106 +▁đẹp 2107 +APAKAH 2108 +▁ทีม 2109 +قي 2110 +GAL 2111 +SION 2112 +ณ 2113 +▁พ่อ 2114 +MAKA 2115 +▁БЫЛИ 2116 +▁loại 2117 +رب 2118 +▁يمكن 2119 +▁嘛 2120 +▁hỏi 2121 +▁chi 2122 +▁thống 2123 +ИТЕЛЬ 2124 +▁制 2125 +▁LIHAT 2126 +▁thân 2127 +プ 2128 +▁إن 2129 +ơ 2130 +ตร 2131 +TIM 2132 +ธรรม 2133 +АНИЯ 2134 +▁ЭТОТ 2135 +▁MASUK 2136 +▁สามารถ 2137 +▁JALAN 2138 +▁bác 2139 +ЛЕН 2140 +NESS 2141 +DY 2142 +▁mạnh 2143 +DANG 2144 +LESS 2145 +▁WI 2146 +▁chí 2147 +مل 2148 +وك 2149 +NAMUN 2150 +กล 2151 +những 2152 +حل 2153 +チ 2154 +▁สอง 2155 +▁利 2156 +▁МОЖЕТ 2157 +كون 2158 +▁越 2159 +▁服 2160 +MY 2161 +АЛЬ 2162 +▁送 2163 +▁bán 2164 +体 2165 +ВЕД 2166 +▁nghệ 2167 +ПРО 2168 +๊ 2169 +▁chế 2170 +▁光 2171 +▁台 2172 +▁SALAH 2173 +▁望 2174 +КРЫ 2175 +▁diễn 2176 +IES 2177 +SUR 2178 +وف 2179 +▁DIFFERENT 2180 +▁SEBENARNYA 2181 +動 2182 +خط 2183 +ดา 2184 +PO 2185 +ЧУ 2186 +LAND 2187 +อน 2188 +ЕЕ 2189 +▁thi 2190 +▁đưa 2191 +يع 2192 +WHICH 2193 +วา 2194 +▁กลุ่ม 2195 +КОЙ 2196 +▁bố 2197 +PRI 2198 +▁จับ 2199 +▁此 2200 +ミ 2201 +▁الخ 2202 +▁HUKUM 2203 +▁だけ 2204 +▁TEMAN 2205 +qu 2206 +▁cứ 2207 +ฝ 2208 +▁đặc 2209 +▁半 2210 +ХА 2211 +اع 2212 +لة 2213 +▁LA 2214 +SAN 2215 +Щ 2216 +▁持 2217 +СЫ 2218 +АТЬСЯ 2219 +物 2220 +ВОД 2221 +▁MANA 2222 +một 2223 +▁หา 2224 +▁bên 2225 +▁hoặc 2226 +しい 2227 +▁sáng 2228 +▁หมด 2229 +IKAN 2230 +СТВ 2231 +▁cố 2232 +▁เก 2233 +▁HI 2234 +الم 2235 +ALL 2236 +ЦИИ 2237 +TETAPI 2238 +GAR 2239 +▁เยอะ 2240 +オ 2241 +▁أنا 2242 +تر 2243 +▁ca 2244 +AMAN 2245 +АК 2246 +ứ 2247 +СКА 2248 +▁thanh 2249 +▁ولكن 2250 +▁KIRA 2251 +▁ЗНАЮ 2252 +พร 2253 +▁区 2254 +СТЬ 2255 +▁hoa 2256 +СТРА 2257 +▁จน 2258 +▁店 2259 +GET 2260 +طة 2261 +▁เวลา 2262 +СТРО 2263 +▁KASIH 2264 +PT 2265 +▁病 2266 +▁عليه 2267 +▁ทุก 2268 +▁ชาวบ้าน 2269 +▁PRE 2270 +▁でき 2271 +▁เจ้า 2272 +▁giảm 2273 +▁息 2274 +▁ใส่ 2275 +シ 2276 +▁USE 2277 +▁gặp 2278 +▁เอ 2279 +МНЕ 2280 +ニ 2281 +▁ch 2282 +СТАН 2283 +ТАК 2284 +▁号 2285 +▁tất 2286 +▁tục 2287 +▁กิน 2288 +้ม 2289 +▁母 2290 +ИТЕ 2291 +▁الف 2292 +▁phục 2293 +▁MAR 2294 +▁พัก 2295 +▁الص 2296 +БР 2297 +▁HELP 2298 +▁kỳ 2299 +▁RES 2300 +▁ЕЁ 2301 +ДР 2302 +▁trang 2303 +▁หรือเปล่า 2304 +ЁМ 2305 +▁CUKUP 2306 +ONG 2307 +GAN 2308 +АТ 2309 +▁ため 2310 +▁DAERAH 2311 +حق 2312 +▁คุย 2313 +▁需 2314 +КОМ 2315 +▁MAN 2316 +▁بأن 2317 +يت 2318 +ЕСЛИ 2319 +PADA 2320 +▁周 2321 +เต 2322 +АНИЕ 2323 +▁OFF 2324 +HOW 2325 +ประ 2326 +▁必 2327 +ВАЛ 2328 +วน 2329 +جد 2330 +تها 2331 +▁giao 2332 +▁tích 2333 +СК 2334 +▁KALI 2335 +▁đặt 2336 +▁COME 2337 +ENCE 2338 +وق 2339 +طب 2340 +▁ご 2341 +УМ 2342 +حر 2343 +▁PERTAMA 2344 +▁TEMPAT 2345 +▁でしょう 2346 +▁TRANS 2347 +СТВА 2348 +▁BUKAN 2349 +野 2350 +▁cá 2351 +▁bất 2352 +▁でし 2353 +▁院 2354 +▁hồ 2355 +▁失 2356 +หม 2357 +حا 2358 +ブ 2359 +▁ty 2360 +上 2361 +▁vật 2362 +▁اليوم 2363 +▁CAR 2364 +وع 2365 +▁AIR 2366 +▁ВООБЩЕ 2367 +KAT 2368 +▁INGIN 2369 +▁包 2370 +▁火 2371 +LAM 2372 +ДРУГ 2373 +▁สุ 2374 +事 2375 +ウ 2376 +▁TETAP 2377 +เป 2378 +ANGKA 2379 +صر 2380 +ット 2381 +▁基 2382 +▁án 2383 +قر 2384 +▁ВАМ 2385 +▁神 2386 +そ 2387 +▁整 2388 +WHEN 2389 +JE 2390 +▁nông 2391 +▁底 2392 +ลา 2393 +▁เรียก 2394 +ความ 2395 +▁دول 2396 +CUL 2397 +ALLY 2398 +▁หรือว่า 2399 +▁政 2400 +▁ВАС 2401 +▁ПАР 2402 +ผล 2403 +▁كانت 2404 +ứng 2405 +رد 2406 +▁ตั้งแต่ 2407 +حي 2408 +▁وأ 2409 +▁chuyển 2410 +▁سي 2411 +لي 2412 +▁城 2413 +▁อ 2414 +▁ตอน 2415 +VING 2416 +気 2417 +ВАТЬ 2418 +▁ตรวจสอบ 2419 +▁لكن 2420 +เจ 2421 +รี 2422 +▁建 2423 +SER 2424 +▁今日 2425 +▁MENGE 2426 +▁เพื่อน 2427 +▁SIH 2428 +يين 2429 +▁thêm 2430 +▁条 2431 +OB 2432 +まっ 2433 +▁HINGGA 2434 +び 2435 +OM 2436 +げ 2437 +▁đồ 2438 +HER 2439 +▁はい 2440 +▁商 2441 +▁求 2442 +▁cảnh 2443 +▁ใช่ไหม 2444 +▁共 2445 +หน 2446 +エ 2447 +せ 2448 +đây 2449 +場 2450 +هذا 2451 +LAR 2452 +▁ВОЗ 2453 +▁ข้าง 2454 +ДЕР 2455 +DIK 2456 +▁ด้าน 2457 +NU 2458 +ЁТ 2459 +▁يكون 2460 +AKU 2461 +THANK 2462 +để 2463 +ЕЦ 2464 +ِّ 2465 +รุ 2466 +MAT 2467 +▁gần 2468 +CUR 2469 +▁選手 2470 +▁ХОЧУ 2471 +ARAN 2472 +JANGAN 2473 +▁thủ 2474 +▁OWN 2475 +▁DULU 2476 +▁ตัวเอง 2477 +▁COMP 2478 +REN 2479 +▁流 2480 +ЦА 2481 +ШИ 2482 +▁ВИД 2483 +عة 2484 +▁TAHU 2485 +trường 2486 +СКЕ 2487 +TRO 2488 +▁ไปดู 2489 +▁อา 2490 +ОЕ 2491 +POL 2492 +▁往 2493 +ăng 2494 +ОНА 2495 +▁JE 2496 +スト 2497 +SUS 2498 +▁TELAH 2499 +๙ 2500 +▁ซื้อ 2501 +▁หลัง 2502 +メ 2503 +УТ 2504 +АЮТ 2505 +▁สี 2506 +▁bây 2507 +▁كما 2508 +ИВ 2509 +▁県 2510 +vì 2511 +▁ไง 2512 +ナ 2513 +▁mang 2514 +▁つい 2515 +IAL 2516 +▁บน 2517 +LES 2518 +▁PAN 2519 +حال 2520 +▁gọi 2521 +▁ЛЕТ 2522 +AAN 2523 +▁vi 2524 +ذا 2525 +ば 2526 +▁MEMBUAT 2527 +НИЙ 2528 +ЩИ 2529 +▁thiết 2530 +КАЗ 2531 +▁สิ่ง 2532 +khi 2533 +ph 2534 +НЕЙ 2535 +▁娘 2536 +VA 2537 +▁弟 2538 +cô 2539 +▁đông 2540 +▁nghe 2541 +▁PUT 2542 +▁BAGI 2543 +▁ПОЛ 2544 +▁TERUS 2545 +▁nơi 2546 +PL 2547 +MON 2548 +ญ 2549 +▁HIGH 2550 +▁待 2551 +▁СЕГОДНЯ 2552 +LED 2553 +ภาพ 2554 +▁ЧЕМ 2555 +ENG 2556 +▁MALAM 2557 +▁CA 2558 +ГОД 2559 +▁取 2560 +▁الك 2561 +▁POINT 2562 +LING 2563 +ANA 2564 +▁SINI 2565 +ัย 2566 +▁จัด 2567 +SY 2568 +BY 2569 +▁hiểu 2570 +مي 2571 +▁ban 2572 +▁至 2573 +▁است 2574 +ИЮ 2575 +FORM 2576 +▁より 2577 +▁後 2578 +▁กลับ 2579 +▁โรงพยาบาล 2580 +▁婚 2581 +سر 2582 +▁ประชาชน 2583 +▁tay 2584 +ЕД 2585 +▁إذا 2586 +SAR 2587 +CTION 2588 +▁夫 2589 +SC 2590 +▁tiểu 2591 +▁mỗi 2592 +▁BIASA 2593 +▁故 2594 +TES 2595 +BAHKAN 2596 +▁KEDUA 2597 +▁เสียชีวิต 2598 +ЦЕ 2599 +ВОЙ 2600 +▁色 2601 +รูป 2602 +▁ش 2603 +▁PIHAK 2604 +▁FIND 2605 +▁ตรง 2606 +▁thay 2607 +เม 2608 +ิด 2609 +OUS 2610 +âm 2611 +LINE 2612 +▁phí 2613 +▁ФИЛЬМ 2614 +▁tuổi 2615 +▁ГОРОД 2616 +БИ 2617 +▁КОТОРЫЙ 2618 +يك 2619 +وجود 2620 +PRO 2621 +カ 2622 +بة 2623 +▁首 2624 +УЧ 2625 +STA 2626 +▁vực 2627 +▁ขาย 2628 +▁PROSES 2629 +▁式 2630 +▁LANGSUNG 2631 +が 2632 +ARTINYA 2633 +▁MENGA 2634 +▁南 2635 +▁đơn 2636 +▁MEAN 2637 +▁sở 2638 +▁START 2639 +▁影 2640 +เข 2641 +هو 2642 +▁đánh 2643 +▁COVID 2644 +КОН 2645 +هي 2646 +اف 2647 +ố 2648 +▁ใหม่ 2649 +▁いき 2650 +áo 2651 +๖ 2652 +▁ยิง 2653 +▁ต้น 2654 +เงิน 2655 +VEN 2656 +▁ولا 2657 +▁程 2658 +▁SA 2659 +▁hướng 2660 +ТРИ 2661 +عود 2662 +em 2663 +กร 2664 +▁อ่า 2665 +▁นิ 2666 +YEAH 2667 +▁lời 2668 +▁ТЕБЕ 2669 +▁ห้อง 2670 +เก 2671 +▁演 2672 +▁วันที่ 2673 +▁النظام 2674 +í 2675 +▁LUAR 2676 +▁LOVE 2677 +▁FIVE 2678 +สา 2679 +▁khá 2680 +COR 2681 +SEMENTARA 2682 +قد 2683 +▁hạn 2684 +▁LALU 2685 +عمل 2686 +▁НАМ 2687 +▁nguyên 2688 +เรือ 2689 +▁AFTER 2690 +ối 2691 +マ 2692 +ГЕ 2693 +▁nhiêu 2694 +БОР 2695 +▁โดน 2696 +▁音 2697 +▁照 2698 +เช 2699 +▁ください 2700 +بار 2701 +БЛ 2702 +▁STILL 2703 +▁ТАКОЙ 2704 +▁КАКОЙ 2705 +▁客 2706 +ชาติ 2707 +リー 2708 +▁CHANGE 2709 +เรียน 2710 +RING 2711 +คล 2712 +▁BEFORE 2713 +▁PROGRAM 2714 +ọ 2715 +tuy 2716 +▁DOING 2717 +่อ 2718 +DEN 2719 +SES 2720 +▁قبل 2721 +AY 2722 +ИТЬСЯ 2723 +▁TERHADAP 2724 +▁بعض 2725 +▁准 2726 +DAY 2727 +BUNG 2728 +DING 2729 +ЧИТ 2730 +KAR 2731 +ฮ 2732 +ック 2733 +▁WAR 2734 +▁ПОСЛЕ 2735 +▁AROUND 2736 +▁笑 2737 +GG 2738 +手 2739 +f 2740 +▁深 2741 +▁ТЕМ 2742 +▁雨 2743 +▁ครอบครัว 2744 +ЛЕТ 2745 +كر 2746 +▁СКАЗАЛ 2747 +АЕТСЯ 2748 +▁JOKOWI 2749 +▁界 2750 +دو 2751 +EX 2752 +BAGAIMANA 2753 +▁biến 2754 +▁SOAL 2755 +ù 2756 +▁KETIKA 2757 +▁มาจาก 2758 +BEL 2759 +EVER 2760 +ЫМ 2761 +▁dẫn 2762 +力 2763 +▁MIGHT 2764 +▁集 2765 +▁บริเวณ 2766 +▁سوريا 2767 +CL 2768 +ДАВАЙ 2769 +行 2770 +▁カ 2771 +ến 2772 +▁支 2773 +КАКАЯ 2774 +▁КТО 2775 +ti 2776 +▁改 2777 +سا 2778 +木 2779 +▁БЕЗ 2780 +▁いっ 2781 +نة 2782 +▁เอาไว้ 2783 +▁mỹ 2784 +ДОБ 2785 +▁nhìn 2786 +▁ผ่าน 2787 +▁СТОИТ 2788 +▁便 2789 +TEM 2790 +é 2791 +WAS 2792 +開 2793 +วด 2794 +▁SAME 2795 +▁ประเทศ 2796 +POLI 2797 +وات 2798 +رس 2799 +▁考 2800 +▁SEKITAR 2801 +▁เห 2802 +▁REAL 2803 +む 2804 +THEN 2805 +▁mấy 2806 +▁lợi 2807 +وه 2808 +ПРОС 2809 +▁MAY 2810 +ЛСЯ 2811 +ビ 2812 +УЗ 2813 +КОЛ 2814 +▁ที่ผ่านมา 2815 +▁ВСЕГО 2816 +ê 2817 +РАН 2818 +phim 2819 +▁ก็ได้ 2820 +▁DAY 2821 +MEREKA 2822 +ARY 2823 +▁đủ 2824 +НИЕ 2825 +ธิ 2826 +سب 2827 +KEN 2828 +▁感じ 2829 +cái 2830 +▁ПОКА 2831 +ụ 2832 +TAL 2833 +▁HAND 2834 +เหตุ 2835 +▁khoảng 2836 +▁nhỏ 2837 +▁mất 2838 +▁TELL 2839 +▁MADE 2840 +WHERE 2841 +ợ 2842 +СМОТР 2843 +▁AGAIN 2844 +▁れる 2845 +▁cứu 2846 +▁phụ 2847 +▁ตั้ง 2848 +▁á 2849 +▁初 2850 +بت 2851 +▁trợ 2852 +▁PLACE 2853 +▁いく 2854 +RAH 2855 +▁PUN 2856 +ITAS 2857 +▁未 2858 +▁НИХ 2859 +▁นัก 2860 +ЖИВ 2861 +▁chứ 2862 +قال 2863 +يف 2864 +▁SET 2865 +▁IBU 2866 +定 2867 +川 2868 +▁chiến 2869 +▁段 2870 +ДЖ 2871 +業 2872 +YE 2873 +thế 2874 +sau 2875 +▁المتحدة 2876 +وج 2877 +▁เริ่ม 2878 +▁時間 2879 +▁قد 2880 +▁อุ 2881 +БУ 2882 +▁tra 2883 +LAY 2884 +▁食 2885 +อา 2886 +▁実 2887 +Ъ 2888 +2 2889 +▁BULAN 2890 +▁từng 2891 +▁MEDIA 2892 +▁หนู 2893 +JAR 2894 +WAN 2895 +ЕК 2896 +ế 2897 +หนึ่ง 2898 +▁YEAR 2899 +▁KORBAN 2900 +▁พล 2901 +▁khí 2902 +ลง 2903 +▁MEMBERIKAN 2904 +テ 2905 +▁dục 2906 +ولا 2907 +▁たり 2908 +中 2909 +▁khỏe 2910 +▁นา 2911 +▁cổ 2912 +▁KOM 2913 +НЕТ 2914 +▁また 2915 +่าง 2916 +▁FEEL 2917 +▁هل 2918 +▁bé 2919 +▁留 2920 +БЕ 2921 +YES 2922 +々 2923 +СТАР 2924 +TAS 2925 +НЕЕ 2926 +▁والم 2927 +إن 2928 +強 2929 +SING 2930 +▁liệu 2931 +ЕТЬ 2932 +▁يت 2933 +ò 2934 +▁chọn 2935 +▁GIVE 2936 +▁คัน 2937 +▁ОСТА 2938 +RANG 2939 +▁字 2940 +▁luật 2941 +▁nhập 2942 +▁đội 2943 +คืน 2944 +ДЫ 2945 +ПЛАТ 2946 +▁cửa 2947 +ツ 2948 +▁DIDN 2949 +ПОЛ 2950 +ダ 2951 +▁kiến 2952 +▁せ 2953 +СКОМ 2954 +▁الرئيس 2955 +▁ТУТ 2956 +เว 2957 +▁科 2958 +LOG 2959 +▁宝 2960 +ВИД 2961 +ไม้ 2962 +TURE 2963 +▁mở 2964 +كي 2965 +▁vô 2966 +▁เชื่อ 2967 +له 2968 +▁根 2969 +▁chu 2970 +▁นี่แหละ 2971 +▁chứng 2972 +STER 2973 +▁TALK 2974 +ЕННО 2975 +ALI 2976 +ใหญ่ 2977 +▁KESEHATAN 2978 +▁الدولة 2979 +▁chơi 2980 +vâng 2981 +▁nghĩa 2982 +▁警 2983 +▁TENGAH 2984 +▁片 2985 +度 2986 +▁เล่า 2987 +BECAUSE 2988 +รัก 2989 +▁tiết 2990 +ราช 2991 +▁تت 2992 +▁ليس 2993 +▁み 2994 +SELAMAT 2995 +SEPERTI 2996 +NS 2997 +▁DAPAT 2998 +نفس 2999 +▁あと 3000 +ケ 3001 +▁tiến 3002 +ATIONS 3003 +▁FOUR 3004 +▁วัด 3005 +خل 3006 +IH 3007 +▁由 3008 +KAH 3009 +▁官 3010 +KER 3011 +▁dựng 3012 +▁ยา 3013 +▁giả 3014 +nó 3015 +▁chung 3016 +▁عام 3017 +▁السوري 3018 +▁PRA 3019 +▁vệ 3020 +▁trí 3021 +جز 3022 +فق 3023 +▁กร 3024 +▁НАДО 3025 +▁ТАКЖЕ 3026 +๔ 3027 +▁急 3028 +ЗИ 3029 +▁kiểm 3030 +БОЛЬШ 3031 +▁自分 3032 +▁สัก 3033 +▁技 3034 +▁เสียง 3035 +▁أكثر 3036 +▁PALING 3037 +อร์ 3038 +▁แจ้ง 3039 +▁xây 3040 +TAIN 3041 +СТР 3042 +▁FACT 3043 +百 3044 +▁酒 3045 +DES 3046 +ết 3047 +CON 3048 +▁นั่ง 3049 +▁เสีย 3050 +نظر 3051 +НОСТИ 3052 +NY 3053 +BAHWA 3054 +▁容 3055 +▁tượng 3056 +เน 3057 +แรง 3058 +▁غير 3059 +UAN 3060 +▁NEVER 3061 +▁BARAT 3062 +▁đá 3063 +▁社 3064 +▁気 3065 +ได้ 3066 +ず 3067 +▁PERSON 3068 +SIS 3069 +حزب 3070 +▁กลับมา 3071 +▁ตรงนี้ 3072 +▁展 3073 +▁TOO 3074 +BUK 3075 +▁บาง 3076 +▁思っ 3077 +SALAH 3078 +▁HO 3079 +▁PLAN 3080 +▁MULAI 3081 +NER 3082 +ТЯ 3083 +▁thuật 3084 +▁LONG 3085 +OUT 3086 +▁形 3087 +▁الشعب 3088 +▁ЭТИ 3089 +3 3090 +دع 3091 +▁สาย 3092 +ЦИ 3093 +▁quyền 3094 +▁แรก 3095 +TAM 3096 +▁ДЕ 3097 +▁ตลอด 3098 +INE 3099 +▁หรับ 3100 +РАЗ 3101 +PS 3102 +ЛИСЬ 3103 +KAMI 3104 +▁喝 3105 +CHE 3106 +CER 3107 +▁BIG 3108 +PORT 3109 +▁سيد 3110 +MAR 3111 +▁وم 3112 +ICAL 3113 +▁chú 3114 +อม 3115 +▁khiến 3116 +▁lập 3117 +▁玩 3118 +▁ПРЕ 3119 +RASI 3120 +▁PERLU 3121 +▁ござい 3122 +CAP 3123 +bài 3124 +سل 3125 +部 3126 +▁ЧЕЛОВЕК 3127 +▁món 3128 +▁hưởng 3129 +حد 3130 +EF 3131 +▁SCHOOL 3132 +▁khoa 3133 +SERTA 3134 +▁ได้รับ 3135 +▁ATAS 3136 +OS 3137 +เล 3138 +MIS 3139 +CAR 3140 +ТУР 3141 +▁円 3142 +АЛА 3143 +▁DOES 3144 +▁救 3145 +БЕР 3146 +▁ต่อไป 3147 +▁ЛЮДИ 3148 +▁สุดท้าย 3149 +هل 3150 +ラン 3151 +地 3152 +เค 3153 +HAL 3154 +▁PROBLEM 3155 +تي 3156 +LALU 3157 +▁希 3158 +▁DEPAN 3159 +JAK 3160 +▁差 3161 +hãy 3162 +員 3163 +الي 3164 +وما 3165 +СТЕ 3166 +OKAY 3167 +▁k 3168 +▁ตก 3169 +x 3170 +КЛЮЧ 3171 +SELAIN 3172 +สน 3173 +▁MEMILIKI 3174 +قض 3175 +▁bỏ 3176 +▁ทําไม 3177 +▁案 3178 +▁李 3179 +từ 3180 +▁ЯЗЫКЕ 3181 +สง 3182 +▁ITS 3183 +LIGHT 3184 +▁バ 3185 +▁TERKAIT 3186 +分 3187 +▁SELAMA 3188 +▁cây 3189 +▁THOUSAND 3190 +▁العالم 3191 +▁КОНЕЧНО 3192 +▁พร้อม 3193 +KING 3194 +▁SYSTEM 3195 +▁xử 3196 +▁苦 3197 +▁LAST 3198 +▁พยายาม 3199 +▁đời 3200 +طر 3201 +▁chia 3202 +اش 3203 +AG 3204 +▁FOUND 3205 +ГОТОВ 3206 +▁نحن 3207 +▁なん 3208 +▁العراق 3209 +CLE 3210 +ВИН 3211 +АЙ 3212 +内 3213 +▁خلال 3214 +صد 3215 +ự 3216 +▁สาร 3217 +مت 3218 +BRI 3219 +▁IDEA 3220 +▁وي 3221 +▁lâu 3222 +▁BOOK 3223 +日 3224 +HOR 3225 +▁หาย 3226 +▁فيها 3227 +ДЕТ 3228 +▁QUESTION 3229 +▁لك 3230 +▁ПА 3231 +5 3232 +فعل 3233 +НОСТЬ 3234 +▁できる 3235 +▁cuối 3236 +แท 3237 +EIGHT 3238 +صف 3239 +▁WEEK 3240 +BIN 3241 +УС 3242 +▁AM 3243 +▁突 3244 +▁น่าจะ 3245 +▁ngay 3246 +▁ВОЗДУХА 3247 +CY 3248 +ổ 3249 +▁แก 3250 +▁trả 3251 +▁viện 3252 +▁bởi 3253 +▁WHY 3254 +АЦИИ 3255 +CENT 3256 +๓ 3257 +▁ทั้งหมด 3258 +▁ГОРОДА 3259 +▁答 3260 +▁chuyên 3261 +ЦИЯ 3262 +DAM 3263 +▁ДЕНЬ 3264 +علم 3265 +▁ngành 3266 +ム 3267 +ЖА 3268 +▁ข้อ 3269 +سو 3270 +▁СТРАН 3271 +▁NIH 3272 +▁句 3273 +en 3274 +CR 3275 +▁格 3276 +تحدث 3277 +▁khai 3278 +ИШЬ 3279 +جميع 3280 +▁三十 3281 +▁降 3282 +▁gây 3283 +ТРЕ 3284 +จริง 3285 +▁ล้าน 3286 +▁挺 3287 +▁CARE 3288 +▁林 3289 +▁เมื่อวาน 3290 +▁LET 3291 +OF 3292 +▁東京 3293 +▁phạm 3294 +▁triệu 3295 +▁そんな 3296 +ลาย 3297 +料 3298 +▁UMUM 3299 +▁DIPER 3300 +СП 3301 +บ้าน 3302 +ขา 3303 +▁CAME 3304 +ОНИ 3305 +▁歌 3306 +▁EM 3307 +▁mạng 3308 +هر 3309 +▁الد 3310 +▁รัฐ 3311 +MED 3312 +▁NUMBER 3313 +▁เดือน 3314 +▁及 3315 +▁nhanh 3316 +مع 3317 +▁ทุกคน 3318 +長 3319 +▁PLAY 3320 +▁หมอ 3321 +▁CALL 3322 +島 3323 +▁БО 3324 +ARI 3325 +▁ขนาด 3326 +MUN 3327 +PIR 3328 +▁阿 3329 +هذه 3330 +وح 3331 +علي 3332 +DAR 3333 +اج 3334 +▁TWENTY 3335 +âu 3336 +▁ลุง 3337 +▁切 3338 +AKSI 3339 +▁thuốc 3340 +▁HOME 3341 +họ 3342 +▁hộ 3343 +▁微 3344 +▁夜 3345 +ЦЫ 3346 +جا 3347 +RATE 3348 +اني 3349 +▁AD 3350 +▁นึง 3351 +FO 3352 +▁示 3353 +▁rõ 3354 +勝 3355 +▁なかっ 3356 +ート 3357 +▁MENGATAKAN 3358 +▁الأمر 3359 +▁AJA 3360 +ГОР 3361 +SUDAH 3362 +▁ДВЕ 3363 +▁สม 3364 +▁ШТО 3365 +▁ผู้ชาย 3366 +▁อําเภอ 3367 +OLEH 3368 +▁精 3369 +▁ซ 3370 +ГЛАВ 3371 +▁dễ 3372 +▁GA 3373 +ЁН 3374 +▁بشكل 3375 +NDA 3376 +▁เมือง 3377 +ЖУ 3378 +ライ 3379 +ФЕ 3380 +▁ЭТУ 3381 +ТОВ 3382 +▁dài 3383 +МЕСТ 3384 +مثل 3385 +đó 3386 +▁ผู้หญิง 3387 +▁СЕБЯ 3388 +あ 3389 +ASAN 3390 +ГЛА 3391 +▁đạo 3392 +ЛОСЬ 3393 +生 3394 +デ 3395 +▁MASA 3396 +БЕС 3397 +▁股 3398 +ừ 3399 +▁PERNAH 3400 +▁GONNA 3401 +رى 3402 +KRI 3403 +ボ 3404 +▁ちゃん 3405 +JUMLAH 3406 +▁追 3407 +PING 3408 +▁注 3409 +▁๖ 3410 +▁đa 3411 +▁功 3412 +念 3413 +▁CASE 3414 +НИЯ 3415 +RAP 3416 +聞 3417 +▁mức 3418 +出 3419 +▁坐 3420 +▁THOUGHT 3421 +▁เนิน 3422 +أت 3423 +▁END 3424 +ガ 3425 +▁NEXT 3426 +รถ 3427 +▁HUNDRED 3428 +▁TODAY 3429 +▁khăn 3430 +▁ALWAYS 3431 +ネ 3432 +▁di 3433 +يح 3434 +▁càng 3435 +▁ИСПОЛНИТЕЛЯ 3436 +▁UNDER 3437 +▁易 3438 +WITH 3439 +ВОР 3440 +دين 3441 +▁WA 3442 +WIN 3443 +▁睡 3444 +▁สําคัญ 3445 +ЕТЕ 3446 +▁本当 3447 +ЦЕН 3448 +ЮТСЯ 3449 +▁APP 3450 +BANYAK 3451 +止 3452 +làm 3453 +や 3454 +ЧЕТ 3455 +イン 3456 +▁thái 3457 +وة 3458 +ô 3459 +▁แฟน 3460 +حم 3461 +نسب 3462 +▁DATANG 3463 +▁trưởng 3464 +MEM 3465 +ền 3466 +يعني 3467 +ХОРОШ 3468 +รง 3469 +▁BENAR 3470 +ュ 3471 +VO 3472 +JUST 3473 +ど 3474 +ั้น 3475 +▁ชาย 3476 +▁MENYE 3477 +TIVE 3478 +▁CALLED 3479 +OD 3480 +▁福 3481 +احت 3482 +ПОТОМУ 3483 +MUDAH 3484 +▁so 3485 +▁局 3486 +▁BI 3487 +▁БОЛЕЕ 3488 +ИЧЕСКИ 3489 +NOT 3490 +▁PENTING 3491 +▁ANOTHER 3492 +▁ПОТОМ 3493 +ỏ 3494 +PAT 3495 +สม 3496 +فت 3497 +▁青 3498 +ぶ 3499 +GUN 3500 +▁MENGGUNAKAN 3501 +▁quản 3502 +▁ดํา 3503 +▁そこ 3504 +СЛЕД 3505 +▁肯 3506 +li 3507 +▁言 3508 +RIGHT 3509 +▁INTER 3510 +▁kế 3511 +ể 3512 +جه 3513 +▁nổi 3514 +SEL 3515 +يه 3516 +▁ВОПРОС 3517 +▁倒 3518 +▁ЛЮДЕЙ 3519 +▁MASALAH 3520 +▁SANA 3521 +▁kiện 3522 +ИРОВАН 3523 +▁КАР 3524 +เพ 3525 +▁ร้าย 3526 +РАБОТ 3527 +▁khả 3528 +▁土 3529 +رق 3530 +▁すごい 3531 +ФОРМ 3532 +ВАЛИ 3533 +▁IMPORTANT 3534 +ัว 3535 +TENTU 3536 +▁マ 3537 +▁phi 3538 +ละ 3539 +ภา 3540 +▁戦 3541 +▁tuần 3542 +▁疑 3543 +▁害 3544 +▁sát 3545 +ذكر 3546 +НЮ 3547 +▁bàn 3548 +▁HUMAN 3549 +▁พิ 3550 +▁ปรากฏ 3551 +▁giữ 3552 +▁味 3553 +لب 3554 +СТАТ 3555 +▁ตรวจ 3556 +▁TIM 3557 +▁nữ 3558 +▁chuẩn 3559 +người 3560 +かけ 3561 +▁けれど 3562 +ai 3563 +▁VIDEO 3564 +▁به 3565 +ذلك 3566 +▁chắc 3567 +4 3568 +مال 3569 +เรื่อง 3570 +モ 3571 +▁ИМЕННО 3572 +thưa 3573 +▁นาง 3574 +ИР 3575 +▁nhật 3576 +LIS 3577 +RT 3578 +▁เดินทาง 3579 +ข้าว 3580 +▁ВОС 3581 +用 3582 +MUNGKIN 3583 +▁DUNIA 3584 +▁足 3585 +▁考え 3586 +ЩА 3587 +ี่ 3588 +▁mùa 3589 +▁ТЕМПЕРАТУРУ 3590 +CING 3591 +▁hòa 3592 +▁ข้อมูล 3593 +ЛАД 3594 +DAPAT 3595 +▁مت 3596 +▁НИ 3597 +ДАН 3598 +▁ถ่าย 3599 +▁เล่น 3600 +از 3601 +▁อาการ 3602 +ENTER 3603 +ПОЛУЧ 3604 +▁màu 3605 +▁nghiệm 3606 +▁РАБОТА 3607 +ЛОЖ 3608 +▁ましょう 3609 +育 3610 +▁ЭТОЙ 3611 +PRES 3612 +МИН 3613 +LIKE 3614 +▁МОГУ 3615 +PANG 3616 +ОВА 3617 +▁POWER 3618 +▁写 3619 +ИК 3620 +▁ปืน 3621 +▁tử 3622 +▁ชาว 3623 +▁W 3624 +▁hạ 3625 +▁UNDERSTAND 3626 +▁แห่ง 3627 +ПРЕ 3628 +ường 3629 +▁แห 3630 +KAP 3631 +▁vui 3632 +SHIP 3633 +COL 3634 +▁hãy 3635 +ЦИЮ 3636 +▁tối 3637 +theo 3638 +▁الط 3639 +▁yếu 3640 +▁เก็บ 3641 +▁لن 3642 +▁giữa 3643 +▁慢 3644 +ЕГО 3645 +СУД 3646 +▁布 3647 +▁SAKIT 3648 +หลัก 3649 +ХИ 3650 +▁ร่วม 3651 +ISH 3652 +▁KEMARIN 3653 +أس 3654 +▁KONDISI 3655 +เป็น 3656 +▁却 3657 +WHILE 3658 +▁KPK 3659 +CREA 3660 +FER 3661 +▁発 3662 +▁OLD 3663 +▁兄 3664 +ИЛА 3665 +▁SETELAH 3666 +▁ก่อเหตุ 3667 +่น 3668 +จา 3669 +УЧА 3670 +ước 3671 +▁落 3672 +أعتقد 3673 +ЯН 3674 +▁له 3675 +ピ 3676 +▁ศพ 3677 +POR 3678 +ند 3679 +▁NAME 3680 +▁ฝั่ง 3681 +屋 3682 +ROW 3683 +▁KELUARGA 3684 +CHA 3685 +КОР 3686 +ДУМ 3687 +อาหาร 3688 +▁ถนน 3689 +فة 3690 +صالح 3691 +PIL 3692 +ОЧНО 3693 +▁นาน 3694 +▁随 3695 +KIN 3696 +GAS 3697 +RAL 3698 +だ 3699 +PUR 3700 +▁НЕГО 3701 +ОТКРОЙ 3702 +▁SUB 3703 +▁ДОМА 3704 +СС 3705 +▁ล่ะ 3706 +giá 3707 +▁MERUPAKAN 3708 +▁思う 3709 +جم 3710 +▁خ 3711 +▁ЦЕНТР 3712 +РОС 3713 +▁น้อย 3714 +▁低 3715 +▁まず 3716 +▁TIMUR 3717 +ĩ 3718 +▁phân 3719 +▁vùng 3720 +▁لأن 3721 +▁ชุด 3722 +▁السياسي 3723 +▁DR 3724 +▁KAR 3725 +دل 3726 +点 3727 +▁ผิด 3728 +حب 3729 +ARAH 3730 +FF 3731 +ЬЯ 3732 +▁nhiệm 3733 +FU 3734 +▁ХОТЕЛ 3735 +▁LIVE 3736 +▁ДВАДЦАТЬ 3737 +▁ชน 3738 +ANDA 3739 +▁السياسية 3740 +▁SEBUAH 3741 +連 3742 +▁huy 3743 +合 3744 +SATU 3745 +้าง 3746 +▁thoại 3747 +فل 3748 +肉 3749 +▁diện 3750 +ИНА 3751 +НЫМИ 3752 +ЙТИ 3753 +▁OPEN 3754 +▁PASTI 3755 +TERUS 3756 +HAR 3757 +▁أخرى 3758 +▁MEMPER 3759 +▁ดูแล 3760 +หลัง 3761 +СОТ 3762 +▁京 3763 +▁ومن 3764 +ЛЕНИЕ 3765 +БУДЬ 3766 +▁AKU 3767 +▁STATE 3768 +ВКЛЮЧИ 3769 +ngày 3770 +ХОЧУ 3771 +▁超 3772 +▁党 3773 +▁อย่า 3774 +▁ฝ่าย 3775 +▁đấu 3776 +▁مصر 3777 +ầm 3778 +▁INFORMASI 3779 +▁عبد 3780 +状 3781 +بع 3782 +▁ИНФОРМАЦИЮ 3783 +SOME 3784 +ISM 3785 +ЕР 3786 +▁โพสต์ 3787 +ベ 3788 +▁志 3789 +WAR 3790 +ฉ 3791 +面 3792 +▁biển 3793 +▁参 3794 +▁CALON 3795 +▁HEALTH 3796 +▁ปลา 3797 +ВАР 3798 +▁LO 3799 +▁DESA 3800 +▁皆 3801 +LIHAT 3802 +ール 3803 +▁ВИДЕО 3804 +▁MBAK 3805 +QU 3806 +▁phá 3807 +JIKA 3808 +▁ที่สุด 3809 +็ด 3810 +▁เส 3811 +▁đạt 3812 +▁BETUL 3813 +ТОМ 3814 +HY 3815 +MAYBE 3816 +▁担 3817 +ЛЫ 3818 +▁君 3819 +▁SAYS 3820 +ki 3821 +▁АНГЛИЙСКИЙ 3822 +▁ตอบ 3823 +وض 3824 +НЬ 3825 +▁FAR 3826 +TERMASUK 3827 +PAL 3828 +لكن 3829 +اح 3830 +▁星 3831 +▁ที่อยู่ 3832 +▁lao 3833 +حة 3834 +▁أم 3835 +▁PUBLIC 3836 +▁ตี 3837 +▁الحكومة 3838 +▁BETTER 3839 +РЕД 3840 +ัญ 3841 +EP 3842 +▁食べ 3843 +セ 3844 +▁ปา 3845 +▁già 3846 +広 3847 +▁SEJUMLAH 3848 +▁推 3849 +BAK 3850 +▁SUPPORT 3851 +▁عندما 3852 +▁العام 3853 +กฎหมาย 3854 +▁朝 3855 +▁COURSE 3856 +▁dụ 3857 +เซ 3858 +▁世界 3859 +▁linh 3860 +GR 3861 +▁คุณแม่ 3862 +ИТСЯ 3863 +▁tương 3864 +khách 3865 +าน 3866 +▁КАКИЕ 3867 +▁فقط 3868 +er 3869 +WHO 3870 +وار 3871 +▁ยืนยัน 3872 +▁lấy 3873 +▁ГОДА 3874 +▁HARD 3875 +▁あの 3876 +PED 3877 +▁MEMBER 3878 +ВЕТ 3879 +КОГО 3880 +ُّ 3881 +▁รา 3882 +غا 3883 +رت 3884 +قو 3885 +ôi 3886 +▁ТАКИЕ 3887 +▁ИН 3888 +KAU 3889 +▁站 3890 +▁石 3891 +▁lo 3892 +▁الث 3893 +ดู 3894 +香 3895 +بل 3896 +つけ 3897 +ТАКИ 3898 +RON 3899 +تنا 3900 +مكن 3901 +▁ผล 3902 +اض 3903 +▁nguyễn 3904 +MES 3905 +ัต 3906 +▁ร้อง 3907 +على 3908 +r 3909 +EMPAT 3910 +ОБРА 3911 +現 3912 +NING 3913 +▁ชื่อ 3914 +機 3915 +AGA 3916 +▁ЧЕРЕЗ 3917 +رض 3918 +▁ДОБР 3919 +sa 3920 +ФА 3921 +NILAI 3922 +BAH 3923 +残 3924 +▁ใบ 3925 +▁造 3926 +▁兵 3927 +える 3928 +▁車 3929 +اعت 3930 +▁播 3931 +ชน 3932 +議 3933 +▁trò 3934 +▁ตา 3935 +▁象 3936 +▁ВАШ 3937 +▁やっぱり 3938 +者 3939 +СКАЯ 3940 +▁装 3941 +▁НАЧАЛ 3942 +▁الأمن 3943 +ポ 3944 +قول 3945 +▁สร้าง 3946 +▁cộng 3947 +▁xa 3948 +▁僕 3949 +▁PAGI 3950 +▁تكون 3951 +▁MONEY 3952 +上げ 3953 +▁話 3954 +ТЕЛЬНО 3955 +وجه 3956 +▁uống 3957 +ЦИОН 3958 +本 3959 +КУП 3960 +ROOM 3961 +▁xác 3962 +KSI 3963 +▁ระหว่าง 3964 +اه 3965 +جي 3966 +RS 3967 +常 3968 +▁受け 3969 +ที 3970 +ân 3971 +BAS 3972 +دم 3973 +▁đáng 3974 +▁背 3975 +▁chiếc 3976 +วัน 3977 +▁ず 3978 +▁duy 3979 +▁NAMANYA 3980 +▁願い 3981 +MENG 3982 +▁quán 3983 +▁ВСЕХ 3984 +▁今回 3985 +TIN 3986 +▁ПЕРЕВОД 3987 +▁giống 3988 +▁mưa 3989 +▁nghị 3990 +▁جدا 3991 +▁РОССИИ 3992 +▁敢 3993 +▁続い 3994 +ย์ 3995 +▁DONE 3996 +DUA 3997 +РЯД 3998 +▁thần 3999 +وقف 4000 +▁BOLEH 4001 +▁nhớ 4002 +▁nguồn 4003 +KEM 4004 +▁กลาง 4005 +USAHA 4006 +НЕМ 4007 +▁hỗ 4008 +▁久 4009 +▁防 4010 +▁ハ 4011 +ị 4012 +TIS 4013 +ần 4014 +ВОЛ 4015 +▁BERADA 4016 +เหลือ 4017 +دور 4018 +RIS 4019 +CAN 4020 +ВАН 4021 +ズ 4022 +▁tranh 4023 +入れ 4024 +ORANG 4025 +▁ขับ 4026 +СКИЕ 4027 +СТУ 4028 +▁板 4029 +ИЛСЯ 4030 +HARI 4031 +▁НИЧЕГО 4032 +ЕНИИ 4033 +ター 4034 +▁hiểm 4035 +اك 4036 +▁وأن 4037 +▁ทอง 4038 +ОСТЬ 4039 +▁trạng 4040 +▁ค่า 4041 +ВОЗМОЖНО 4042 +▁TENTANG 4043 +▁СКАЗАТЬ 4044 +▁ơn 4045 +州 4046 +BAL 4047 +▁ST 4048 +è 4049 +▁คู่ 4050 +КС 4051 +▁trời 4052 +▁ANTARA 4053 +▁ราย 4054 +▁НАПРИМЕР 4055 +▁อยู่แล้ว 4056 +▁قال 4057 +ТРО 4058 +EVEN 4059 +▁สว 4060 +AHAN 4061 +АНТ 4062 +山 4063 +▁อืม 4064 +قبل 4065 +ЖЕН 4066 +حكم 4067 +▁thư 4068 +まり 4069 +ئة 4070 +PP 4071 +▁ลํา 4072 +▁ТАКОЕ 4073 +▁إيران 4074 +إذ 4075 +TCH 4076 +PON 4077 +▁รู้สึก 4078 +ื้อ 4079 +▁JAM 4080 +お 4081 +НИКА 4082 +ПРОЕКТ 4083 +▁LAW 4084 +▁EACH 4085 +▁PUBLIK 4086 +▁球 4087 +▁mai 4088 +ARE 4089 +▁MENDAPATKAN 4090 +وز 4091 +MENY 4092 +▁เกิดเหตุ 4093 +▁СРЕДНЮЮ 4094 +وط 4095 +▁nhạc 4096 +LIN 4097 +است 4098 +▁ДУМАЮ 4099 +▁đóng 4100 +▁ลา 4101 +▁TINGGI 4102 +نق 4103 +▁الذين 4104 +▁存 4105 +KENAPA 4106 +▁CNN 4107 +▁riêng 4108 +▁DPR 4109 +▁HOUSE 4110 +▁بل 4111 +กรรม 4112 +▁パ 4113 +hai 4114 +▁GOD 4115 +АЮ 4116 +PANJANG 4117 +▁เลือก 4118 +عل 4119 +▁xảy 4120 +▁WENT 4121 +▁lệ 4122 +ВУ 4123 +▁歳 4124 +ИРОВАТЬ 4125 +▁quay 4126 +▁áp 4127 +hi 4128 +▁เครื่อง 4129 +▁xuống 4130 +▁KEEP 4131 +ủ 4132 +▁НАЙДИ 4133 +▁เป็นการ 4134 +▁lăm 4135 +يز 4136 +FIN 4137 +▁tức 4138 +BB 4139 +▁言っ 4140 +ta 4141 +▁СДЕЛАТЬ 4142 +▁TENTU 4143 +لق 4144 +▁忙 4145 +▁BELIEVE 4146 +ิก 4147 +れる 4148 +▁cụ 4149 +▁LEVEL 4150 +يس 4151 +▁tố 4152 +▁AWAL 4153 +下 4154 +▁châu 4155 +▁SELURUH 4156 +▁هنا 4157 +▁ลักษณะ 4158 +年 4159 +▁CONS 4160 +▁đảm 4161 +▁สะ 4162 +SAAT 4163 +▁ít 4164 +▁phong 4165 +▁ชอบ 4166 +▁ใหญ่ 4167 +ATOR 4168 +▁يجب 4169 +▁GE 4170 +mà 4171 +▁ПОГОДЫ 4172 +JEN 4173 +INA 4174 +ДОЛ 4175 +▁KETUA 4176 +РЕН 4177 +▁SECOND 4178 +РЕШ 4179 +▁ДОБРАТЬСЯ 4180 +ca 4181 +BAGI 4182 +風 4183 +▁เสร็จ 4184 +会 4185 +▁BETWEEN 4186 +▁СЕБЕ 4187 +▁入っ 4188 +ГДЕ 4189 +▁CARA 4190 +CES 4191 +▁みたい 4192 +▁怪 4193 +▁ТРЕК 4194 +▁長 4195 +▁SORT 4196 +対 4197 +来 4198 +وان 4199 +関 4200 +▁ngàn 4201 +の 4202 +แดง 4203 +▁sẻ 4204 +▁phủ 4205 +▁TEST 4206 +▁BIT 4207 +ЕЛЬ 4208 +▁chỗ 4209 +RAT 4210 +▁المت 4211 +NAS 4212 +▁mốt 4213 +LON 4214 +▁tên 4215 +▁断 4216 +▁БУ 4217 +激 4218 +ПРЕДСТАВ 4219 +LANJUT 4220 +▁KERJA 4221 +▁停 4222 +WARD 4223 +شكل 4224 +▁bay 4225 +▁يقول 4226 +▁trực 4227 +РУС 4228 +بدأ 4229 +ITIES 4230 +▁biểu 4231 +BUKAN 4232 +▁chống 4233 +景 4234 +▁楚 4235 +▁МОЙ 4236 +НОС 4237 +▁助 4238 +▁治 4239 +▁tổng 4240 +ШЛИ 4241 +▁КОР 4242 +▁العربية 4243 +▁FEW 4244 +นั้น 4245 +▁PENGA 4246 +FIR 4247 +خر 4248 +КАН 4249 +▁若 4250 +ARD 4251 +بط 4252 +▁DOESN 4253 +تنظيم 4254 +▁ВСЕГДА 4255 +▁ПОСТАВЬ 4256 +▁นอน 4257 +▁俺 4258 +CHI 4259 +РУЖ 4260 +رأي 4261 +▁إسرائيل 4262 +▁kể 4263 +▁班 4264 +▁พวก 4265 +▁ชัย 4266 +▁SEPULUH 4267 +▁ЭТА 4268 +VIS 4269 +▁わけ 4270 +نس 4271 +เวลา 4272 +TANG 4273 +NIGHT 4274 +▁САМО 4275 +▁ЕМУ 4276 +▁士 4277 +▁MASING 4278 +▁亮 4279 +▁cực 4280 +▁冷 4281 +▁buổi 4282 +ВСЕ 4283 +▁GOVERNMENT 4284 +СКИХ 4285 +LEG 4286 +▁nhá 4287 +BENTUK 4288 +▁ติดตาม 4289 +▁付 4290 +▁破 4291 +▁لها 4292 +▁MOMENT 4293 +CEPAT 4294 +ТОГДА 4295 +▁BEST 4296 +▁МОМЕНТ 4297 +▁SIN 4298 +礼 4299 +▁尽 4300 +▁ล่าสุด 4301 +▁ЭТИМ 4302 +▁tu 4303 +SEBETULNYA 4304 +見 4305 +أم 4306 +▁bóng 4307 +室 4308 +▁بم 4309 +限 4310 +▁守 4311 +ЗОВ 4312 +▁妹 4313 +▁ХОРОШО 4314 +ẹ 4315 +IONS 4316 +▁SEDANG 4317 +▁tinh 4318 +صح 4319 +▁МАРШРУТ 4320 +▁いや 4321 +▁đoạn 4322 +▁EXPERIENCE 4323 +MEMANG 4324 +▁СЕР 4325 +دعم 4326 +▁ใจ 4327 +▁ngân 4328 +▁lòng 4329 +ЛОВ 4330 +▁衣 4331 +▁ปิด 4332 +ЗАВТРА 4333 +▁ДОМ 4334 +▁武 4335 +▁HEAR 4336 +bạn 4337 +べ 4338 +▁หัว 4339 +ХОТЯ 4340 +▁คนร้าย 4341 +東 4342 +▁เหรอ 4343 +هد 4344 +▁およそ 4345 +▁皇 4346 +với 4347 +▁quân 4348 +▁وهو 4349 +▁黄 4350 +▁БУДУТ 4351 +▁kỹ 4352 +ソ 4353 +ื่อ 4354 +สด 4355 +▁الدول 4356 +МЕТ 4357 +決 4358 +SETELAH 4359 +▁แน่ 4360 +STI 4361 +6 4362 +КТ 4363 +▁SUCH 4364 +تش 4365 +▁الل 4366 +عن 4367 +▁รอบ 4368 +ПАР 4369 +شي 4370 +▁こ 4371 +เย็น 4372 +ップ 4373 +▁สั่ง 4374 +AIR 4375 +▁เจ้าของ 4376 +▁bắc 4377 +DON 4378 +▁คง 4379 +▁ПОГОДА 4380 +▁江 4381 +▁trái 4382 +جل 4383 +▁lắm 4384 +НИБУДЬ 4385 +ЛАСЬ 4386 +民 4387 +▁สาม 4388 +ôn 4389 +▁BUSINESS 4390 +ภูมิ 4391 +▁省 4392 +ТАМ 4393 +▁dung 4394 +国 4395 +JUNG 4396 +▁英 4397 +▁khoản 4398 +WAKIL 4399 +▁hải 4400 +▁PERCENT 4401 +RIES 4402 +▁NEWS 4403 +▁ทราบ 4404 +▁la 4405 +▁فيه 4406 +▁くれ 4407 +ИНТЕРЕС 4408 +ปาก 4409 +قب 4410 +حت 4411 +▁đức 4412 +▁ชีวิต 4413 +▁ПОЭТОМУ 4414 +▁nguy 4415 +BRA 4416 +▁ครู 4417 +▁刻 4418 +▁thiên 4419 +▁dành 4420 +▁具 4421 +▁くる 4422 +▁المنطقة 4423 +▁คอ 4424 +STRU 4425 +คน 4426 +▁hoạch 4427 +▁BOTH 4428 +▁STORY 4429 +ẩn 4430 +レー 4431 +๋ 4432 +▁JUTA 4433 +๊ก 4434 +▁môi 4435 +▁nghỉ 4436 +YAITU 4437 +tại 4438 +ตั้ง 4439 +LIC 4440 +ba 4441 +ختلف 4442 +ضم 4443 +▁除 4444 +▁奇 4445 +سلم 4446 +▁xu 4447 +▁USED 4448 +ăn 4449 +▁MENURUT 4450 +▁画 4451 +出し 4452 +▁ละ 4453 +▁HEAD 4454 +ุม 4455 +do 4456 +型 4457 +▁الناس 4458 +▁ขี่ 4459 +▁APAKAH 4460 +▁เพราะฉะนั้น 4461 +▁二人 4462 +МАН 4463 +▁米 4464 +▁mắt 4465 +▁ながら 4466 +がっ 4467 +▁TEN 4468 +يار 4469 +▁ФИЛИАЛА 4470 +玉 4471 +ВЕСТИ 4472 +САД 4473 +休 4474 +▁โค 4475 +КОГДА 4476 +▁SEORANG 4477 +0 4478 +▁ศรี 4479 +側 4480 +▁gái 4481 +عيد 4482 +▁lớp 4483 +▁PRABOWO 4484 +là 4485 +▁kí 4486 +BIS 4487 +ЬЕ 4488 +▁lưu 4489 +LONG 4490 +▁REASON 4491 +▁แก้ 4492 +قت 4493 +ГРЕ 4494 +hiện 4495 +YO 4496 +▁khẩu 4497 +理 4498 +▁ลอง 4499 +▁môn 4500 +СИЛ 4501 +▁引 4502 +▁SEJAK 4503 +▁mục 4504 +ออก 4505 +ЕСТЬ 4506 +ارات 4507 +ACH 4508 +ДЕВ 4509 +▁サ 4510 +ЛИБО 4511 +▁AWAY 4512 +▁เออ 4513 +PLE 4514 +▁ありがとう 4515 +ORY 4516 +▁ơ 4517 +▁EXAMPLE 4518 +▁WILAYAH 4519 +▁đoàn 4520 +ISASI 4521 +▁GROUP 4522 +ご 4523 +หมาย 4524 +NANTI 4525 +▁ถือว่า 4526 +▁sang 4527 +▁EKONOMI 4528 +ENSI 4529 +▁TERAKHIR 4530 +لف 4531 +KUR 4532 +ИГРА 4533 +ХУ 4534 +QUI 4535 +▁HASIL 4536 +▁mô 4537 +АНА 4538 +كا 4539 +IDE 4540 +ORS 4541 +▁الأس 4542 +▁cung 4543 +رج 4544 +BAWA 4545 +РОЖ 4546 +ỗ 4547 +▁みんな 4548 +▁chẳng 4549 +رغ 4550 +▁thuộc 4551 +▁SIAPA 4552 +▁ДЕЛАТЬ 4553 +▁tưởng 4554 +▁HAR 4555 +▁NEGERI 4556 +زي 4557 +تهم 4558 +▁phút 4559 +عب 4560 +▁SELALU 4561 +▁แอ 4562 +قتل 4563 +ATING 4564 +立 4565 +БАН 4566 +▁หนัก 4567 +СТАЛ 4568 +ペ 4569 +حاول 4570 +็ก 4571 +▁こんな 4572 +AF 4573 +書 4574 +ดิน 4575 +▁ไฟ 4576 +STE 4577 +تلك 4578 +dạ 4579 +قام 4580 +ЛЁ 4581 +ЕДИ 4582 +БИРА 4583 +เลี้ยง 4584 +▁ฉัน 4585 +▁RASA 4586 +ね 4587 +زم 4588 +IV 4589 +▁ЛУЧШЕ 4590 +СОВ 4591 +اط 4592 +▁GAME 4593 +BUN 4594 +▁配 4595 +▁لي 4596 +KET 4597 +▁ma 4598 +▁สา 4599 +▁KABUPATEN 4600 +▁ПОЧЕМУ 4601 +BISA 4602 +MENURUT 4603 +▁MIND 4604 +نظام 4605 +VAL 4606 +إذا 4607 +▁MENTERI 4608 +▁chào 4609 +▁SAM 4610 +▁企 4611 +▁เดียว 4612 +▁MOBIL 4613 +ПР 4614 +▁شيء 4615 +▁بها 4616 +▁ГОДУ 4617 +ราคา 4618 +ล่า 4619 +СКО 4620 +▁วิ่ง 4621 +▁DKI 4622 +ЗЕМ 4623 +còn 4624 +КРЕ 4625 +เปลี่ยน 4626 +居 4627 +▁vận 4628 +BERARTI 4629 +فضل 4630 +ОБЩ 4631 +ПЛА 4632 +▁chịu 4633 +ЧЬ 4634 +▁quảng 4635 +▁sư 4636 +ضع 4637 +ضا 4638 +▁nền 4639 +▁إلا 4640 +▁ยก 4641 +▁SEMPAT 4642 +رك 4643 +รู้ 4644 +▁SEKOLAH 4645 +▁đô 4646 +▁ฟ 4647 +▁عمل 4648 +バ 4649 +ПУСТИ 4650 +良 4651 +حصل 4652 +▁なら 4653 +▁สภาพ 4654 +▁แน่นอน 4655 +▁КАЖЕТСЯ 4656 +MULAI 4657 +طو 4658 +▁器 4659 +▁БУДУ 4660 +CAL 4661 +▁ญาติ 4662 +▁以上 4663 +▁phù 4664 +▁きょう 4665 +إسلام 4666 +▁น่า 4667 +▁独 4668 +on 4669 +▁SOSIAL 4670 +▁เพิ่ม 4671 +VERS 4672 +▁НОМЕР 4673 +АЛЬНО 4674 +▁عند 4675 +▁TOP 4676 +▁รท 4677 +▁สามี 4678 +مح 4679 +▁الأميركية 4680 +KIR 4681 +LOKASI 4682 +▁TOGETHER 4683 +ТЕПЕРЬ 4684 +▁LAMA 4685 +外 4686 +KON 4687 +供 4688 +w 4689 +STAN 4690 +TASI 4691 +▁取り 4692 +▁MOVE 4693 +واضح 4694 +道 4695 +▁thiện 4696 +▁منذ 4697 +بعض 4698 +▁เป็นเรื่อง 4699 +▁幸 4700 +ZA 4701 +ữ 4702 +▁САМОМ 4703 +بعد 4704 +▁LOOKING 4705 +STRA 4706 +▁الز 4707 +▁เลข 4708 +罪 4709 +ồ 4710 +▁ربما 4711 +▁ตอนนั้น 4712 +WO 4713 +QUE 4714 +▁よく 4715 +ЗЫ 4716 +▁ثم 4717 +TAHAN 4718 +▁hoàng 4719 +KS 4720 +غير 4721 +▁МАГАЗИН 4722 +▁DISAMPAIKAN 4723 +▁SIX 4724 +▁静 4725 +قاد 4726 +▁松 4727 +SET 4728 +▁وفي 4729 +▁行っ 4730 +أو 4731 +مس 4732 +▁cáo 4733 +ét 4734 +เมือง 4735 +虽 4736 +▁ประเด็น 4737 +7 4738 +▁BECOME 4739 +判 4740 +وضع 4741 +▁SURE 4742 +報 4743 +▁ПРИМЕР 4744 +▁ОСОБ 4745 +TEL 4746 +SERV 4747 +RAM 4748 +▁KAWASAN 4749 +SIR 4750 +校 4751 +▁กลัว 4752 +ぎ 4753 +่อง 4754 +▁BICARA 4755 +▁犯 4756 +ПИТ 4757 +▁FAMILY 4758 +▁to 4759 +PETUGAS 4760 +▁dù 4761 +▁ภรรยา 4762 +ЕХАТЬ 4763 +▁เล 4764 +TERN 4765 +▁พิธี 4766 +▁ロシア 4767 +線 4768 +▁وهذا 4769 +▁ACT 4770 +▁หนี 4771 +8 4772 +▁บุญ 4773 +▁ký 4774 +สาร 4775 +SAL 4776 +دول 4777 +▁มิ 4778 +▁نعم 4779 +▁WHOLE 4780 +座 4781 +TADI 4782 +▁ほど 4783 +اخت 4784 +عتقد 4785 +▁داخل 4786 +▁รักษา 4787 +% 4788 +МОР 4789 +TERNYATA 4790 +▁danh 4791 +▁ТАКАЯ 4792 +▁บา 4793 +▁JOB 4794 +▁TALKING 4795 +▁มอง 4796 +▁血 4797 +▁МЕСТА 4798 +แต่ 4799 +НИЮ 4800 +ノ 4801 +▁ครั้ง 4802 +▁phổ 4803 +СТРОЙ 4804 +▁РАЙОН 4805 +▁العربي 4806 +ส่วน 4807 +เร 4808 +▁الولايات 4809 +▁toán 4810 +MIL 4811 +▁ぐらい 4812 +▁ただ 4813 +▁CREATE 4814 +▁حق 4815 +حيث 4816 +▁أحد 4817 +CAT 4818 +▁chăm 4819 +▁chân 4820 +ЕНЬ 4821 +SESUAI 4822 +▁ADANYA 4823 +IYA 4824 +▁رئيس 4825 +HOLD 4826 +▁ASK 4827 +▁وبالتالي 4828 +FT 4829 +ЧЕР 4830 +ga 4831 +ỉ 4832 +▁สาว 4833 +СТВУ 4834 +كان 4835 +MUR 4836 +組 4837 +ちゃ 4838 +واجه 4839 +▁НАХОДИТСЯ 4840 +ジャ 4841 +ВЕЛИ 4842 +ИЛЬ 4843 +▁cháu 4844 +▁ลูกชาย 4845 +▁vọng 4846 +に 4847 +▁HARGA 4848 +▁tỷ 4849 +▁เหมือนกับ 4850 +BIT 4851 +千 4852 +▁lạ 4853 +НЕР 4854 +▁曾 4855 +ハ 4856 +▁TRYING 4857 +▁nhu 4858 +▁PAY 4859 +SIGN 4860 +▁หลักฐาน 4861 +KES 4862 +▁MENE 4863 +▁nhóm 4864 +ВАЯ 4865 +▁cạnh 4866 +▁互 4867 +▁PROCESS 4868 +ì 4869 +▁BAPAK 4870 +井 4871 +▁REPORT 4872 +ИЛИСЬ 4873 +察 4874 +عز 4875 +▁НЕСКОЛЬКО 4876 +▁夏 4877 +▁ไทยรัฐ 4878 +▁ที่มา 4879 +ضر 4880 +▁あれ 4881 +▁ЯЗЫКА 4882 +富 4883 +ДЕЙ 4884 +▁姑 4885 +例 4886 +▁السيد 4887 +АЕМ 4888 +ЛИЦ 4889 +▁COUNTRY 4890 +▁rộng 4891 +▁HAVING 4892 +▁ПРОГНОЗ 4893 +▁МЕСТО 4894 +▁hồi 4895 +▁đau 4896 +▁率 4897 +▁РУК 4898 +▁lạc 4899 +▁AREA 4900 +▁nuôi 4901 +進 4902 +ادي 4903 +HEN 4904 +ДУТ 4905 +▁SEVEN 4906 +JUAL 4907 +แต่ง 4908 +▁ATAUPUN 4909 +ВОЕ 4910 +DEKAT 4911 +毛 4912 +جاه 4913 +ふ 4914 +ПОМОГИ 4915 +HAT 4916 +قص 4917 +▁gửi 4918 +逃 4919 +▁الغ 4920 +▁STARTED 4921 +وأ 4922 +НИКИ 4923 +▁密 4924 +▁PI 4925 +▁SERVICE 4926 +パ 4927 +نية 4928 +▁BAGIAN 4929 +入 4930 +▁ПРЯМ 4931 +ชื่อ 4932 +▁争 4933 +شكر 4934 +▁PASS 4935 +▁أنت 4936 +▁المصري 4937 +FRA 4938 +MAH 4939 +▁TURN 4940 +▁拍 4941 +▁КОТОРАЯ 4942 +▁LAINNYA 4943 +ОРГАН 4944 +▁nghề 4945 +vậy 4946 +ПЛО 4947 +▁dạy 4948 +IBLE 4949 +▁CLOSE 4950 +إلى 4951 +▁ví 4952 +▁รอง 4953 +IP 4954 +▁ยุ 4955 +▁GETTING 4956 +▁JAUH 4957 +شار 4958 +URAN 4959 +đừng 4960 +УР 4961 +明 4962 +ัส 4963 +▁番 4964 +MAK 4965 +▁SPEAK 4966 +ПЛ 4967 +▁اليمن 4968 +ra 4969 +▁bước 4970 +КАМ 4971 +▁thiếu 4972 +▁МЕТРО 4973 +▁温 4974 +▁雪 4975 +GUL 4976 +MATI 4977 +▁派 4978 +الية 4979 +AW 4980 +KETIKA 4981 +ШУ 4982 +▁叔 4983 +เห็น 4984 +▁tiện 4985 +WAY 4986 +ХОДИТ 4987 +HERE 4988 +▁AKHIRNYA 4989 +ЮСЬ 4990 +▁UDAH 4991 +LER 4992 +KINI 4993 +▁อื่น 4994 +▁للم 4995 +▁КЛАСС 4996 +▁โลก 4997 +▁รัฐบาล 4998 +症 4999 +กลาง 5000 +乱 5001 +▁MELALUI 5002 +▁lan 5003 +▁伝え 5004 +نحن 5005 +▁令 5006 +▁ภาค 5007 +ZE 5008 +▁RELA 5009 +▁NAMA 5010 +êu 5011 +▁究 5012 +▁จอด 5013 +ồng 5014 +ひ 5015 +▁BANG 5016 +جماع 5017 +ต์ 5018 +ถึง 5019 +่าย 5020 +▁cha 5021 +КРО 5022 +▁府 5023 +СТЕР 5024 +▁NASIONAL 5025 +▁tú 5026 +ИСТ 5027 +IZE 5028 +شك 5029 +素 5030 +▁đôi 5031 +▁速 5032 +河 5033 +▁آخر 5034 +ЬЮ 5035 +▁ตาย 5036 +TAHU 5037 +無 5038 +▁PANDEMI 5039 +▁COMMUNITY 5040 +▁ชา 5041 +▁AMERICAN 5042 +بات 5043 +สุ 5044 +أخ 5045 +ほ 5046 +▁xong 5047 +▁РЕСТОРАН 5048 +UPAYA 5049 +▁เกี่ยวกับ 5050 +▁WORKING 5051 +▁ДЕЛЕ 5052 +▁BLACK 5053 +▁ไม่ต้อง 5054 +▁โรงเรียน 5055 +▁SETIAP 5056 +▁الوطني 5057 +BOR 5058 +▁khỏi 5059 +KOM 5060 +▁phúc 5061 +委 5062 +ワ 5063 +▁يوم 5064 +▁JELAS 5065 +▁PRODUK 5066 +าะ 5067 +▁忘 5068 +▁LEFT 5069 +▁sơn 5070 +▁アメリカ 5071 +СКИ 5072 +永 5073 +▁mong 5074 +GRO 5075 +▁kiểu 5076 +ภัย 5077 +▁JU 5078 +ПИС 5079 +▁PRESIDENT 5080 +▁تع 5081 +cậu 5082 +▁置 5083 +▁ПОЕЗД 5084 +EV 5085 +عاد 5086 +▁五十 5087 +▁春 5088 +APALAGI 5089 +جعل 5090 +▁LARGE 5091 +ЧЕМ 5092 +ียง 5093 +▁克 5094 +RENCANA 5095 +ПУСК 5096 +cho 5097 +ЛИН 5098 +▁ร้อย 5099 +PUL 5100 +▁村 5101 +▁古 5102 +หญิง 5103 +▁ผู้ตาย 5104 +حمل 5105 +BL 5106 +AMBIL 5107 +▁tây 5108 +▁控 5109 +身 5110 +▁НАВЕРНОЕ 5111 +▁MAUPUN 5112 +▁LEARN 5113 +▁似 5114 +NGGAK 5115 +属 5116 +▁RESEARCH 5117 +▁ПЕСНЮ 5118 +▁vũ 5119 +▁ПЛАН 5120 +▁旅 5121 +▁ЖИЗНИ 5122 +退 5123 +▁ЕЩЕ 5124 +▁角 5125 +▁เอก 5126 +▁đào 5127 +▁สูง 5128 +大 5129 +ЧЁ 5130 +▁BEGIN 5131 +▁YOUNG 5132 +親 5133 +ДАР 5134 +▁SENSE 5135 +▁โควิด 5136 +HIR 5137 +▁كيف 5138 +كثير 5139 +เสียง 5140 +▁xanh 5141 +▁研 5142 +▁ANYTHING 5143 +▁CITY 5144 +MENTS 5145 +▁ไอ้ 5146 +يط 5147 +أما 5148 +▁МОСК 5149 +▁จํานวน 5150 +群 5151 +▁الأميركي 5152 +▁INFORMATION 5153 +▁SITU 5154 +عرب 5155 +▁AGAR 5156 +選 5157 +▁อาจารย์ 5158 +▁左 5159 +▁AUSTRALIA 5160 +方 5161 +▁كبير 5162 +▁อัน 5163 +▁ด้วยกัน 5164 +▁phía 5165 +ولكن 5166 +GAK 5167 +БОЛ 5168 +DIC 5169 +▁SAYING 5170 +▁られる 5171 +CIP 5172 +街 5173 +ro 5174 +ORGAN 5175 +دكتور 5176 +سياسي 5177 +▁สุด 5178 +BON 5179 +洗 5180 +АЛИСЬ 5181 +điều 5182 +ذهب 5183 +GH 5184 +▁đà 5185 +▁IM 5186 +▁ПЕРЕД 5187 +▁LISTEN 5188 +▁FREE 5189 +▁油 5190 +รับ 5191 +ОСТИ 5192 +▁โทร 5193 +ề 5194 +แจ 5195 +▁เตรียม 5196 +SAMA 5197 +▁สอบ 5198 +▁TIMES 5199 +▁انت 5200 +痛 5201 +МОЖЕТ 5202 +ADI 5203 +МАТ 5204 +牛 5205 +منطق 5206 +▁SOCIAL 5207 +斯 5208 +軍 5209 +▁الشر 5210 +▁СТАТИСТИКУ 5211 +شهد 5212 +ให้ 5213 +▁mời 5214 +BEDA 5215 +▁đầy 5216 +ИКИ 5217 +▁PASAR 5218 +遇 5219 +จะ 5220 +thứ 5221 +▁sắc 5222 +▁vài 5223 +▁НОВО 5224 +▁ขน 5225 +▁ART 5226 +ЦЕЛ 5227 +▁ДЕЛА 5228 +تدخل 5229 +بك 5230 +▁covid 5231 +▁ท่า 5232 +右 5233 +境 5234 +ก่อน 5235 +طل 5236 +▁หลังจาก 5237 +▁ВРЕМЕНИ 5238 +КРИ 5239 +SUPAYA 5240 +▁dưới 5241 +乗 5242 +وية 5243 +▁แสดง 5244 +LOS 5245 +▁KURANG 5246 +▁hậu 5247 +هؤلاء 5248 +▁إليه 5249 +発 5250 +مسؤول 5251 +▁ENOUGH 5252 +▁ปกติ 5253 +▁GROW 5254 +▁TUH 5255 +▁ТЕМПЕРАТУРЕ 5256 +РАБ 5257 +eo 5258 +修 5259 +จิต 5260 +PLA 5261 +藤 5262 +KALI 5263 +BOARD 5264 +BUL 5265 +▁ฝน 5266 +▁じゃあ 5267 +TERA 5268 +▁phép 5269 +▁suy 5270 +اق 5271 +▁بأ 5272 +ЯХ 5273 +ียน 5274 +▁UANG 5275 +▁PEMILU 5276 +الذي 5277 +▁WANTED 5278 +ขึ้น 5279 +ぐ 5280 +▁SIDE 5281 +VAKSIN 5282 +▁أنها 5283 +別 5284 +كما 5285 +عي 5286 +▁trà 5287 +ГРОМ 5288 +▁đêm 5289 +▁รายการ 5290 +迎 5291 +مسألة 5292 +ไม่ 5293 +承 5294 +票 5295 +移 5296 +КСТАТИ 5297 +خرج 5298 +LIK 5299 +▁SEBAGAINYA 5300 +▁เพลง 5301 +ELI 5302 +▁FORM 5303 +産 5304 +ั่น 5305 +学 5306 +ШКИ 5307 +خارج 5308 +▁السل 5309 +▁sớm 5310 +صار 5311 +船 5312 +しく 5313 +▁ลงมา 5314 +ЫВАЕТ 5315 +xin 5316 +▁أمام 5317 +БИР 5318 +▁lễ 5319 +PEC 5320 +ลม 5321 +داد 5322 +▁الان 5323 +菜 5324 +▁عليها 5325 +ทุน 5326 +▁ضد 5327 +▁RUPIAH 5328 +لذلك 5329 +曲 5330 +▁PELAKU 5331 +IB 5332 +INVEST 5333 +▁ngủ 5334 +▁WITHOUT 5335 +務 5336 +▁SMALL 5337 +AKIBAT 5338 +كت 5339 +ДЕРЖА 5340 +▁đăng 5341 +AZ 5342 +FL 5343 +▁ORDER 5344 +้อน 5345 +وفي 5346 +ПАЛ 5347 +ЛЕНИЯ 5348 +▁とき 5349 +▁ช่วยเหลือ 5350 +ชีวิต 5351 +BUS 5352 +陪 5353 +▁gắng 5354 +▁DEMO 5355 +▁ชั้น 5356 +ELECT 5357 +ОМУ 5358 +▁ฝาก 5359 +▁ngoại 5360 +СИСТЕМ 5361 +▁เกิน 5362 +▁SIANG 5363 +▁ТЫСЯЧ 5364 +LEBIH 5365 +عبر 5366 +席 5367 +▁เช้า 5368 +▁nóng 5369 +▁บุรี 5370 +FRI 5371 +▁lẽ 5372 +ЗАНИМА 5373 +▁KELUAR 5374 +TIME 5375 +▁AGAINST 5376 +ЧИН 5377 +▁KATA 5378 +庭 5379 +TOM 5380 +▁CLEAR 5381 +予 5382 +SUL 5383 +อากาศ 5384 +МЕЧ 5385 +▁STATES 5386 +史 5387 +СЕН 5388 +สิทธิ์ 5389 +▁مثل 5390 +ẽ 5391 +ี่ย 5392 +電 5393 +ร้อน 5394 +▁นั่น 5395 +ื่น 5396 +宅 5397 +▁hương 5398 +谷 5399 +con 5400 +WHETHER 5401 +БРА 5402 +▁SAW 5403 +فاق 5404 +ITE 5405 +▁ยังมี 5406 +طلب 5407 +JUR 5408 +ПОД 5409 +▁รายงาน 5410 +▁sân 5411 +ملك 5412 +▁thuận 5413 +АЛСЯ 5414 +▁PROBABLY 5415 +▁КАЖДЫЙ 5416 +▁RUN 5417 +▁อะ 5418 +▁BAWAH 5419 +▁САМЫЙ 5420 +▁chút 5421 +▁二千 5422 +▁tuyến 5423 +▁WHITE 5424 +زل 5425 +KAL 5426 +波 5427 +▁ВСТРЕЧ 5428 +DUK 5429 +依 5430 +▁الثورة 5431 +▁四十 5432 +ลับ 5433 +وقع 5434 +攻 5435 +АРИ 5436 +زا 5437 +СЛОВ 5438 +戦 5439 +ТАЙ 5440 +材 5441 +بين 5442 +ฤ 5443 +▁WOMEN 5444 +▁ไล่ 5445 +▁PUSAT 5446 +▁ชิ 5447 +▁ДЕЛО 5448 +แป 5449 +ساب 5450 +ANGKAN 5451 +قدم 5452 +ПАД 5453 +▁trai 5454 +บาย 5455 +▁SEMAKIN 5456 +▁السورية 5457 +▁まだ 5458 +ظل 5459 +▁COMING 5460 +然 5461 +▁ทุ 5462 +حكومة 5463 +9 5464 +فكر 5465 +▁nằm 5466 +▁WATCH 5467 +ตาย 5468 +ЗНАЧ 5469 +طالب 5470 +▁SEDIKIT 5471 +ティ 5472 +▁ฆ่า 5473 +ИРОВ 5474 +▁long 5475 +▁ยาว 5476 +ГОВОРИЛ 5477 +LOCK 5478 +WORD 5479 +▁حول 5480 +MENGU 5481 +RIAN 5482 +ード 5483 +HIS 5484 +КАМИ 5485 +▁ใกล้ 5486 +غر 5487 +▁الإسرائيلي 5488 +健 5489 +وصل 5490 +ПОЭТОМУ 5491 +▁الحر 5492 +НИКОВ 5493 +ИТЕЛИ 5494 +ิง 5495 +يخ 5496 +้อย 5497 +▁МОГ 5498 +▁ลูกสาว 5499 +▁TIBA 5500 +▁căn 5501 +▁ТЕХ 5502 +▁اله 5503 +▁แล้ 5504 +ДАЛ 5505 +تين 5506 +▁thầy 5507 +АЦИЯ 5508 +ЕЛ 5509 +НЕС 5510 +▁MUST 5511 +口 5512 +康 5513 +ギ 5514 +替 5515 +▁คา 5516 +ДЕН 5517 +▁АВТО 5518 +▁MEANS 5519 +▁CHILDREN 5520 +▁بن 5521 +HKAN 5522 +▁ตะ 5523 +وث 5524 +置 5525 +THESE 5526 +▁vàng 5527 +▁فيما 5528 +ГРА 5529 +▁TRY 5530 +▁BANK 5531 +صور 5532 +ЁР 5533 +▁độc 5534 +▁nghiên 5535 +▁同じ 5536 +▁dương 5537 +▁الاست 5538 +▁QUESTIONS 5539 +حتى 5540 +USE 5541 +MARK 5542 +▁لأ 5543 +แม 5544 +短 5545 +▁ПОГОДЕ 5546 +另 5547 +ข่าว 5548 +▁الوقت 5549 +СТВЕ 5550 +▁الأرض 5551 +通 5552 +▁ДИ 5553 +أصبح 5554 +▁tô 5555 +مكان 5556 +▁BERBEDA 5557 +脚 5558 +▁SURABAYA 5559 +▁警察 5560 +MISALNYA 5561 +▁НИКОГДА 5562 +▁หรือไม่ 5563 +跳 5564 +زال 5565 +▁hữu 5566 +ПЫ 5567 +ЖАЛ 5568 +▁BRING 5569 +変 5570 +▁xét 5571 +▁うん 5572 +OVER 5573 +呼 5574 +ขวา 5575 +▁والت 5576 +عادة 5577 +招 5578 +بيع 5579 +▁ANSWER 5580 +LAK 5581 +ТСЯ 5582 +▁СВОЮ 5583 +НИЦ 5584 +NET 5585 +ГАР 5586 +▁vẻ 5587 +▁ตอนที่ 5588 +ثم 5589 +▁SISI 5590 +SAMPAI 5591 +▁tải 5592 +▁แหละ 5593 +نيا 5594 +GANG 5595 +▁quê 5596 +غرب 5597 +▁RUANG 5598 +▁นัด 5599 +راء 5600 +▁phú 5601 +▁ô 5602 +▁ELSE 5603 +かり 5604 +▁LAKUKAN 5605 +▁แถว 5606 +▁ตัด 5607 +▁nâng 5608 +▁ตําบล 5609 +FIL 5610 +▁СДЕЛАЛ 5611 +VOL 5612 +▁sợ 5613 +▁MATTER 5614 +▁กุ 5615 +اسم 5616 +▁しか 5617 +GUE 5618 +▁เข้าใจ 5619 +سيطر 5620 +毒 5621 +▁PRETTY 5622 +▁yên 5623 +▁ตํา 5624 +歩 5625 +草 5626 +ائم 5627 +HASIL 5628 +▁MARKET 5629 +▁BEN 5630 +▁thắng 5631 +▁КУПИТЬ 5632 +hôm 5633 +運 5634 +▁TEACH 5635 +ác 5636 +ภ 5637 +ОДИН 5638 +余 5639 +ИЛАСЬ 5640 +AGAR 5641 +▁BEKERJA 5642 +月 5643 +ý 5644 +▁กอง 5645 +▁PENYE 5646 +▁可能 5647 +หลวง 5648 +策 5649 +▁ghi 5650 +▁vợ 5651 +▁МИНУТ 5652 +خص 5653 +ừm 5654 +SEKARANG 5655 +JUGA 5656 +MING 5657 +مان 5658 +TUN 5659 +▁ВСЕМ 5660 +▁MERASA 5661 +ОВО 5662 +▁เต็ม 5663 +▁لأنه 5664 +▁МОГУТ 5665 +▁ninh 5666 +KY 5667 +ABILITY 5668 +▁さあ 5669 +รณ 5670 +▁EFFECT 5671 +ける 5672 +▁المع 5673 +▁FACE 5674 +АЮТСЯ 5675 +▁cà 5676 +▁SELATAN 5677 +وري 5678 +▁เท่า 5679 +▁BERAPA 5680 +ICALLY 5681 +ДЕСЯТ 5682 +取 5683 +▁EKS 5684 +成 5685 +ОЛОГ 5686 +غل 5687 +НЯТЬ 5688 +金 5689 +鬼 5690 +▁MAKING 5691 +▁đọc 5692 +▁SOMEONE 5693 +ГРУПП 5694 +▁THIRTY 5695 +▁MENARIK 5696 +ДВА 5697 +▁ALREADY 5698 +▁นาที 5699 +▁ยอม 5700 +▁ЧАСТЬ 5701 +▁مست 5702 +ОБЩЕ 5703 +▁chồng 5704 +شا 5705 +索 5706 +危 5707 +▁xuân 5708 +ПУТ 5709 +SEM 5710 +PEL 5711 +خي 5712 +博 5713 +致 5714 +ホ 5715 +ราย 5716 +ทิ 5717 +源 5718 +近 5719 +ОП 5720 +▁chiều 5721 +IOUS 5722 +▁多く 5723 +▁يتم 5724 +HAD 5725 +▁thú 5726 +▁ลิ 5727 +ชนะ 5728 +้อ 5729 +▁trồng 5730 +ОТПРАВ 5731 +▁viết 5732 +ثلاث 5733 +ВЕЩ 5734 +▁وهي 5735 +▁bánh 5736 +▁SEGERA 5737 +介 5738 +قدر 5739 +▁MENA 5740 +راق 5741 +張 5742 +▁ภายใน 5743 +ضيف 5744 +▁ONCE 5745 +es 5746 +皮 5747 +IG 5748 +▁lộ 5749 +لل 5750 +ЧНЫЕ 5751 +▁BARANG 5752 +よう 5753 +▁ขับรถ 5754 +▁NON 5755 +bi 5756 +調 5757 +▁แต่ละ 5758 +探 5759 +▁trách 5760 +▁ออกจาก 5761 +▁СТОЛ 5762 +▁WATER 5763 +期 5764 +شعب 5765 +▁luận 5766 +ЕНЫ 5767 +▁TANAH 5768 +秋 5769 +▁感染 5770 +違 5771 +▁คาด 5772 +▁nhé 5773 +▁いただき 5774 +智 5775 +HARAP 5776 +▁وإ 5777 +週 5778 +▁ТОТ 5779 +▁cường 5780 +▁СВЕТ 5781 +TERUTAMA 5782 +▁ดีกว่า 5783 +▁تم 5784 +▁ก่อนหน้านี้ 5785 +HARUSNYA 5786 +НИЗ 5787 +▁حل 5788 +DEVELOP 5789 +Q 5790 +▁nạn 5791 +▁BERJALAN 5792 +▁đẩy 5793 +当 5794 +▁محمد 5795 +RAMA 5796 +يو 5797 +TIP 5798 +▁huyện 5799 +BIR 5800 +شد 5801 +▁KENDARAAN 5802 +▁KECIL 5803 +si 5804 +ốt 5805 +▁TOLD 5806 +ây 5807 +▁ประตู 5808 +前 5809 +様 5810 +▁情報 5811 +▁SORE 5812 +انية 5813 +ี้ย 5814 +巴 5815 +▁QUITE 5816 +麻 5817 +▁xúc 5818 +▁thúc 5819 +▁場所 5820 +JANG 5821 +▁状況 5822 +ДЕЛЬ 5823 +▁OFTEN 5824 +抗 5825 +بناء 5826 +▁ขอให้ 5827 +حدث 5828 +▁ПРОШЛ 5829 +طار 5830 +▁関係 5831 +IE 5832 +ФОН 5833 +حسن 5834 +▁ONLINE 5835 +▁UNIVERSITY 5836 +▁よる 5837 +PROV 5838 +ШЁЛ 5839 +堂 5840 +婆 5841 +▁ผู้ต้องหา 5842 +▁ТРАНСПОРТ 5843 +▁STOP 5844 +واقع 5845 +ГОЛОВ 5846 +ПРЕЗИДЕНТ 5847 +TUNG 5848 +▁SPEC 5849 +โทษ 5850 +▁TUA 5851 +▁GENERAL 5852 +▁cư 5853 +ЛИВ 5854 +ВОЗ 5855 +妻 5856 +ТАН 5857 +ГРАД 5858 +CUMA 5859 +تاريخ 5860 +▁แสน 5861 +ต่อ 5862 +AWAN 5863 +ション 5864 +▁UTAMA 5865 +▁hại 5866 +▁mắc 5867 +める 5868 +恐 5869 +抱 5870 +CLU 5871 +РЕЗ 5872 +▁quanh 5873 +ДОВ 5874 +▁nặng 5875 +LEN 5876 +طاع 5877 +▁KEBIJAKAN 5878 +役 5879 +▁THOUGH 5880 +việc 5881 +عر 5882 +БИЛ 5883 +▁اللي 5884 +▁容疑 5885 +أخذ 5886 +أستاذ 5887 +▁ได้ยิน 5888 +▁えっ 5889 +▁IKUT 5890 +ОЗ 5891 +▁DEAL 5892 +СМЕ 5893 +水 5894 +ترك 5895 +▁นางสาว 5896 +TABLE 5897 +СКОРО 5898 +▁มาถึง 5899 +ائل 5900 +يلة 5901 +▁COMES 5902 +▁STUDENTS 5903 +▁xuyên 5904 +▁giai 5905 +فهم 5906 +ПРОШУ 5907 +▁คนขับ 5908 +▁giám 5909 +ar 5910 +バー 5911 +▁ป้า 5912 +OC 5913 +▁ร่างกาย 5914 +МОН 5915 +ТЕЛЯ 5916 +般 5917 +▁vốn 5918 +▁REMEMBER 5919 +BRO 5920 +VIC 5921 +▁DAYS 5922 +راك 5923 +▁MELA 5924 +▁問題 5925 +▁ho 5926 +数 5927 +ゴ 5928 +▁สวย 5929 +ДЕМ 5930 +▁うち 5931 +▁ภู 5932 +WHY 5933 +▁ALLOW 5934 +SIDE 5935 +▁เพิ่ง 5936 +قرار 5937 +▁เรื่องราว 5938 +象 5939 +دخل 5940 +即 5941 +ФУ 5942 +КОТОРЫЕ 5943 +АКТИВ 5944 +لس 5945 +رف 5946 +▁НРАВИТСЯ 5947 +▁必要 5948 +▁SOUND 5949 +รก 5950 +▁PAKAI 5951 +وحد 5952 +化 5953 +PATI 5954 +▁DOLLARS 5955 +▁chạy 5956 +▁SUPER 5957 +▁phẩy 5958 +ุน 5959 +▁FINAL 5960 +▁ทุกวัน 5961 +▁ร่าง 5962 +bởi 5963 +▁ДЕЙСТВИТЕЛЬНО 5964 +▁STEP 5965 +JOHN 5966 +БРО 5967 +▁khám 5968 +ZI 5969 +▁SEMUANYA 5970 +▁อํา 5971 +لديه 5972 +▁USING 5973 +ザ 5974 +RESPON 5975 +OLOGI 5976 +▁ОБО 5977 +享 5978 +▁ЗАКОН 5979 +▁ИНТЕРНЕТЕ 5980 +ốc 5981 +لغ 5982 +่อน 5983 +BR 5984 +▁góp 5985 +盛 5986 +品 5987 +▁บางคน 5988 +▁一人 5989 +ท้าย 5990 +▁หลาน 5991 +СЛУША 5992 +DAYA 5993 +▁NAIK 5994 +▁女性 5995 +เฉ 5996 +แพทย์ 5997 +КОМП 5998 +▁ngon 5999 +PENG 6000 +横 6001 +さい 6002 +▁หลังจากที่ 6003 +COME 6004 +▁ДАЛЬШЕ 6005 +▁БИЛЕТ 6006 +▁ДОЛЖЕН 6007 +ГЕР 6008 +▁kiếm 6009 +MERA 6010 +ИГР 6011 +▁MINGGU 6012 +مين 6013 +▁ไปหา 6014 +ماذا 6015 +画 6016 +球 6017 +▁นายก 6018 +▁trận 6019 +ปก 6020 +▁PRESENT 6021 +ХВАТ 6022 +ЭК 6023 +▁続け 6024 +▁ổn 6025 +▁พัน 6026 +KOMUNIKASI 6027 +trước 6028 +▁IMP 6029 +借 6030 +款 6031 +▁ГОС 6032 +ЛОН 6033 +▁PROVIDE 6034 +КИЕ 6035 +КАХ 6036 +▁الفلسطيني 6037 +概 6038 +ИТЕЛЕЙ 6039 +КЛАД 6040 +▁đứng 6041 +ГН 6042 +▁الإنسان 6043 +▁持っ 6044 +СТАВИТЬ 6045 +▁SEEN 6046 +▁เกี่ยวข้อง 6047 +▁lai 6048 +PRESS 6049 +宣 6050 +▁LATER 6051 +▁luyện 6052 +▁ВЕЧЕР 6053 +▁จบ 6054 +回 6055 +▁lá 6056 +否 6057 +РАЖ 6058 +▁ЖИЗНЬ 6059 +▁WRITE 6060 +. 6061 +▁นคร 6062 +ЦЕВ 6063 +НК 6064 +▁dưỡng 6065 +ISTS 6066 +ЯТСЯ 6067 +FRONT 6068 +▁الأسد 6069 +▁lỗi 6070 +▁TOOK 6071 +กิจ 6072 +▁MATA 6073 +▁РАБОТЫ 6074 +СТЫ 6075 +ุ่ม 6076 +▁ДОЛЖНЫ 6077 +BELIAU 6078 +حركة 6079 +▁最後 6080 +割 6081 +散 6082 +้อม 6083 +NGK 6084 +▁HOPE 6085 +وسط 6086 +▁ประธาน 6087 +▁STUFF 6088 +▁sâu 6089 +▁TEAM 6090 +عرف 6091 +代 6092 +▁vân 6093 +جمع 6094 +▁KEPOLISIAN 6095 +▁đẳng 6096 +曜 6097 +▁АВТОБУС 6098 +▁เรียบร้อย 6099 +▁ปล 6100 +وقد 6101 +عين 6102 +ائر 6103 +▁ГОЛ 6104 +▁mã 6105 +BANDING 6106 +▁一方 6107 +công 6108 +ساعد 6109 +▁ลด 6110 +ШИХ 6111 +▁TOTAL 6112 +MASUK 6113 +SEMUA 6114 +กระ 6115 +UGHT 6116 +▁ТЫСЯЧИ 6117 +和 6118 +▁ích 6119 +▁วัย 6120 +СПАСИБО 6121 +▁โมง 6122 +切 6123 +▁vượt 6124 +ぼ 6125 +▁hơi 6126 +MBA 6127 +▁HAPPENED 6128 +コン 6129 +EAR 6130 +▁СЛОВАМ 6131 +حمد 6132 +▁RECORD 6133 +่ํา 6134 +▁أمر 6135 +ИРОВАЛ 6136 +▁変わ 6137 +chỉ 6138 +▁thử 6139 +bọn 6140 +▁miền 6141 +▁СЮДА 6142 +▁แจ้งความ 6143 +mình 6144 +▁СВОИ 6145 +▁กรณี 6146 +▁شخص 6147 +▁CONTROL 6148 +▁หรอก 6149 +▁หลังจากนั้น 6150 +ТЕМ 6151 +▁少し 6152 +ВЕС 6153 +ISE 6154 +▁REST 6155 +▁ทิ้ง 6156 +▁НАД 6157 +転 6158 +ШЛА 6159 +▁HOUR 6160 +町 6161 +舞 6162 +▁กล้องวงจรปิด 6163 +СКУЮ 6164 +ТЕН 6165 +▁TERSANGKA 6166 +MARI 6167 +PET 6168 +振 6169 +昨 6170 +حدود 6171 +ده 6172 +▁เสื้อ 6173 +عتبر 6174 +▁SIM 6175 +▁SHARE 6176 +▁สิบ 6177 +SOMETIMES 6178 +姿 6179 +تابع 6180 +▁HISTORY 6181 +▁lương 6182 +▁مجلس 6183 +▁بما 6184 +▁BRAIN 6185 +▁cải 6186 +gh 6187 +OTHER 6188 +هدف 6189 +▁ست 6190 +▁PAIN 6191 +مرحلة 6192 +▁ЭТИХ 6193 +双 6194 +20 6195 +▁SISTEM 6196 +茶 6197 +▁見え 6198 +▁TERLALU 6199 +แก่ 6200 +▁使っ 6201 +▁MEMA 6202 +印 6203 +صب 6204 +ИМИ 6205 +КРОВ 6206 +▁ที่นี่ 6207 +ВИС 6208 +▁chắn 6209 +ПЯТ 6210 +nhiều 6211 +▁LOH 6212 +IO 6213 +▁เพียง 6214 +▁SCIENCE 6215 +▁sai 6216 +ฟ้า 6217 +ุ่น 6218 +СЕГОДНЯ 6219 +▁PROJECT 6220 +MBANGAN 6221 +▁HATI 6222 +▁СРАЗУ 6223 +▁กค 6224 +▁BILANG 6225 +▁kia 6226 +ฐาน 6227 +▁العراقي 6228 +КИЙ 6229 +▁ふう 6230 +СЛА 6231 +КРАС 6232 +ВИТ 6233 +村 6234 +▁الحرب 6235 +هما 6236 +▁中国 6237 +▁đàn 6238 +▁PROVINSI 6239 +ẩ 6240 +▁ТОВАР 6241 +chùa 6242 +露 6243 +▁MENGAKU 6244 +▁СКОЛЬКО 6245 +▁hư 6246 +BALIK 6247 +▁さらに 6248 +جاء 6249 +▁เมตร 6250 +التي 6251 +列 6252 +▁РЕЖИМ 6253 +PARA 6254 +وى 6255 +▁تحت 6256 +づ 6257 +ذر 6258 +như 6259 +▁nga 6260 +TEMP 6261 +▁ADD 6262 +พล 6263 +▁WALK 6264 +▁nghiêm 6265 +КРОМЕ 6266 +ОБЫ 6267 +▁ПЫТА 6268 +СЕТ 6269 +▁BREAK 6270 +РТ 6271 +▁vòng 6272 +▁เส้น 6273 +秘 6274 +ШКА 6275 +▁tuyển 6276 +▁ปล่อย 6277 +▁いけ 6278 +้ํา 6279 +ЛИЗ 6280 +เลือด 6281 +》 6282 +لماذا 6283 +INDAH 6284 +ВЕН 6285 +▁ПРИНЦИПЕ 6286 +▁miễn 6287 +▁จ่าย 6288 +▁楽し 6289 +КОЛЬ 6290 +▁ВИДЕЛ 6291 +ЗДОРОВ 6292 +▁COMPANY 6293 +▁ТУДА 6294 +キャ 6295 +ЕНИЕМ 6296 +▁NOMOR 6297 +▁СТОРОНЫ 6298 +ЧКИ 6299 +▁SIAP 6300 +▁sóc 6301 +胡 6302 +▁BANDUNG 6303 +ГЕН 6304 +ДАТЬ 6305 +猫 6306 +▁nỗ 6307 +▁CAUSE 6308 +СТВЕННО 6309 +LABOR 6310 +▁nhiễm 6311 +▁BODY 6312 +SEBENARNYA 6313 +▁الماضي 6314 +家 6315 +がり 6316 +ПРОВОД 6317 +目 6318 +弄 6319 +ЫВАТЬ 6320 +合わせ 6321 +▁ปรับ 6322 +▁СВОЕЙ 6323 +cả 6324 +▁SPACE 6325 +KELOMPOK 6326 +▁БЕЛ 6327 +▁TANGGAL 6328 +▁เนี้ย 6329 +▁LAH 6330 +▁ウクライナ 6331 +▁tai 6332 +IFIKASI 6333 +▁TRUMP 6334 +OUGH 6335 +せる 6336 +ิบ 6337 +▁ПОНИМАЮ 6338 +فس 6339 +▁МОИ 6340 +▁TURUN 6341 +ЖЕЛ 6342 +▁CHILD 6343 +▁thấp 6344 +▁وليس 6345 +СИМ 6346 +GENT 6347 +ディ 6348 +▁يريد 6349 +▁SEA 6350 +PLEASE 6351 +▁المعارضة 6352 +▁しれ 6353 +ظاهر 6354 +ХОДИЛ 6355 +▁BUILDING 6356 +族 6357 +▁hạnh 6358 +▁SOUTH 6359 +КТО 6360 +SEBAGAI 6361 +▁どこ 6362 +ЧНЫЙ 6363 +▁しかし 6364 +ล่ 6365 +KOR 6366 +أنا 6367 +▁ngồi 6368 +洋 6369 +▁يست 6370 +ELE 6371 +楼 6372 +سبب 6373 +▁بالم 6374 +▁MILLION 6375 +ДОРО 6376 +着 6377 +▁ปัญหา 6378 +▁phản 6379 +困 6380 +▁tàu 6381 +ศึกษา 6382 +▁MAKAN 6383 +▁lĩnh 6384 +วี 6385 +ОПЫТ 6386 +リア 6387 +▁suất 6388 +موضوع 6389 +応 6390 +▁COURT 6391 +▁เล็ก 6392 +称 6393 +▁أجل 6394 +▁ほう 6395 +▁МЕСЯЦ 6396 +ПОНЯТ 6397 +ГОРОД 6398 +▁STAND 6399 +触 6400 +▁نفسه 6401 +▁ทีวี 6402 +▁まあ 6403 +خلي 6404 +▁DISEBUT 6405 +▁ตลาด 6406 +▁thủy 6407 +▁منها 6408 +▁hút 6409 +NDUNG 6410 +ЗР 6411 +▁الدولي 6412 +▁المجتمع 6413 +▁КРАСИВ 6414 +▁ทัน 6415 +混 6416 +▁นั่นแหละ 6417 +▁bổ 6418 +寒 6419 +▁AGO 6420 +قوم 6421 +▁СОВЕТ 6422 +▁جديد 6423 +เฟ 6424 +САН 6425 +▁SAT 6426 +▁NOTHING 6427 +飛 6428 +КУРС 6429 +▁nha 6430 +▁ครั้งนี้ 6431 +森 6432 +ヤ 6433 +▁ARM 6434 +دفع 6435 +▁ДВУХ 6436 +ru 6437 +▁POLITICAL 6438 +▁ДРУГИХ 6439 +▁MENANG 6440 +ễ 6441 +▁chả 6442 +KUL 6443 +УКРАИН 6444 +BELAJAR 6445 +▁MINUTE 6446 +▁УЛИЦЕ 6447 +頭 6448 +▁ưu 6449 +مشروع 6450 +▁СЛОВАРЬ 6451 +АТОР 6452 +ستطيع 6453 +تعامل 6454 +LUM 6455 +جلس 6456 +▁SATUNYA 6457 +信 6458 +▁発表 6459 +ТРУД 6460 +▁SUN 6461 +ИНГ 6462 +▁一番 6463 +AFTER 6464 +充 6465 +▁พื้น 6466 +▁cơm 6467 +ЕНИЙ 6468 +ПРАВИЛ 6469 +▁thơ 6470 +▁มากกว่า 6471 +赤 6472 +▁lựa 6473 +▁ВСЯ 6474 +▁PERSEN 6475 +▁МАК 6476 +言 6477 +▁КУДА 6478 +▁ยืน 6479 +▁trải 6480 +VARI 6481 +▁MAKES 6482 +▁BAGUS 6483 +ื 6484 +ัช 6485 +ДВИЖ 6486 +冲 6487 +▁tín 6488 +▁TENTUNYA 6489 +▁MENGALAMI 6490 +▁NATIONAL 6491 +▁๑๙ 6492 +ศักดิ์ 6493 +▁SAMPAIKAN 6494 +سمع 6495 +▁FUTURE 6496 +▁ЗНАЕТЕ 6497 +ืน 6498 +▁SUARA 6499 +ธา 6500 +MASIH 6501 +善 6502 +▁หาก 6503 +▁ถือ 6504 +▁HEARD 6505 +▁والأ 6506 +▁一緒 6507 +อยู่ 6508 +FFE 6509 +問 6510 +ПОМНИ 6511 +味 6512 +thời 6513 +▁lạnh 6514 +▁THINKING 6515 +▁どんな 6516 +そう 6517 +▁EVENT 6518 +▁لهم 6519 +▁อย่างไร 6520 +كيف 6521 +АЙТЕ 6522 +ТАР 6523 +صحيح 6524 +РОН 6525 +ไทย 6526 +▁PERIOD 6527 +DEP 6528 +ПЯТЬ 6529 +عسكري 6530 +วก 6531 +▁ràng 6532 +▁УЛИЦЫ 6533 +▁PAGE 6534 +РАСТ 6535 +▁ACROSS 6536 +港 6537 +▁確認 6538 +PASTI 6539 +勢 6540 +ПРЕДЕЛ 6541 +NOR 6542 +УЕТ 6543 +▁МЕЖДУ 6544 +НАПРАВЛЕН 6545 +صدر 6546 +▁giác 6547 +▁thiệu 6548 +▁จากนั้น 6549 +甚 6550 +▁影響 6551 +MESKI 6552 +LIP 6553 +▁الآخر 6554 +أيضا 6555 +▁กลายเป็น 6556 +IRAN 6557 +▁WAYS 6558 +IZED 6559 +thực 6560 +意 6561 +تل 6562 +▁TANGAN 6563 +СОГЛАС 6564 +▁ВЫХОД 6565 +升 6566 +▁DIBERIKAN 6567 +▁ВМЕСТЕ 6568 +▁先生 6569 +WAI 6570 +▁ВЕДЬ 6571 +▁MENYATAKAN 6572 +売 6573 +▁bí 6574 +▁quen 6575 +▁khán 6576 +▁ليست 6577 +แล้ว 6578 +▁kéo 6579 +▁đảo 6580 +rồi 6581 +ЛОМ 6582 +▁FULL 6583 +ลี 6584 +▁MAKANAN 6585 +ẻ 6586 +▁PENGE 6587 +TEK 6588 +▁tránh 6589 +爆 6590 +端 6591 +lo 6592 +▁OPERA 6593 +▁UNITED 6594 +СЕЛ 6595 +▁المر 6596 +▁الإيراني 6597 +括 6598 +mỗi 6599 +▁WITHIN 6600 +БЕЖ 6601 +熊 6602 +ومن 6603 +КАКИЕ 6604 +登 6605 +嘴 6606 +KARENA 6607 +BET 6608 +เดียว 6609 +▁ที่เกิดเหตุ 6610 +▁สวน 6611 +▁HADIR 6612 +▁tộc 6613 +▁หนุ่ม 6614 +КРУГ 6615 +▁POST 6616 +▁よっ 6617 +ARTI 6618 +ロー 6619 +▁hồng 6620 +năm 6621 +▁ครับผม 6622 +▁فإن 6623 +▁tuyệt 6624 +ざ 6625 +ゆ 6626 +cũng 6627 +▁RAKYAT 6628 +負 6629 +▁MENUJU 6630 +ใช้ 6631 +حقوق 6632 +▁ちゃっ 6633 +ТУП 6634 +▁ДЕНЬГИ 6635 +▁ดัง 6636 +ХОДИТЬ 6637 +سان 6638 +NAMA 6639 +RIC 6640 +▁ОНО 6641 +▁ДВОР 6642 +▁ИНСТИТУТА 6643 +يون 6644 +POSITION 6645 +NAN 6646 +▁PEKERJA 6647 +▁POSITIF 6648 +▁ОДНА 6649 +ぞ 6650 +▁إنه 6651 +融 6652 +СУТ 6653 +▁العمل 6654 +▁ยิ่ง 6655 +НРАВ 6656 +▁السابق 6657 +سأل 6658 +▁ชม 6659 +ngoài 6660 +เสีย 6661 +秀 6662 +MISSION 6663 +▁ủy 6664 +▁ปุ๊บ 6665 +▁เท่านั้น 6666 +▁ปู 6667 +برا 6668 +al 6669 +▁الواقع 6670 +▁ЗАЯВИЛ 6671 +▁ชั่วโมง 6672 +▁ที่ว่า 6673 +▁БОЛЬ 6674 +БРАТЬ 6675 +▁СЛУЧАЕ 6676 +骨 6677 +チャ 6678 +岡 6679 +▁しっかり 6680 +▁บรรยากาศ 6681 +▁BAHAS 6682 +▁おり 6683 +أميركا 6684 +▁САМОЕ 6685 +▁หมู่บ้าน 6686 +▁chết 6687 +st 6688 +季 6689 +السلام 6690 +▁TRUE 6691 +▁đáp 6692 +▁รู้จัก 6693 +МНОГИЕ 6694 +唱 6695 +TARI 6696 +航 6697 +WALAUPUN 6698 +▁đảng 6699 +▁BASE 6700 +▁ย่า 6701 +LAP 6702 +▁ОСНОВ 6703 +НУТЬ 6704 +DITA 6705 +▁จึง 6706 +СПОСОБ 6707 +▁PUTRI 6708 +هناك 6709 +МЕНЯ 6710 +▁ลูกค้า 6711 +FLE 6712 +КОЕ 6713 +▁事件 6714 +▁คนใน 6715 +▁dư 6716 +▁НАЙТИ 6717 +治 6718 +▁MUDA 6719 +جمهور 6720 +RID 6721 +ULANG 6722 +サ 6723 +熱 6724 +▁إل 6725 +õ 6726 +ปฏิบัติ 6727 +▁いつ 6728 +雷 6729 +▁รีบ 6730 +▁MODEL 6731 +▁ออ 6732 +▁HEART 6733 +▁ทาน 6734 +ДИН 6735 +▁BERGABUNG 6736 +ЛОГ 6737 +帰 6738 +▁WORDS 6739 +向 6740 +律 6741 +ЕЛИ 6742 +ANGGUNG 6743 +SURE 6744 +▁MENYAMPAIKAN 6745 +EVERY 6746 +DIR 6747 +▁LEMBAGA 6748 +تقدم 6749 +СОЗДА 6750 +▁WONDER 6751 +▁ALMOST 6752 +MEL 6753 +▁VIRUS 6754 +khu 6755 +จังหวะ 6756 +▁ЕВРО 6757 +▁ทุกอย่าง 6758 +UMBU 6759 +СИД 6760 +▁ТРИДЦАТЬ 6761 +▁ASKED 6762 +▁ระยะ 6763 +解 6764 +▁sơ 6765 +▁ด่า 6766 +ЧЁТ 6767 +▁بأنه 6768 +▁gồm 6769 +▁DEEP 6770 +دار 6771 +بو 6772 +▁sông 6773 +園 6774 +ЗДЕСЬ 6775 +เหน 6776 +ТОЛЬКО 6777 +▁วาง 6778 +▁coi 6779 +▁soát 6780 +▁ИНТЕРЕСНО 6781 +QUA 6782 +UKAN 6783 +▁PERUSAHAAN 6784 +▁VOTE 6785 +▁ВКУС 6786 +▁รถจักรยานยนต์ 6787 +▁MEMBA 6788 +ョ 6789 +▁РУБЛЕЙ 6790 +套 6791 +▁PERSONAL 6792 +▁初めて 6793 +▁WASN 6794 +▁ねえ 6795 +▁มะ 6796 +▁ชัดเจน 6797 +إدارة 6798 +▁الكثير 6799 +▁DURING 6800 +▁SELESAI 6801 +▁ถูกต้อง 6802 +▁ТЫСЯЧА 6803 +ДУШ 6804 +▁ATURAN 6805 +RATION 6806 +حص 6807 +▁HAPPEN 6808 +MUS 6809 +เท้า 6810 +▁ЧЕЛОВЕКА 6811 +▁ПОСМОТРЕТЬ 6812 +▁KHUSUS 6813 +đi 6814 +ПРИВЕТ 6815 +▁LAPANGAN 6816 +ЕНТ 6817 +GEL 6818 +視 6819 +رئيس 6820 +สังคม 6821 +▁ليبيا 6822 +ั่ง 6823 +牌 6824 +床 6825 +▁CONTINUE 6826 +▁اليمني 6827 +ลูก 6828 +▁VISI 6829 +▁だろう 6830 +วร 6831 +▁dõi 6832 +ФРАНЦ 6833 +▁lí 6834 +▁biên 6835 +▁giây 6836 +▁SURAT 6837 +▁bá 6838 +ปี 6839 +ทหาร 6840 +▁quần 6841 +折 6842 +ПЕН 6843 +СКАЖИ 6844 +▁ああ 6845 +▁may 6846 +จ้าง 6847 +▁สู้ 6848 +震 6849 +ี่ยว 6850 +عيش 6851 +▁ยาย 6852 +記 6853 +▁KORUPSI 6854 +JAH 6855 +▁الوضع 6856 +▁ОТВЕТ 6857 +▁FIFTY 6858 +▁giấy 6859 +▁СОБОЙ 6860 +▁ДРУГОЙ 6861 +▁thăm 6862 +達 6863 +HARUS 6864 +INILAH 6865 +▁PAST 6866 +▁NORMAL 6867 +CHAR 6868 +ЕННЫЙ 6869 +lu 6870 +ヒ 6871 +▁引き 6872 +▁واحد 6873 +▁ยอมรับ 6874 +شاهد 6875 +▁แยก 6876 +▁СИЛЬНО 6877 +▁มีปัญหา 6878 +▁БОГ 6879 +▁BILL 6880 +ЧКА 6881 +NED 6882 +ПРОИЗВОД 6883 +▁ห้า 6884 +TRIBU 6885 +▁ЧАСТО 6886 +▁คุณพ่อ 6887 +原 6888 +▁VALUE 6889 +BRE 6890 +▁LEAST 6891 +ạch 6892 +▁FUN 6893 +▁hè 6894 +ОСЬ 6895 +▁ДОВОЛЬНО 6896 +NTAR 6897 +جان 6898 +吸 6899 +РИС 6900 +▁kì 6901 +▁ПРОЦЕНТОВ 6902 +ائد 6903 +hay 6904 +▁INTERESTING 6905 +▁ОПЯТЬ 6906 +▁مثلا 6907 +際 6908 +ũ 6909 +副 6910 +▁ALLAH 6911 +إقليم 6912 +▁ДРУГИЕ 6913 +▁ОТМЕТИЛ 6914 +▁الدكتور 6915 +幅 6916 +▁vai 6917 +速 6918 +暴 6919 +خبر 6920 +ULA 6921 +▁AGAK 6922 +▁tù 6923 +▁ПРЯМО 6924 +BARU 6925 +▁多い 6926 +▁ประชา 6927 +占 6928 +ЫМИ 6929 +嫌 6930 +بحث 6931 +両 6932 +▁RESULT 6933 +免 6934 +施 6935 +– 6936 +▁БАР 6937 +▁YU 6938 +▁MENCAPAI 6939 +PEMERINTAH 6940 +▁DIGITAL 6941 +冬 6942 +▁ประกาศ 6943 +ải 6944 +DAK 6945 +▁対し 6946 +tất 6947 +▁หยุด 6948 +▁DEATH 6949 +ОБРАЗ 6950 +▁núi 6951 +صراع 6952 +EVERYBODY 6953 +وكان 6954 +DAL 6955 +▁RP 6956 +▁MEMBAWA 6957 +KAM 6958 +▁dần 6959 +ЯТЬ 6960 +▁BALI 6961 +レン 6962 +▁พร้อมกับ 6963 +▁ขณะที่ 6964 +นัน 6965 +ตรี 6966 +▁chữa 6967 +▁เกม 6968 +▁tầm 6969 +RUM 6970 +▁الحلقة 6971 +▁まま 6972 +章 6973 +▁cũ 6974 +熟 6975 +▁ไก่ 6976 +▁MEMBANTU 6977 +КУС 6978 +▁MYSELF 6979 +MAKSUD 6980 +倍 6981 +▁ติดต่อ 6982 +▁DIGUNAKAN 6983 +ATIVE 6984 +リン 6985 +▁気温 6986 +انتخاب 6987 +▁КРА 6988 +権 6989 +▁เมีย 6990 +▁MEMINTA 6991 +MBAK 6992 +JAN 6993 +▁HAK 6994 +REL 6995 +ฐ 6996 +▁คนอื่น 6997 +▁СВОЙ 6998 +ظهر 6999 +▁ผู้เสียชีวิต 7000 +法 7001 +ลุก 7002 +راب 7003 +▁CHECK 7004 +▁đứa 7005 +秒 7006 +▁ช่วงนี้ 7007 +▁МОЕГО 7008 +▁الموضوع 7009 +▁كنت 7010 +จีน 7011 +▁ПЕСНИ 7012 +寄 7013 +แข็ง 7014 +▁PUKUL 7015 +▁PENDIDIKAN 7016 +hầu 7017 +لأن 7018 +▁ПАРК 7019 +ЛИК 7020 +▁มีด 7021 +込 7022 +شعر 7023 +▁ยังคง 7024 +▁ОБЩЕМ 7025 +▁男性 7026 +▁lắng 7027 +▁ちゃう 7028 +▁MANAGE 7029 +DUDUK 7030 +▁เตือน 7031 +▁ngữ 7032 +刺 7033 +▁ТЕЛЕФОН 7034 +かし 7035 +▁แม้ 7036 +علاقة 7037 +▁จนถึง 7038 +عارض 7039 +LIE 7040 +MANFAAT 7041 +NIK 7042 +雨 7043 +ni 7044 +▁ง่าย 7045 +▁อดีต 7046 +OPERASI 7047 +▁มอบ 7048 +▁ขอบคุณ 7049 +▁試合 7050 +▁เนื้อ 7051 +▁更に 7052 +▁GOES 7053 +НАЗЫВА 7054 +まる 7055 +▁أقول 7056 +▁昨日 7057 +МИНИСТР 7058 +▁РЕАЛЬНО 7059 +▁الإعلام 7060 +▁НАЗАД 7061 +كاف 7062 +ฆ 7063 +殺 7064 +▁BERHARAP 7065 +mùa 7066 +يرة 7067 +يران 7068 +▁MUSIC 7069 +▁TITIK 7070 +UC 7071 +哭 7072 +UJI 7073 +▁CHRIST 7074 +▁好き 7075 +買 7076 +CHO 7077 +▁ПЕРВЫЙ 7078 +bu 7079 +恋 7080 +▁ALAT 7081 +誰 7082 +ne 7083 +▁vay 7084 +تحالف 7085 +راد 7086 +▁sắp 7087 +ิ่ง 7088 +▁FOOD 7089 +▁อี 7090 +▁ตอนแรก 7091 +▁ทนาย 7092 +終 7093 +▁ОДНОЙ 7094 +سك 7095 +▁chấp 7096 +se 7097 +بير 7098 +▁МЕД 7099 +ائية 7100 +▁HALF 7101 +▁SHORT 7102 +▁HIT 7103 +▁SESUATU 7104 +末 7105 +▁الآ 7106 +▁กรุงเทพ 7107 +▁ПУТИ 7108 +▁MACAM 7109 +▁ต้องการ 7110 +申 7111 +告 7112 +▁กี่ 7113 +URUS 7114 +▁FOCUS 7115 +▁mật 7116 +▁COST 7117 +▁JAWAB 7118 +氏 7119 +団 7120 +ليس 7121 +▁GUYS 7122 +تحقيق 7123 +▁FILM 7124 +▁الثاني 7125 +PERCAYA 7126 +ВЫЙ 7127 +▁ХОЧЕТ 7128 +THANKS 7129 +z 7130 +▁trì 7131 +▁大会 7132 +ประชุม 7133 +▁EXACT 7134 +▁TNI 7135 +豆 7136 +re 7137 +渡 7138 +فتح 7139 +心 7140 +▁チーム 7141 +ri 7142 +برنامج 7143 +طلق 7144 +央 7145 +▁หน้าที่ 7146 +▁แตก 7147 +▁MENJAGA 7148 +▁САМЫЕ 7149 +سياسة 7150 +СПОРТ 7151 +▁ขึ้นไป 7152 +▁НИКТО 7153 +▁SAKSI 7154 +▁ข้อหา 7155 +▁YOURSELF 7156 +▁ANIES 7157 +▁KETIGA 7158 +脱 7159 +▁MAG 7160 +قاتل 7161 +顔 7162 +▁PASIEN 7163 +▁kim 7164 +▁もん 7165 +DEMIKIAN 7166 +▁đỏ 7167 +伴 7168 +▁МОЕЙ 7169 +نعم 7170 +語 7171 +▁tả 7172 +WAH 7173 +نز 7174 +計 7175 +جامع 7176 +士 7177 +EC 7178 +▁作っ 7179 +▁تقول 7180 +カー 7181 +ГРУЗ 7182 +باب 7183 +▁ทั้งสอง 7184 +ISME 7185 +▁現在 7186 +▁chiếu 7187 +سلط 7188 +▁ให้ได้ 7189 +巨 7190 +DINA 7191 +РЕЙ 7192 +ОБЫЧНО 7193 +▁MENYEBUT 7194 +▁EARLY 7195 +▁FIT 7196 +▁ВЗ 7197 +ПАС 7198 +فال 7199 +ХОДЯТ 7200 +吉 7201 +▁MENINGGAL 7202 +ょう 7203 +悪 7204 +CED 7205 +▁phóng 7206 +iều 7207 +ОВАТЬ 7208 +LAWAN 7209 +裁 7210 +授 7211 +▁TYPE 7212 +ЧИК 7213 +ПАН 7214 +TIGA 7215 +▁เขต 7216 +hàng 7217 +ARCH 7218 +АЕШЬ 7219 +لاف 7220 +ょ 7221 +核 7222 +域 7223 +▁mộ 7224 +▁КОНЦЕ 7225 +▁STAY 7226 +▁lãnh 7227 +شع 7228 +シャ 7229 +▁КАФЕ 7230 +ОТЛИЧ 7231 +te 7232 +PEMBE 7233 +▁始め 7234 +لام 7235 +▁KENA 7236 +▁分かり 7237 +▁thảo 7238 +صلاح 7239 +▁SERIBU 7240 +▁สี่ 7241 +藏 7242 +РЕБЯТ 7243 +▁FIGURE 7244 +đã 7245 +▁SUP 7246 +▁มหา 7247 +▁KIDS 7248 +MBAH 7249 +▁الإرهاب 7250 +GIL 7251 +▁mơ 7252 +▁สาเหตุ 7253 +▁ครึ่ง 7254 +▁เพิ่มเติม 7255 +▁MAJOR 7256 +▁結構 7257 +▁TINGKAT 7258 +▁SINGLE 7259 +▁tỏ 7260 +▁kỷ 7261 +収 7262 +▁言わ 7263 +ผิด 7264 +ướng 7265 +CIR 7266 +ШЕН 7267 +▁สวัสดี 7268 +đấy 7269 +▁KAPAL 7270 +ВОСПРОИЗВЕД 7271 +斗 7272 +梅 7273 +ร่วม 7274 +ВРЕМЕН 7275 +UE 7276 +▁WORKS 7277 +▁كبيرة 7278 +▁القانون 7279 +延 7280 +▁cân 7281 +▁KNEW 7282 +TAU 7283 +ПРЕСС 7284 +▁PASAL 7285 +ЧЕН 7286 +ICE 7287 +▁مش 7288 +تحديد 7289 +▁khắc 7290 +一 7291 +LEY 7292 +ربما 7293 +▁ПЛОЩАД 7294 +HINGGA 7295 +sự 7296 +فقد 7297 +設 7298 +▁ช่อง 7299 +▁เสนอ 7300 +▁FRIEND 7301 +▁ТАКИХ 7302 +▁ПОЛУЧИЛ 7303 +▁WRONG 7304 +▁สื่อ 7305 +▁AMERIKA 7306 +▁WON 7307 +▁الأول 7308 +▁TUGAS 7309 +▁ДНЯ 7310 +MAKANYA 7311 +ADE 7312 +▁НЕМЕЦКИЙ 7313 +ШЕСТЬ 7314 +HOWEVER 7315 +СКИМ 7316 +刀 7317 +▁thao 7318 +▁thụ 7319 +BEGITU 7320 +سار 7321 +va 7322 +▁สถานการณ์ 7323 +СТЕЙ 7324 +▁ระดับ 7325 +ЩУ 7326 +فريق 7327 +ศพ 7328 +МАЛЕНЬК 7329 +ЫВАЮТ 7330 +บังคับ 7331 +▁DESIGN 7332 +実 7333 +▁TELE 7334 +HUR 7335 +粉 7336 +▁lê 7337 +▁ВАЖНО 7338 +▁จิ 7339 +▁الأمور 7340 +宮 7341 +روا 7342 +▁ISLAM 7343 +唐 7344 +▁أوباما 7345 +益 7346 +▁おいしい 7347 +ТЕЛИ 7348 +帝 7349 +▁พูดคุย 7350 +▁kho 7351 +▁УНИВЕРСИТЕТА 7352 +▁でしょ 7353 +▁عدد 7354 +挑 7355 +▁الإسلامية 7356 +GRI 7357 +▁العسكرية 7358 +กาย 7359 +▁MOTOR 7360 +束 7361 +BOL 7362 +КВАРТИР 7363 +▁หมู 7364 +▁ОБЛАСТИ 7365 +ЖАР 7366 +đồng 7367 +▁POSSIBLE 7368 +ستخدم 7369 +▁ФАКТ 7370 +▁しまう 7371 +mọi 7372 +CONF 7373 +▁CONVERSATION 7374 +▁CONCERN 7375 +▁SERING 7376 +▁sạch 7377 +含 7378 +مه 7379 +▁cử 7380 +▁พูดถึง 7381 +وش 7382 +DIRECT 7383 +ーズ 7384 +愛 7385 +奥 7386 +▁ДЕВЯТЬСОТ 7387 +▁TERMS 7388 +HAP 7389 +ЦИЙ 7390 +เตอร์ 7391 +▁ngôi 7392 +▁НАШИ 7393 +▁ЖЕНЩИН 7394 +▁ตกลง 7395 +HARGA 7396 +▁ПОДО 7397 +▁LEADER 7398 +▁気持ち 7399 +▁xấu 7400 +▁เร็ว 7401 +▁НЕЁ 7402 +▁dấu 7403 +مواطن 7404 +▁หมา 7405 +▁สอบสวน 7406 +BIASA 7407 +▁SELF 7408 +▁khởi 7409 +งาม 7410 +▁SUKA 7411 +▁ТОЧНО 7412 +WORK 7413 +しゃ 7414 +▁FLA 7415 +me 7416 +▁ЛИШЬ 7417 +▁thất 7418 +▁สอน 7419 +▁hấp 7420 +EMANG 7421 +JALAN 7422 +ANGGAP 7423 +▁lâm 7424 +▁cập 7425 +ДЛЯ 7426 +▁kê 7427 +封 7428 +▁جديدة 7429 +飲 7430 +▁กู้ภัย 7431 +返 7432 +▁dạng 7433 +KHAWATIR 7434 +▁ช่วยกัน 7435 +▁仕事 7436 +▁FAN 7437 +▁ดวง 7438 +▁ДЕСЯТЬ 7439 +▁بهذا 7440 +مستقبل 7441 +▁MENCARI 7442 +▁会社 7443 +▁大きな 7444 +込み 7445 +届 7446 +魔 7447 +МОЛ 7448 +▁КОТОРЫХ 7449 +▁nối 7450 +▁STRONG 7451 +سلح 7452 +▁นึก 7453 +ッチ 7454 +КАКУЮ 7455 +▁mại 7456 +СЛЕДУ 7457 +СЛЫШ 7458 +BALL 7459 +▁ВЕСЬ 7460 +叶 7461 +▁РЕШИЛ 7462 +la 7463 +害 7464 +▁لنا 7465 +▁STAR 7466 +จร 7467 +迷 7468 +DEPEND 7469 +覚 7470 +يدة 7471 +掌 7472 +▁ЭКС 7473 +СЕМЬ 7474 +▁ศูนย์ 7475 +シュ 7476 +減 7477 +▁MERE 7478 +宇 7479 +▁KILL 7480 +▁FRIENDS 7481 +▁INDIVIDUAL 7482 +▁ВТОРОЙ 7483 +CONNECT 7484 +▁ЦЕЛОМ 7485 +فتر 7486 +رام 7487 +ENCY 7488 +▁LIVES 7489 +▁JALUR 7490 +利 7491 +架 7492 +▁MENU 7493 +▁АНГЛИЙСКОМ 7494 +安 7495 +СЕР 7496 +厚 7497 +ОВЫЕ 7498 +PUNG 7499 +แบบ 7500 +▁ДОБАВЬ 7501 +BACA 7502 +▁ПЯТЬДЕСЯТ 7503 +▁CENTER 7504 +FIELD 7505 +ПОСЛЕ 7506 +▁六十 7507 +▁РАВНО 7508 +▁ห้าม 7509 +▁ИМЕЕТ 7510 +BAYAR 7511 +โทรศัพท์ 7512 +▁СООБЩИЛ 7513 +▁場合 7514 +ЛЕЙ 7515 +▁giang 7516 +▁すごく 7517 +КОП 7518 +AWAL 7519 +ДЕРЖИ 7520 +▁NINETEEN 7521 +▁thưởng 7522 +▁ГОВОРИТ 7523 +▁แค 7524 +▁あなた 7525 +TINGGI 7526 +▁لإ 7527 +МЕЛ 7528 +▁LANGUAGE 7529 +MOST 7530 +▁JOIN 7531 +حظ 7532 +وزير 7533 +▁СОРОК 7534 +ВОСЕМЬ 7535 +▁ngọc 7536 +▁ポイント 7537 +優 7538 +PRODUCE 7539 +▁ไม่ค่อย 7540 +▁DOKTER 7541 +▁FORTY 7542 +▁FEELING 7543 +رحم 7544 +ЁЛ 7545 +▁เสา 7546 +▁มุ 7547 +射 7548 +بدا 7549 +พระ 7550 +MINE 7551 +▁DECISION 7552 +▁SEHAT 7553 +bây 7554 +le 7555 +عمليات 7556 +▁ずっと 7557 +ЧЕТЫРЕ 7558 +操 7559 +▁nhắc 7560 +職 7561 +▁СУЩЕСТВ 7562 +▁全国 7563 +เรีย 7564 +BERSIH 7565 +АЛЬНЫЙ 7566 +楽 7567 +أكثر 7568 +▁tịch 7569 +PRESIDEN 7570 +وجد 7571 +彩 7572 +BICARA 7573 +ПОРТ 7574 +▁dầu 7575 +▁องค์ 7576 +CANG 7577 +ราชการ 7578 +▁STUDY 7579 +▁อิน 7580 +▁tội 7581 +▁chờ 7582 +VIN 7583 +RINGAN 7584 +ЕННЫХ 7585 +سائل 7586 +▁ЧУВСТВ 7587 +đối 7588 +ЛЯТЬ 7589 +▁เพชร 7590 +▁НЕМНОГО 7591 +НИЦА 7592 +▁trần 7593 +РЕЗУЛЬТАТ 7594 +▁سياسية 7595 +chính 7596 +شرك 7597 +▁chỉnh 7598 +АРМ 7599 +▁ขาว 7600 +▁НЕДЕЛЮ 7601 +個 7602 +辛 7603 +▁COUPLE 7604 +ศาสตร์ 7605 +قانون 7606 +▁КОМНАТ 7607 +حسب 7608 +قليل 7609 +ЕМСЯ 7610 +▁США 7611 +▁เลิก 7612 +▁คนเดียว 7613 +▁НЕМЕЦКОМ 7614 +ФОР 7615 +▁NINE 7616 +▁เชิญ 7617 +検 7618 +バイ 7619 +▁LEAVE 7620 +ويت 7621 +สัตว์ 7622 +▁FORCE 7623 +▁BANGSA 7624 +戻 7625 +▁นท 7626 +▁大統領 7627 +▁يتعلق 7628 +▁PARTICULAR 7629 +▁phối 7630 +で 7631 +▁ดอก 7632 +▁โดยเฉพาะ 7633 +▁ว่าการ 7634 +▁سواء 7635 +▁KUAT 7636 +ائي 7637 +▁СЕВЕР 7638 +ДЕВЯТЬ 7639 +ПРОДУКТ 7640 +أهل 7641 +▁คุณยาย 7642 +▁FELT 7643 +СЛУЖБ 7644 +▁MOTHER 7645 +▁ЧАСОВ 7646 +▁ซ้าย 7647 +▁GUY 7648 +▁ПОМОЩЬ 7649 +▁ใต้ 7650 +▁ข้อความ 7651 +وخ 7652 +▁FATHER 7653 +ИВАЕТ 7654 +▁МОЖЕТЕ 7655 +พิเศษ 7656 +値 7657 +▁ผู้เสียหาย 7658 +ثق 7659 +葉 7660 +SELANJUTNYA 7661 +▁LIVING 7662 +▁AKHIR 7663 +▁กล้า 7664 +▁МЕСТЕ 7665 +طريقة 7666 +▁とも 7667 +dù 7668 +МОЛОД 7669 +▁EDUCATION 7670 +ั่ว 7671 +っと 7672 +▁chợ 7673 +▁มุม 7674 +▁UTARA 7675 +▁ครบ 7676 +ННЫЕ 7677 +▁ТОБОЙ 7678 +ЭР 7679 +▁ПОМОГ 7680 +صورة 7681 +سام 7682 +▁人気 7683 +制 7684 +▁EXIST 7685 +結 7686 +▁THEMSELVES 7687 +về 7688 +▁ที่วัด 7689 +▁บางที 7690 +▁BERHASIL 7691 +МЕНТ 7692 +▁ISN 7693 +質 7694 +روف 7695 +▁よろしく 7696 +▁BANTUAN 7697 +▁ตกใจ 7698 +▁ТАКИМ 7699 +ناقش 7700 +▁المدن 7701 +▁đón 7702 +▁PENUMPANG 7703 +▁BERAT 7704 +▁СТРАНЫ 7705 +▁รอย 7706 +逆 7707 +▁COMMON 7708 +СКОЕ 7709 +彼 7710 +姓 7711 +▁DECIDE 7712 +HIN 7713 +題 7714 +▁غزة 7715 +ЕНИЮ 7716 +▁コロナ 7717 +GENERA 7718 +▁BANGET 7719 +▁KATAKAN 7720 +▁บริษัท 7721 +HOP 7722 +SAUDARA 7723 +▁พนักงาน 7724 +▁ГОРОДЕ 7725 +▁БЛАГО 7726 +عندما 7727 +▁KOMISI 7728 +▁AGREE 7729 +แต 7730 +▁ЗАКАЗ 7731 +▁khóa 7732 +▁子ども 7733 +療 7734 +▁عنه 7735 +HITUNG 7736 +ОВОЙ 7737 +ИРУЕТ 7738 +▁มีโอกาส 7739 +CONTOH 7740 +▁tim 7741 +疫 7742 +СТРЕЛ 7743 +▁تست 7744 +▁ควบคุม 7745 +▁กิ 7746 +НОВОСИБИРСК 7747 +▁PIECE 7748 +▁ทุ่ม 7749 +ЗЕР 7750 +▁mẫu 7751 +色 7752 +00 7753 +ولي 7754 +VAN 7755 +▁gió 7756 +▁午後 7757 +بغ 7758 +こう 7759 +▁INCLUDE 7760 +MAU 7761 +▁tướng 7762 +حتاج 7763 +็บ 7764 +КОМАНД 7765 +บุคคล 7766 +▁ยาก 7767 +▁時代 7768 +NOVA 7769 +▁RELATIONSHIP 7770 +РУБ 7771 +▁ТАКОГО 7772 +▁ISSUE 7773 +▁CERTAIN 7774 +▁API 7775 +▁BADAN 7776 +▁RISK 7777 +▁NORTH 7778 +▁เกือบ 7779 +SEBAGIAN 7780 +HOL 7781 +▁HIMSELF 7782 +MESKIPUN 7783 +▁БИЗНЕС 7784 +КОС 7785 +▁見せ 7786 +OX 7787 +▁ぶり 7788 +かい 7789 +ЗОН 7790 +▁PERJALANAN 7791 +黒 7792 +فض 7793 +▁tệ 7794 +ИЛОСЬ 7795 +تغيير 7796 +ITULAH 7797 +▁นับ 7798 +إنما 7799 +甘 7800 +暗 7801 +増 7802 +術 7803 +АЛАСЬ 7804 +▁الدولية 7805 +ФЕР 7806 +▁ISU 7807 +▁الفلسطينية 7808 +▁SELA 7809 +▁bò 7810 +幕 7811 +خير 7812 +▁ค่อนข้าง 7813 +迫 7814 +علن 7815 +ПРОБ 7816 +▁СВОИМ 7817 +ОКАЗЫВА 7818 +▁INSIDE 7819 +▁DIFFICULT 7820 +働 7821 +▁KPU 7822 +▁MEMILIH 7823 +▁dòng 7824 +▁FIGHT 7825 +▁ACTION 7826 +▁СОВСЕМ 7827 +▁giản 7828 +UNJUK 7829 +EAST 7830 +ИЗМ 7831 +革 7832 +▁LINGKUNGAN 7833 +▁FORWARD 7834 +▁เนื่องจาก 7835 +LAU 7836 +▁ФРАНЦУЗСКОГО 7837 +▁phê 7838 +▁GLOBAL 7839 +ТВОР 7840 +▁ДОЛГО 7841 +▁TAKING 7842 +▁รวมถึง 7843 +▁เปิดเผย 7844 +▁PIKIR 7845 +สถาน 7846 +▁БУДЕМ 7847 +JER 7848 +▁sửa 7849 +▁ALONG 7850 +علاقات 7851 +▁อิ 7852 +ЛАН 7853 +▁nghi 7854 +路 7855 +ếu 7856 +АМЕРИКАН 7857 +▁FIRE 7858 +▁LAUT 7859 +تحول 7860 +MILI 7861 +ESPECIALLY 7862 +▁МОЖЕШЬ 7863 +▁去年 7864 +▁ولم 7865 +ضرب 7866 +▁起き 7867 +暖 7868 +▁SITUASI 7869 +▁tấn 7870 +ПРОГРАММ 7871 +▁เท่าไหร่ 7872 +▁СВОИХ 7873 +▁МАЛО 7874 +過 7875 +▁MONTHS 7876 +▁mối 7877 +chị 7878 +▁DOOR 7879 +ГАН 7880 +▁เดียวกัน 7881 +▁ТИПА 7882 +▁WOMAN 7883 +▁พี่น้อง 7884 +▁ЭТОМУ 7885 +الآن 7886 +▁tặng 7887 +付 7888 +▁ПОНЯЛ 7889 +▁อุบัติเหตุ 7890 +كتاب 7891 +▁НОВОСТИ 7892 +ИЧНО 7893 +ПРОДОЛЖА 7894 +▁ПОЛУЧАЕТСЯ 7895 +作 7896 +كبر 7897 +▁อนุ 7898 +or 7899 +▁ПЯТИ 7900 +▁BECAME 7901 +YOUR 7902 +▁นุ 7903 +▁NEAR 7904 +PADAHAL 7905 +▁thận 7906 +▁tân 7907 +郎 7908 +وص 7909 +▁تريد 7910 +ОБЩЕСТВЕНН 7911 +▁MANUSIA 7912 +СТОР 7913 +▁เมา 7914 +▁وعلى 7915 +▁เจ็บ 7916 +▁ボール 7917 +▁trao 7918 +午 7919 +▁ơi 7920 +▁nắng 7921 +БИТ 7922 +حاد 7923 +▁ЧИСЛЕ 7924 +辺 7925 +▁PERUBAHAN 7926 +▁POLICE 7927 +▁DISCUSS 7928 +▁أساس 7929 +平 7930 +СТРОЕН 7931 +▁tắc 7932 +ПРИНИМА 7933 +▁状態 7934 +▁thôn 7935 +▁ПРИЧИН 7936 +車 7937 +▁เช่น 7938 +▁PIDANA 7939 +▁AMERICA 7940 +LIMA 7941 +弱 7942 +障 7943 +MIR 7944 +▁FALL 7945 +▁حين 7946 +СЛУШАЙ 7947 +▁ЧАСТ 7948 +佐 7949 +LOOK 7950 +趣 7951 +▁PROTECT 7952 +▁nhẹ 7953 +▁البلد 7954 +BP 7955 +UNDANG 7956 +▁LOOKED 7957 +bà 7958 +▁被害 7959 +▁tri 7960 +▁buồn 7961 +▁AGAMA 7962 +روسيا 7963 +ียว 7964 +ISTIC 7965 +▁มีเรื่อง 7966 +▁大丈夫 7967 +踏 7968 +▁СМОТРЕТЬ 7969 +ЗНАКОМ 7970 +DOK 7971 +▁決め 7972 +РОССИЙСКО 7973 +DERA 7974 +LENGKAP 7975 +▁ําเภอ 7976 +رجل 7977 +▁คล้าย 7978 +抜 7979 +▁الحوار 7980 +▁BUY 7981 +MATE 7982 +▁hùng 7983 +▁БОЛЬШОЙ 7984 +РАНЕЕ 7985 +سمح 7986 +ЛЕГ 7987 +đến 7988 +▁ОНЛАЙН 7989 +▁BERLANGSUNG 7990 +▁НОЧЬ 7991 +СЛЕДОВ 7992 +患 7993 +▁เขียน 7994 +สร้าง 7995 +AKTIVITAS 7996 +暑 7997 +FULLY 7998 +▁ДАЛЕЕ 7999 +▁言う 8000 +▁tận 8001 +時 8002 +▁FACEBOOK 8003 +▁BOY 8004 +قابل 8005 +ميل 8006 +▁PEMAIN 8007 +均 8008 +名 8009 +たく 8010 +ОЧКА 8011 +▁sẵn 8012 +▁MISS 8013 +▁話し 8014 +▁ENTIRE 8015 +▁TEPAT 8016 +▁САМИ 8017 +▁BASICALLY 8018 +▁РАБОТУ 8019 +▁กลับบ้าน 8020 +▁لما 8021 +▁ACARA 8022 +吹 8023 +برلمان 8024 +BACK 8025 +ЩЕН 8026 +ROLL 8027 +bộ 8028 +▁hôn 8029 +▁الدين 8030 +ستمر 8031 +▁ACCESS 8032 +▁กระทรวง 8033 +▁ร่วมกัน 8034 +尾 8035 +▁ДОБАВИЛ 8036 +ЛЕМ 8037 +▁КАКИХ 8038 +▁GIVEN 8039 +▁quang 8040 +▁คนไทย 8041 +▁BAHAN 8042 +COLLECT 8043 +込ん 8044 +▁ขาด 8045 +สัญญา 8046 +▁増え 8047 +قوى 8048 +▁وغير 8049 +▁ЦЕНЫ 8050 +▁政府 8051 +▁DRIVE 8052 +▁ДУМАЛ 8053 +▁ทะเลาะ 8054 +パー 8055 +ديمقراطي 8056 +اللهم 8057 +▁ご覧 8058 +▁معنا 8059 +át 8060 +▁tạm 8061 +ВСЁ 8062 +مركز 8063 +▁bù 8064 +袋 8065 +▁phạt 8066 +▁BELAKANG 8067 +استخدام 8068 +▁YORK 8069 +▁กรม 8070 +DEMI 8071 +配 8072 +▁المسلمين 8073 +OW 8074 +ЩИЙ 8075 +▁学校 8076 +▁نوع 8077 +▁เพื่อให้ 8078 +▁КОТОРОЙ 8079 +DAFTAR 8080 +▁REACH 8081 +▁PENYI 8082 +PY 8083 +СЕЙЧАС 8084 +PROFESSOR 8085 +▁bạc 8086 +▁SPECIAL 8087 +ЛЕЧ 8088 +▁siêu 8089 +▁ล้ม 8090 +บู 8091 +▁TERLIHAT 8092 +حديث 8093 +IFIED 8094 +▁WHATEVER 8095 +ЮЩИХ 8096 +▁الأخ 8097 +KHUSUSNYA 8098 +BERDASARKAN 8099 +▁SEND 8100 +▁giỏi 8101 +ПРИЯТН 8102 +▁ДЕВЯТ 8103 +▁MENGAMBIL 8104 +▁ПЕРЕВЕДЁННОГО 8105 +ТУРИСТ 8106 +▁KNOWN 8107 +▁ก่อ 8108 +▁PROTOKOL 8109 +忍 8110 +HAVE 8111 +采 8112 +▁MORNING 8113 +伸 8114 +総 8115 +ショ 8116 +▁MULTI 8117 +اقتصاد 8118 +ШЕЛ 8119 +การณ์ 8120 +▁ผู้ก่อเหตุ 8121 +メン 8122 +▁ตั้งใจ 8123 +撃 8124 +▁MENERIMA 8125 +秦 8126 +▁ПЕРЕВОДИТСЯ 8127 +CIL 8128 +▁ВАМИ 8129 +أهلا 8130 +▁بكم 8131 +切り 8132 +ГАЗ 8133 +要 8134 +زع 8135 +ない 8136 +▁MENUNGGU 8137 +途 8138 +▁สนาม 8139 +▁แพง 8140 +▁KEBUTUHAN 8141 +▁ГОВОРИТЬ 8142 +ЕННЫЕ 8143 +ГОСУДАРСТВЕННОГО 8144 +▁ต่อเนื่อง 8145 +▁lũ 8146 +▁すぐ 8147 +▁FAIR 8148 +▁الخليج 8149 +▁МОЯ 8150 +▁เรื่อย 8151 +INCLUDING 8152 +غي 8153 +▁แซ 8154 +▁ที่ไหน 8155 +▁新た 8156 +طرح 8157 +▁VOICE 8158 +▁OFFER 8159 +頂 8160 +▁DEMOKRAT 8161 +▁ДЕТЕЙ 8162 +▁ระวัง 8163 +キー 8164 +món 8165 +▁予想 8166 +▁ПЕРЕВОДЧИК 8167 +KAI 8168 +ขาย 8169 +▁OFFICE 8170 +▁cận 8171 +所 8172 +▁العسكري 8173 +▁มานะ 8174 +كتب 8175 +SYARAT 8176 +▁違う 8177 +▁TECHNOLOGY 8178 +▁thuê 8179 +▁TENAGA 8180 +سؤال 8181 +▁ly 8182 +COMMUN 8183 +▁LAPORAN 8184 +▁ENERGY 8185 +▁xếp 8186 +▁biện 8187 +▁máu 8188 +LAPOR 8189 +▁RULE 8190 +ЧНЫХ 8191 +БУД 8192 +ГРО 8193 +▁MEMBANGUN 8194 +雲 8195 +▁ยาเสพติด 8196 +مارس 8197 +麦 8198 +▁mái 8199 +ทะเล 8200 +▁19 8201 +▁ИСПАНСКИЙ 8202 +宗 8203 +▁BEHIND 8204 +▁LOCAL 8205 +ФОТОГРАФ 8206 +FASILITAS 8207 +▁ПОЧТИ 8208 +▁โซเชียล 8209 +▁ยอด 8210 +أمن 8211 +АРТ 8212 +杯 8213 +BELUM 8214 +▁MILIK 8215 +▁LINK 8216 +鼠 8217 +▁يكن 8218 +ШЕСТ 8219 +▁niệm 8220 +▁METER 8221 +BED 8222 +▁แนว 8223 +▁EXPECT 8224 +ТРЕБ 8225 +ファ 8226 +▁ENVIRONMENT 8227 +▁bức 8228 +▁gà 8229 +▁DARIPADA 8230 +SCRIPT 8231 +都 8232 +ブル 8233 +▁วัยรุ่น 8234 +หวาน 8235 +▁ИДЁТ 8236 +▁ВЗЯТЬ 8237 +▁โชค 8238 +دى 8239 +橋 8240 +▁BAY 8241 +▁ชี้แจง 8242 +تحر 8243 +▁生き 8244 +咋 8245 +▁สมมุติ 8246 +▁POLRI 8247 +▁ทีเดียว 8248 +ربع 8249 +▁PERJUANGAN 8250 +欧 8251 +▁対策 8252 +▁คลอง 8253 +INSTEAD 8254 +إستراتيجي 8255 +▁นั่นเอง 8256 +KAPAN 8257 +シー 8258 +▁ITSELF 8259 +▁thẳng 8260 +رفض 8261 +▁MENUNJUKKAN 8262 +PEOPLE 8263 +▁POTENSI 8264 +▁大学 8265 +▁七十 8266 +庁 8267 +略 8268 +HANG 8269 +▁KANTOR 8270 +駅 8271 +▁đen 8272 +▁القرار 8273 +УСТАНОВИ 8274 +ЗИМ 8275 +足 8276 +لاق 8277 +▁hàn 8278 +▁REQUIRE 8279 +PLACE 8280 +▁MENDUKUNG 8281 +▁ГРАДУСОВ 8282 +税 8283 +▁SANG 8284 +▁入り 8285 +▁FUND 8286 +▁แชร์ 8287 +述 8288 +عظم 8289 +▁やり 8290 +▁nhắn 8291 +▁ПЕС 8292 +▁الأولى 8293 +▁ОБРАЗОМ 8294 +▁กระแส 8295 +▁HAPPY 8296 +СМОТРЕЛ 8297 +▁tôn 8298 +▁tốc 8299 +▁ЛЮБЛЮ 8300 +▁ALAM 8301 +▁SITUATION 8302 +СОВРЕМЕНН 8303 +EMPLOY 8304 +池 8305 +سير 8306 +▁đổ 8307 +ゼ 8308 +祖 8309 +МИЛЛИОН 8310 +▁RETURN 8311 +▁HAPPENS 8312 +▁БЕЛО 8313 +▁vững 8314 +KEL 8315 +▁EPISODE 8316 +▁MENDATANG 8317 +析 8318 +СТРОИТЬ 8319 +瑞 8320 +ДАЙ 8321 +POINT 8322 +▁วันนั้น 8323 +▁LEARNING 8324 +▁ตรงนั้น 8325 +▁ニュース 8326 +仕 8327 +▁高い 8328 +たっ 8329 +▁kênh 8330 +▁مما 8331 +▁КОТОРУЮ 8332 +ВОЛЬ 8333 +ساء 8334 +▁แปลก 8335 +▁最高 8336 +FROM 8337 +旧 8338 +WAJIB 8339 +▁КОЛИЧЕСТВО 8340 +伝 8341 +▁ระบบ 8342 +わっ 8343 +▁ศาล 8344 +▁СИНОНИМЫ 8345 +قيادة 8346 +▁กด 8347 +▁كانوا 8348 +▁GIMANA 8349 +▁ดังนั้น 8350 +CUM 8351 +食 8352 +▁СВОЁ 8353 +重 8354 +▁الحل 8355 +ล้อ 8356 +▁เนอะ 8357 +▁đài 8358 +▁قوات 8359 +観 8360 +▁TANYA 8361 +備 8362 +▁bè 8363 +握 8364 +▁TAX 8365 +▁紹介 8366 +付け 8367 +LOAD 8368 +▁SEGALA 8369 +BEBAS 8370 +▁sàng 8371 +▁強い 8372 +ウン 8373 +▁mừng 8374 +▁EASY 8375 +▁ISSUES 8376 +▁PICK 8377 +▁くれる 8378 +▁البلاد 8379 +▁MEMASTIKAN 8380 +▁EITHER 8381 +▁pha 8382 +▁cuốn 8383 +ái 8384 +▁รถกระบะ 8385 +TERKAIT 8386 +ЭН 8387 +▁MENGIKUTI 8388 +▁สอบถาม 8389 +ТАКЖЕ 8390 +DENGAR 8391 +▁เบื้องต้น 8392 +▁SOFTWARE 8393 +ETH 8394 +được 8395 +▁ВОСПРОИЗВЕДЕНИЕ 8396 +夜 8397 +▁ดังกล่าว 8398 +▁khô 8399 +▁MENDENGAR 8400 +▁trú 8401 +▁LIST 8402 +▁hẹn 8403 +▁kịp 8404 +▁結果 8405 +SEJAUH 8406 +▁プロ 8407 +勇 8408 +ДОКУМЕНТ 8409 +▁กันที่ 8410 +冠 8411 +▁บุ 8412 +▁chữ 8413 +▁MENTAL 8414 +資 8415 +▁العملية 8416 +▁終わ 8417 +沙 8418 +耳 8419 +▁tụ 8420 +▁DIANGGAP 8421 +▁จับกลุ่ม 8422 +ПИЛ 8423 +▁ชื่อว่า 8424 +▁الحديث 8425 +▁dữ 8426 +規 8427 +▁НОРМАЛЬНО 8428 +تغير 8429 +▁PASANGAN 8430 +▁ДОСТУП 8431 +СТАВИЛ 8432 +PERFECT 8433 +МИЛ 8434 +▁huế 8435 +ВЕЛО 8436 +إطلاق 8437 +サイ 8438 +▁นักข่าว 8439 +جاب 8440 +مناطق 8441 +▁СЛИШКОМ 8442 +虚 8443 +▁cán 8444 +▁hô 8445 +إخوان 8446 +اقت 8447 +▁SPEND 8448 +餐 8449 +巡 8450 +浪 8451 +▁ตุ 8452 +БИН 8453 +ครอง 8454 +▁КИТАЙ 8455 +▁ПЛОХО 8456 +経 8457 +ประโยชน์ 8458 +崎 8459 +CHES 8460 +ักษ์ 8461 +▁xưa 8462 +▁الخارجية 8463 +▁แทง 8464 +▁ส่วนใหญ่ 8465 +ساح 8466 +▁rượu 8467 +▁СКАЗАЛА 8468 +▁今年 8469 +▁相手 8470 +MENJADI 8471 +▁СТАЛИ 8472 +▁НЕОБХОДИМО 8473 +▁DIFFERENCE 8474 +烈 8475 +TOWN 8476 +海 8477 +▁DIKATAKAN 8478 +ぁ 8479 +لعب 8480 +▁PICTURE 8481 +▁CULTURE 8482 +▁DETAIL 8483 +▁PULAU 8484 +cách 8485 +▁ЖИВОТ 8486 +عطي 8487 +▁GIRL 8488 +▁وقت 8489 +▁suốt 8490 +▁MEETING 8491 +اغ 8492 +示 8493 +▁นักท่องเที่ยว 8494 +▁الليبي 8495 +▁PENGGUNA 8496 +مؤسسات 8497 +حافظ 8498 +POLDA 8499 +▁EARTH 8500 +▁طريق 8501 +▁ДОЛЖНО 8502 +МИСС 8503 +能 8504 +ГУЛЯ 8505 +▁ЯВЛЯЕТСЯ 8506 +▁الانتخابات 8507 +CAST 8508 +▁UNIT 8509 +▁MENDAPAT 8510 +新 8511 +▁PARK 8512 +▁ГОВОРЯТ 8513 +ろう 8514 +đặc 8515 +RAWAT 8516 +▁kẻ 8517 +▁SOCIETY 8518 +▁代表 8519 +▁РАБОТАЕТ 8520 +丁 8521 +▁nà 8522 +かん 8523 +▁SEEMS 8524 +▁แล้วกัน 8525 +▁CHALLENGE 8526 +描 8527 +▁RATA 8528 +МЕТР 8529 +صير 8530 +威 8531 +ПИСАЛ 8532 +雄 8533 +ラー 8534 +MOHON 8535 +▁ท่วม 8536 +ОДНАКО 8537 +▁ระบุ 8538 +▁القوى 8539 +▁đốc 8540 +برج 8541 +FOKUS 8542 +▁บี 8543 +▁buộc 8544 +▁ほしい 8545 +▁thuế 8546 +▁GUESS 8547 +OLOGY 8548 +▁ซะ 8549 +▁สงสัย 8550 +▁POLICY 8551 +BIAR 8552 +▁たくさん 8553 +▁ตัดสินใจ 8554 +CLAIM 8555 +▁PEREMPUAN 8556 +▁午前 8557 +▁وإن 8558 +▁総理 8559 +▁niên 8560 +โอกาส 8561 +▁向け 8562 +避 8563 +ПОСТРОЙ 8564 +كانت 8565 +戸 8566 +識 8567 +情 8568 +▁أبو 8569 +▁mãi 8570 +ゲ 8571 +囲 8572 +PERTAMA 8573 +▁الشرق 8574 +▁JOKO 8575 +▁tết 8576 +▁様子 8577 +▁ทา 8578 +200 8579 +▁ВЫБОР 8580 +▁แทน 8581 +▁น่ะ 8582 +▁เฉพาะ 8583 +▁ほか 8584 +湖 8585 +▁สู่ 8586 +▁FAST 8587 +bãi 8588 +▁عدم 8589 +▁hy 8590 +▁ซี 8591 +▁ดิ 8592 +PENGARUH 8593 +▁หน่วยงาน 8594 +НАДЦАТЬ 8595 +▁ПРАВИЛЬНО 8596 +▁天気 8597 +▁注目 8598 +ЭЙ 8599 +ЦОВ 8600 +▁PRACTICE 8601 +КОТОРОЕ 8602 +▁STREET 8603 +▁يوجد 8604 +▁tá 8605 +▁СМАРТ 8606 +▁bữa 8607 +ผู้ 8608 +▁DAMPAK 8609 +ЛЕЗ 8610 +ЧТОБЫ 8611 +▁МНОЙ 8612 +TRAIN 8613 +▁COLLEGE 8614 +جتمع 8615 +وظ 8616 +▁ได้มา 8617 +▁สังเกต 8618 +▁СЧИТАЮ 8619 +▁أكبر 8620 +▁ACCOUNT 8621 +IGN 8622 +ШЕЙ 8623 +▁調べ 8624 +▁تماما 8625 +▁ОКАЗА 8626 +ПОЧЕМУ 8627 +▁SAMPAH 8628 +▁tồn 8629 +▁OUTSIDE 8630 +▁นี้แหละ 8631 +▁FAVOR 8632 +字 8633 +▁ซ้ํา 8634 +▁سنوات 8635 +▁họp 8636 +วิทยา 8637 +▁明日 8638 +▁RATHER 8639 +▁家族 8640 +▁СОБСТВЕННО 8641 +談 8642 +▁mê 8643 +وصف 8644 +▁НАЧАЛА 8645 +▁ส่วนตัว 8646 +▁知ら 8647 +▁料理 8648 +СИН 8649 +สูง 8650 +ЖЕЛЕЗНОДОРОЖН 8651 +▁DINAS 8652 +▁ПЛЯЖ 8653 +▁現場 8654 +مثال 8655 +đúng 8656 +▁điển 8657 +СЛАВ 8658 +ไฟฟ้า 8659 +マン 8660 +▁بكل 8661 +TENG 8662 +▁EYES 8663 +▁الأخرى 8664 +ГОСУДАРСТВ 8665 +СПОЛЬЗ 8666 +▁rừng 8667 +▁今後 8668 +СМЫСЛ 8669 +▁cú 8670 +▁ТОМУ 8671 +▁SURVEI 8672 +وصول 8673 +▁โปร 8674 +▁GAVE 8675 +เสริม 8676 +▁部分 8677 +▁จี 8678 +ويل 8679 +ГЛЯД 8680 +БЛЮД 8681 +伊 8682 +ВЕДЕНИЯ 8683 +▁HAKIM 8684 +el 8685 +ขวัญ 8686 +▁KETERANGAN 8687 +続 8688 +▁عشر 8689 +▁ВЕЧЕРОМ 8690 +ồn 8691 +▁BERKE 8692 +HUN 8693 +▁ЗНАЛ 8694 +▁PARENTS 8695 +▁確か 8696 +▁บัตร 8697 +▁อาวุธ 8698 +▁แบ 8699 +▁tạp 8700 +▁KAMPUNG 8701 +▁CAMP 8702 +▁ให้การ 8703 +ИЧЕСКОГО 8704 +▁الدستور 8705 +▁الجديد 8706 +▁ความเชื่อ 8707 +▁CHURCH 8708 +よ 8709 +พันธุ์ 8710 +▁DRUG 8711 +▁vé 8712 +▁LISTRIK 8713 +▁huyết 8714 +恩 8715 +▁อย่างนั้น 8716 +▁КУЛЬТУР 8717 +معركة 8718 +ABSOLUTELY 8719 +طائفي 8720 +後 8721 +験 8722 +▁กอ 8723 +عش 8724 +คุณ 8725 +▁ยู 8726 +▁بإ 8727 +▁ПРОБЛЕМ 8728 +防 8729 +РУШ 8730 +▁ผู้ป่วย 8731 +▁最初 8732 +▁tiêm 8733 +bo 8734 +▁СПАС 8735 +知 8736 +確 8737 +▁ที่แล้ว 8738 +حاكم 8739 +FLOW 8740 +РОЗ 8741 +ИТЕЛЬНО 8742 +▁rút 8743 +▁PAPER 8744 +▁НОРМ 8745 +▁วจะ 8746 +▁bật 8747 +祝 8748 +ГЛУ 8749 +ЮЩИЕ 8750 +PROSES 8751 +▁MIDDLE 8752 +▁見る 8753 +▁GOLKAR 8754 +▁nhằm 8755 +ื้น 8756 +▁ИСТОРИИ 8757 +空 8758 +طاب 8759 +▁การเมือง 8760 +СДЕЛАЙ 8761 +徒 8762 +▁HUGE 8763 +▁映像 8764 +IFY 8765 +▁เร่ง 8766 +คดี 8767 +▁เย 8768 +TAHUN 8769 +▁هنالك 8770 +DAHULU 8771 +▁niềm 8772 +SELAMA 8773 +直 8774 +HOOD 8775 +▁近く 8776 +KP 8777 +▁СОЖАЛЕНИЮ 8778 +▁TOKOH 8779 +▁chấm 8780 +เกล 8781 +▁例えば 8782 +▁SULIT 8783 +▁SEKTOR 8784 +硬 8785 +▁khuyến 8786 +TINDAK 8787 +قيم 8788 +▁ЗАЯВ 8789 +▁ГРУ 8790 +▁trắng 8791 +▁IMPACT 8792 +遍 8793 +ダー 8794 +▁STAFF 8795 +▁НЁМ 8796 +▁พลัง 8797 +▁thờ 8798 +ОЧКИ 8799 +▁trụ 8800 +箱 8801 +▁APPEAR 8802 +▁trông 8803 +▁СПИСОК 8804 +▁ความคืบหน้า 8805 +▁khoán 8806 +▁มอเตอร์ไซค์ 8807 +▁DEVELOPMENT 8808 +KAMPANYE 8809 +▁ค่อย 8810 +hủy 8811 +РАССКАЗЫВА 8812 +▁ไข่ 8813 +▁やはり 8814 +フィ 8815 +▁НАШЕЙ 8816 +▁НОВЫЕ 8817 +ХОЧЕШЬ 8818 +▁สัมภาษณ์ 8819 +▁いろんな 8820 +▁MODERN 8821 +▁ป้าย 8822 +▁แผน 8823 +▁คณะ 8824 +▁関東 8825 +▁EAT 8826 +صاب 8827 +مجموعة 8828 +▁CONTENT 8829 +▁ألف 8830 +НАХОДИ 8831 +護 8832 +▁SIMPLE 8833 +▁番組 8834 +任 8835 +▁คุณหมอ 8836 +▁thuyết 8837 +trên 8838 +خلاف 8839 +PERHAPS 8840 +ИЧЕСКИЙ 8841 +ثورة 8842 +▁đem 8843 +▁giảng 8844 +▁TAKEN 8845 +▁GANJAR 8846 +ิ้ว 8847 +▁КИЛОМЕТРОВ 8848 +СПИ 8849 +بالتالي 8850 +欠 8851 +خدم 8852 +▁الجو 8853 +▁รางวัล 8854 +▁МУЖ 8855 +▁逮捕 8856 +ШИБ 8857 +▁HAPPENING 8858 +▁คงจะ 8859 +▁หลบหนี 8860 +▁八十 8861 +POSE 8862 +▁อาชีพ 8863 +▁สูตร 8864 +ử 8865 +▁LOST 8866 +▁GURU 8867 +▁rác 8868 +▁ซิ 8869 +▁ชุมชน 8870 +営 8871 +托 8872 +殿 8873 +盗 8874 +▁cục 8875 +▁ngắn 8876 +▁CHARACTER 8877 +▁お前 8878 +ПЛЕ 8879 +ぜ 8880 +▁ขวบ 8881 +▁นาฬิกา 8882 +HEY 8883 +▁СВОЕГО 8884 +▁なんて 8885 +▁เป็นที่ 8886 +▁UPON 8887 +▁ECONOMIC 8888 +ضغط 8889 +▁EVIDENCE 8890 +ЛЕР 8891 +qua 8892 +▁ОДНОГО 8893 +▁เกาะ 8894 +▁บ่อย 8895 +▁ขอโทษ 8896 +▁ПРОБЛЕМА 8897 +số 8898 +ШИМ 8899 +▁ดิฉัน 8900 +▁الأزمة 8901 +半 8902 +▁THIRD 8903 +WARGA 8904 +▁MATERIAL 8905 +童 8906 +▁COMPANIES 8907 +▁KONTEKS 8908 +▁СТАНЦИИ 8909 +اجتماع 8910 +▁بهذه 8911 +ИНОГДА 8912 +▁งู 8913 +睛 8914 +▁GERINDRA 8915 +▁やる 8916 +▁ПРАВО 8917 +▁АДРЕС 8918 +▁事故 8919 +▁КАКОЕ 8920 +▁SUNGAI 8921 +RAW 8922 +ULAR 8923 +▁นก 8924 +師 8925 +透 8926 +固 8927 +▁يجري 8928 +bên 8929 +▁hiệp 8930 +植 8931 +▁الأقل 8932 +▁พัง 8933 +▁ПРИМЕРНО 8934 +ВЕРШ 8935 +▁MINTA 8936 +▁المناطق 8937 +▁lãi 8938 +▁لهذا 8939 +▁กล่าว 8940 +شارك 8941 +▁СВОЕ 8942 +階 8943 +▁タイ 8944 +▁ซอย 8945 +ВЕЛ 8946 +▁ПОСТОЯННО 8947 +▁NICE 8948 +تنفيذ 8949 +▁MERAH 8950 +▁phiếu 8951 +証 8952 +▁MILIAR 8953 +▁bó 8954 +▁COMMENT 8955 +نصر 8956 +▁BEGAN 8957 +虎 8958 +СКОПИРУЙ 8959 +雅 8960 +▁TEKNOLOGI 8961 +▁كثيرة 8962 +تعاون 8963 +仙 8964 +▁НОВЫЙ 8965 +▁الأمم 8966 +段 8967 +▁FEAR 8968 +▁المقاومة 8969 +10 8970 +ПЕРВЫХ 8971 +▁JUSTICE 8972 +侵 8973 +БЕГ 8974 +▁EXPLAIN 8975 +▁HUJAN 8976 +▁MAJU 8977 +معلومات 8978 +▁オー 8979 +▁تقوم 8980 +タン 8981 +▁sỹ 8982 +▁cắt 8983 +▁地域 8984 +▁ВРОДЕ 8985 +หนังสือ 8986 +▁الحوثي 8987 +▁เมนู 8988 +ПИСАТЬ 8989 +▁WEBSITE 8990 +▁หมู่ 8991 +ЩЕНИЯ 8992 +▁รุ่น 8993 +▁thác 8994 +БУДЕТ 8995 +أعمال 8996 +WOOD 8997 +援 8998 +唯 8999 +▁PARTY 9000 +▁دائما 9001 +▁なかなか 9002 +▁TRAVEL 9003 +▁КНИГ 9004 +▁ВОСЬМ 9005 +▁TERBUKA 9006 +▁HUTAN 9007 +▁HAJI 9008 +▁ПОСТАВИЛ 9009 +▁ORIGIN 9010 +▁ЛУЧ 9011 +フェ 9012 +尊 9013 +▁KERETA 9014 +▁BOLA 9015 +演 9016 +▁INTERNAL 9017 +約 9018 +▁SUMBER 9019 +▁RECEIVE 9020 +▁TAHAP 9021 +局 9022 +▁PHONE 9023 +ЦАР 9024 +▁USIA 9025 +禁 9026 +▁lô 9027 +▁นายกรัฐมนตรี 9028 +▁ROLE 9029 +▁INTERNET 9030 +hoặc 9031 +تطور 9032 +▁JENIS 9033 +▁ПОЛНОСТЬЮ 9034 +帯 9035 +إجراء 9036 +SIGHT 9037 +▁SEBELAS 9038 +持 9039 +▁CRITIC 9040 +▁ОКОЛО 9041 +MASYARAKAT 9042 +▁СЛУЧАЙ 9043 +ؤمن 9044 +仲 9045 +ượng 9046 +▁SOON 9047 +▁sóng 9048 +قضايا 9049 +لدينا 9050 +アン 9051 +▁PIMPINAN 9052 +▁DOCTOR 9053 +▁СВОБОД 9054 +▁rơi 9055 +▁ทันที 9056 +▁TERTENTU 9057 +▁生活 9058 +▁บ่าย 9059 +珍 9060 +▁АЛЕКСАНДР 9061 +▁ngờ 9062 +▁มากขึ้น 9063 +話 9064 +▁REFER 9065 +ГРИ 9066 +SEPAKAT 9067 +▁IMAGE 9068 +▁لكم 9069 +▁ย้อน 9070 +▁thí 9071 +DOWN 9072 +甲 9073 +▁ยื่น 9074 +器 9075 +▁INCREASE 9076 +▁中心 9077 +▁МЕНЕЕ 9078 +▁فعلا 9079 +▁もっと 9080 +圧 9081 +▁PRIBADI 9082 +▁УТРО 9083 +ナー 9084 +КЛАСС 9085 +▁سنة 9086 +ثر 9087 +▁اللبناني 9088 +▁นิดนึง 9089 +▁NUR 9090 +▁行き 9091 +▁chóng 9092 +▁MASKER 9093 +▁cưới 9094 +▁ПРИЗНА 9095 +▁当時 9096 +▁khổ 9097 +▁ДОМОЙ 9098 +▁พอดี 9099 +СЛОЖ 9100 +つく 9101 +▁ผี 9102 +▁ЧАСТИ 9103 +染 9104 +▁ГОВОРЮ 9105 +▁AMOUNT 9106 +性 9107 +▁ป้องกัน 9108 +並 9109 +▁SEVERAL 9110 +▁БИЛЕТЫ 9111 +▁น่ง 9112 +▁ผู้สื่อข่าว 9113 +ОЧЕНЬ 9114 +▁DISEASE 9115 +▁ДОЛЖНА 9116 +▁สําเร็จ 9117 +▁ИТОГЕ 9118 +▁БЫСТРО 9119 +▁意味 9120 +▁thừa 9121 +▁TALKED 9122 +ПИСАН 9123 +▁BIKIN 9124 +▁dừng 9125 +馬 9126 +▁AUTO 9127 +▁動き 9128 +磨 9129 +▁tái 9130 +▁CENTURY 9131 +▁กล้อง 9132 +▁mét 9133 +▁สมัย 9134 +▁เชียงใหม่ 9135 +СЕК 9136 +辞 9137 +▁TRUTH 9138 +▁cánh 9139 +▁高校 9140 +▁PERGI 9141 +▁RICH 9142 +▁WIDODO 9143 +▁ПОРЯДКЕ 9144 +AKHIRNYA 9145 +فرض 9146 +▁かなり 9147 +▁VAKSINASI 9148 +ゅ 9149 +▁يقوم 9150 +sh 9151 +▁tầng 9152 +継 9153 +СИЛЬ 9154 +▁السلاح 9155 +▁APPROACH 9156 +▁COLOR 9157 +満 9158 +▁ดาว 9159 +宿 9160 +▁จากนี้ 9161 +▁大事 9162 +▁WRITING 9163 +▁đích 9164 +▁กัด 9165 +▁大谷 9166 +▁ห่าง 9167 +▁APPLICATION 9168 +▁PENGU 9169 +ТЕХНОЛОГ 9170 +▁SOURCE 9171 +▁COULDN 9172 +▁وأنا 9173 +▁وسلم 9174 +باط 9175 +格 9176 +▁พ่อแม่ 9177 +徐 9178 +▁พัฒนา 9179 +▁ประสบ 9180 +▁落ち 9181 +▁ไหว้ 9182 +▁超え 9183 +ГРАН 9184 +▁EVA 9185 +BLO 9186 +▁NATURAL 9187 +DISCOVER 9188 +▁ЗНАЧЕНИЯ 9189 +亡 9190 +بني 9191 +صعب 9192 +THOSE 9193 +▁二百 9194 +สินค้า 9195 +▁thù 9196 +ОТКРЫВ 9197 +難 9198 +▁言い 9199 +▁vời 9200 +НСКОГО 9201 +ПЕТЕРБУРГ 9202 +▁يحدث 9203 +ОЦЕН 9204 +▁ATTENTION 9205 +刑 9206 +▁TECH 9207 +▁tuyên 9208 +▁SAFE 9209 +ГРАФ 9210 +▁CHINA 9211 +ทรัพย์ 9212 +丸 9213 +沈 9214 +▁เพื่อที่จะ 9215 +NDRA 9216 +▁ПРОЦЕСС 9217 +▁القضية 9218 +▁SIXTY 9219 +陸 9220 +▁gắn 9221 +▁الحوثيين 9222 +▁الطرف 9223 +▁МОЖЕМ 9224 +▁واحدة 9225 +▁CELL 9226 +▁TUBUH 9227 +قطع 9228 +KALA 9229 +БОЛЬШОЕ 9230 +▁หัน 9231 +▁BUTUH 9232 +▁HOTEL 9233 +ВЛЕК 9234 +▁GONE 9235 +▁進め 9236 +▁АБСОЛЮТНО 9237 +▁PENANGANAN 9238 +▁đoán 9239 +▁ПРАКТИЧЕСКИ 9240 +▁dịp 9241 +急 9242 +▁لهذه 9243 +БЕН 9244 +▁SLEEP 9245 +敬 9246 +▁داعش 9247 +▁GEDUNG 9248 +ืด 9249 +▁وهناك 9250 +細 9251 +▁КОТОРОМ 9252 +▁ЛИНИИ 9253 +▁CODE 9254 +▁ПОКУПА 9255 +▁FAKTA 9256 +chủ 9257 +▁ธน 9258 +▁ホーム 9259 +▁АНТОНИМЫ 9260 +▁อร่อย 9261 +▁ทรง 9262 +ЧНАЯ 9263 +ИВАЮТ 9264 +▁รํา 9265 +▁НАШИХ 9266 +▁cam 9267 +▁ปัจจุบัน 9268 +▁SANDI 9269 +▁REMAIN 9270 +▁CANNOT 9271 +がる 9272 +▁ชัด 9273 +يفة 9274 +▁ГРАЖДАН 9275 +臣 9276 +▁รัฐมนตรี 9277 +▁МОГЛИ 9278 +▁TANGGA 9279 +▁lái 9280 +▁السؤال 9281 +嫁 9282 +ЭТ 9283 +▁СМОГУ 9284 +▁ครั้งหนึ่ง 9285 +ชี 9286 +▁๒๓ 9287 +▁เมื่อกี้ 9288 +▁แบ่ง 9289 +▁ПОСМОТРИМ 9290 +▁ฟ้อง 9291 +▁جيد 9292 +▁GREEN 9293 +▁ТОРГОВ 9294 +▁ช้าง 9295 +▁РЕШЕНИЕ 9296 +▁เก่ง 9297 +АЛЬНЫЕ 9298 +伯 9299 +▁ПРОБЛЕМЫ 9300 +ЗВОН 9301 +▁ひと 9302 +▁ต่ํา 9303 +تقرير 9304 +▁บ่อ 9305 +▁СТОРОН 9306 +ПОЛЬ 9307 +▁NATION 9308 +▁ปลอดภัย 9309 +▁สืบ 9310 +▁صلى 9311 +版 9312 +▁大きく 9313 +▁تركيا 9314 +▁DROP 9315 +▁สะพาน 9316 +▁عمر 9317 +BEBERAPA 9318 +酸 9319 +▁MC 9320 +▁BIDANG 9321 +▁สภา 9322 +▁CORONA 9323 +▁thải 9324 +▁DISC 9325 +復 9326 +▁cháy 9327 +▁ธุรกิจ 9328 +欲 9329 +▁الموقف 9330 +▁بسبب 9331 +▁ДЕНЕГ 9332 +توقع 9333 +وعد 9334 +価 9335 +券 9336 +▁DITEMUKAN 9337 +จักร 9338 +АТИВ 9339 +ПИСЬ 9340 +▁HARAPAN 9341 +آخر 9342 +▁الأطراف 9343 +عكس 9344 +▁なぜ 9345 +ريد 9346 +糖 9347 +▁đắt 9348 +遺 9349 +▁パン 9350 +▁AMONG 9351 +ЧЕСТВО 9352 +▁คอย 9353 +▁สพ 9354 +▁MENEMUKAN 9355 +▁流れ 9356 +▁УТРОМ 9357 +▁全部 9358 +▁ДОРОГО 9359 +因 9360 +▁PERATURAN 9361 +▁PARTNER 9362 +は 9363 +▁WALL 9364 +▁ВЕЩИ 9365 +▁НЕЛЬЗЯ 9366 +阪 9367 +位 9368 +▁くらい 9369 +FUNGSI 9370 +ぱ 9371 +▁うわ 9372 +灯 9373 +▁LEGAL 9374 +▁นอกจาก 9375 +▁song 9376 +▁РОЛИК 9377 +偏 9378 +敗 9379 +▁อีกที 9380 +▁GRAND 9381 +إرهاب 9382 +▁写真 9383 +▁QUICKLY 9384 +▁trương 9385 +mười 9386 +رفع 9387 +▁KESEMPATAN 9388 +津 9389 +▁ПРОИСХОДИТ 9390 +ОПРЕДЕЛИ 9391 +РАБОТАЛ 9392 +火 9393 +▁ОСТАЛЬН 9394 +▁TEND 9395 +▁ทั่ว 9396 +▁ВЗЯЛ 9397 +▁КРУП 9398 +▁ความผิด 9399 +▁โอเค 9400 +xi 9401 +▁МУЖЧИН 9402 +▁RUNNING 9403 +CINTA 9404 +▁dây 9405 +▁كذلك 9406 +▁PUSH 9407 +▁KONSTITUSI 9408 +主 9409 +▁PLATFORM 9410 +▁tòa 9411 +▁ЧАСА 9412 +تحد 9413 +▁قلت 9414 +湿 9415 +▁しよう 9416 +▁TURNED 9417 +費 9418 +▁nghèo 9419 +РОССИЯ 9420 +ГОСУДАРСТВЕНН 9421 +انقلاب 9422 +羽 9423 +▁đợt 9424 +流 9425 +芸 9426 +▁เมื่อคืน 9427 +▁RESMI 9428 +▁MESSAGE 9429 +ví 9430 +▁tấm 9431 +WELCOME 9432 +▁МУЗЫКА 9433 +▁trừ 9434 +保 9435 +▁ก่อนที่จะ 9436 +▁บาดเจ็บ 9437 +เล่น 9438 +▁ทั้งคู่ 9439 +軽 9440 +▁記録 9441 +▁MEMBUKA 9442 +▁BENEFIT 9443 +ЁШЬ 9444 +▁СОСТАВ 9445 +豪 9446 +▁CERTAINLY 9447 +▁TRACK 9448 +▁MENCOBA 9449 +▁đợi 9450 +▁ย้าย 9451 +▁sung 9452 +ДВИГ 9453 +峰 9454 +تعرف 9455 +▁مباشر 9456 +▁ALASAN 9457 +宋 9458 +太 9459 +冒 9460 +漫 9461 +在 9462 +説 9463 +命 9464 +妙 9465 +元 9466 +岩 9467 +戴 9468 +? 9469 +隔 9470 +摘 9471 +牙 9472 +正 9473 +衛 9474 +洞 9475 +浮 9476 +容 9477 +ぬ 9478 +量 9479 +炎 9480 +ヘ 9481 +押 9482 +媒 9483 +頼 9484 +館 9485 +悔 9486 +旦 9487 +湾 9488 +菲 9489 +根 9490 +惜 9491 +論 9492 +越 9493 +協 9494 +極 9495 +岸 9496 +佳 9497 +感 9498 +薬 9499 +狼 9500 +壁 9501 +捕 9502 +崩 9503 +ぽ 9504 +銀 9505 +j 9506 +技 9507 +給 9508 +ェ 9509 +積 9510 +補 9511 +莫 9512 +賞 9513 +枚 9514 +棒 9515 +導 9516 +認 9517 +争 9518 +巧 9519 +滑 9520 +怖 9521 +泡 9522 +典 9523 +断 9524 +董 9525 +態 9526 +恨 9527 +緊 9528 +鼓 9529 +砂 9530 +悲 9531 +除 9532 +洲 9533 +義 9534 +塁 9535 +映 9536 +読 9537 +統 9538 +凶 9539 +算 9540 +絶 9541 +怒 9542 +舍 9543 +培 9544 +眠 9545 +製 9546 +尚 9547 +沿 9548 +隊 9549 +献 9550 +佛 9551 +丈 9552 +節 9553 +序 9554 +腿 9555 +院 9556 +猛 9557 +筋 9558 +額 9559 +城 9560 +抽 9561 +搭 9562 +姻 9563 +焼 9564 +潜 9565 +弁 9566 +泉 9567 +降 9568 +朱 9569 +集 9570 +勤 9571 +異 9572 +試 9573 +仍 9574 +羊 9575 +ユ 9576 +征 9577 +詳 9578 +傷 9579 +凡 9580 +児 9581 +朝 9582 +巻 9583 +躍 9584 +種 9585 +裏 9586 +御 9587 +鹿 9588 +狙 9589 +的 9590 +柔 9591 +庄 9592 +惑 9593 +坂 9594 +億 9595 +脾 9596 +鞋 9597 +竹 9598 +抑 9599 +薄 9600 +落 9601 +措 9602 +寝 9603 +煮 9604 +魚 9605 +寺 9606 +測 9607 +式 9608 +嘉 9609 +燃 9610 +労 9611 +鉄 9612 +珠 9613 +拾 9614 +荒 9615 +ầ 9616 +屈 9617 +胆 9618 +忠 9619 +虫 9620 +形 9621 +ヨ 9622 +荷 9623 +準 9624 +図 9625 +女 9626 +ẳ 9627 +桃 9628 +瓶 9629 +訴 9630 +弾 9631 +送 9632 +敏 9633 +刷 9634 +針 9635 +臭 9636 +妖 9637 +焦 9638 +造 9639 +距 9640 +胸 9641 +古 9642 +加 9643 +引 9644 +肺 9645 +米 9646 +幼 9647 +聴 9648 +隆 9649 +夢 9650 +屏 9651 +王 9652 +淡 9653 +助 9654 +北 9655 +望 9656 +由 9657 +浜 9658 +携 9659 +蒙 9660 +狂 9661 +夕 9662 +魅 9663 +奈 9664 +魂 9665 +番 9666 +耐 9667 +美 9668 +西 9669 +奪 9670 +課 9671 +詰 9672 +宙 9673 +級 9674 +添 9675 +石 9676 +ゃ 9677 +肩 9678 +全 9679 +励 9680 +齢 9681 +慧 9682 +掛 9683 +多 9684 +旗 9685 +構 9686 +想 9687 +梁 9688 +殊 9689 +附 9690 +像 9691 +伺 9692 +株 9693 +腰 9694 +競 9695 +丹 9696 +盟 9697 +遅 9698 +宜 9699 +社 9700 +吐 9701 +白 9702 +豊 9703 +仗 9704 +悟 9705 +炒 9706 +絵 9707 +頃 9708 +沢 9709 +覆 9710 +怨 9711 +滴 9712 +灰 9713 +紙 9714 +腕 9715 +ィ 9716 +処 9717 +ぇ 9718 +昔 9719 +遠 9720 +相 9721 +許 9722 +党 9723 +偶 9724 +飯 9725 +災 9726 +陽 9727 +牲 9728 +ฏ 9729 +毫 9730 +習 9731 +農 9732 +刻 9733 +狐 9734 +尼 9735 +遊 9736 +養 9737 +潮 9738 +店 9739 +絡 9740 +抵 9741 +糊 9742 +爬 9743 +鼻 9744 +徴 9745 +卵 9746 +走 9747 +摩 9748 +隠 9749 +泪 9750 +鳥 9751 +逐 9752 +奏 9753 +翔 9754 +少 9755 +星 9756 +截 9757 +塩 9758 +柳 9759 +稿 9760 +始 9761 +棋 9762 +著 9763 +穴 9764 +瓜 9765 +液 9766 +琴 9767 +昼 9768 +繁 9769 +撒 9770 +客 9771 +雪 9772 +肥 9773 +莉 9774 +懸 9775 +寿 9776 +神 9777 +捉 9778 +菌 9779 +了 9780 +胃 9781 +祭 9782 +華 9783 +功 9784 +底 9785 +筑 9786 +邪 9787 +乾 9788 +壊 9789 +孝 9790 +悩 9791 +召 9792 +順 9793 +仁 9794 +織 9795 +得 9796 +請 9797 +脳 9798 +繰 9799 +接 9800 +蜜 9801 +犬 9802 +興 9803 +訪 9804 +碗 9805 +泳 9806 +瞬 9807 +幹 9808 +撮 9809 +倒 9810 +募 9811 +件 9812 +差 9813 +曹 9814 +打 9815 +泥 9816 +倉 9817 +奔 9818 +壮 9819 +擦 9820 +枝 9821 +奴 9822 +浅 9823 +署 9824 +頑 9825 +汗 9826 +昭 9827 +類 9828 +標 9829 +戚 9830 +腹 9831 +声 9832 +闘 9833 +炮 9834 +適 9835 +装 9836 +厨 9837 +慌 9838 +挙 9839 +離 9840 +戒 9841 +桂 9842 +娃 9843 +先 9844 +思 9845 +土 9846 +慎 9847 +林 9848 +ỳ 9849 +案 9850 +! 9851 +勉 9852 +伏 9853 +紫 9854 +驚 9855 +払 9856 +浦 9857 +郭 9858 +盤 9859 +揚 9860 +載 9861 +敷 9862 +納 9863 +号 9864 +昇 9865 +符 9866 +密 9867 +捜 9868 +衝 9869 +評 9870 +促 9871 +歯 9872 +門 9873 +腐 9874 +輩 9875 +堆 9876 +庫 9877 +ă 9878 +貴 9879 +拠 9880 +謝 9881 +率 9882 +幻 9883 +乳 9884 +ỷ 9885 +塔 9886 +疾 9887 +鮮 9888 +複 9889 +討 9890 +財 9891 +文 9892 +閉 9893 +司 9894 +貌 9895 +板 9896 +夫 9897 +濃 9898 +肌 9899 +角 9900 +江 9901 +杉 9902 +与 9903 +瀬 9904 +欣 9905 +京 9906 +墓 9907 +陕 9908 +厳 9909 +朗 9910 +肝 9911 +審 9912 +杜 9913 +玲 9914 +盾 9915 +舅 9916 +柱 9917 +隣 9918 +渋 9919 +迅 9920 +葬 9921 +蒸 9922 +苗 9923 +牢 9924 +牧 9925 +訳 9926 +泰 9927 +具 9928 +帽 9929 +蛮 9930 +玄 9931 +ゾ 9932 +有 9933 +奸 9934 +札 9935 +慰 9936 +廷 9937 +跡 9938 +催 9939 +工 9940 +賀 9941 +輸 9942 +旬 9943 +惨 9944 +台 9945 +漏 9946 +婦 9947 +衡 9948 +ャ 9949 +悠 9950 +契 9951 +求 9952 +守 9953 +栄 9954 +従 9955 +汁 9956 +朕 9957 +範 9958 +交 9959 +坦 9960 +突 9961 +換 9962 +湯 9963 +診 9964 +雑 9965 +伍 9966 +塞 9967 +編 9968 +俗 9969 +奉 9970 +姜 9971 +脂 9972 +洛 9973 +恭 9974 +誕 9975 +担 9976 +練 9977 +俊 9978 +政 9979 +花 9980 +孔 9981 +泊 9982 +漁 9983 +胞 9984 +匠 9985 +市 9986 +蔵 9987 +音 9988 +済 9989 +尖 9990 +駆 9991 +侯 9992 +官 9993 +兆 9994 +効 9995 +籍 9996 +墨 9997 +浴 9998 +掘 9999 +薇 10000 +芝 10001 +輝 10002 +布 10003 +酷 10004 +裕 10005 +暮 10006 +澤 10007 +燕 10008 +裂 10009 +豚 10010 +使 10011 +岳 10012 +粗 10013 +菊 10014 +整 10015 +教 10016 +怜 10017 +梨 10018 +界 10019 +矩 10020 +去 10021 +滞 10022 +卓 10023 +埼 10024 +恵 10025 +責 10026 +為 10027 +臨 10028 +邦 10029 +同 10030 +♪ 10031 +緩 10032 +採 10033 +乃 10034 +削 10035 +牺 10036 +肖 10037 +ヴ 10038 +劫 10039 +放 10040 +敵 10041 +浸 10042 +録 10043 +久 10044 +氷 10045 +締 10046 +ฑ 10047 +炭 10048 +咲 10049 +妃 10050 +蛇 10051 +閣 10052 +爽 10053 +科 10054 +柴 10055 +徳 10056 +好 10057 +浩 10058 +遥 10059 +凍 10060 +存 10061 +徹 10062 +之 10063 +耗 10064 +襲 10065 +険 10066 +芳 10067 +傾 10068 +姥 10069 +溜 10070 +寸 10071 +曼 10072 +単 10073 +舗 10074 +遣 10075 +破 10076 +兼 10077 +樹 10078 +令 10079 +恒 10080 +ぴ 10081 +晴 10082 +粒 10083 +梯 10084 +晶 10085 +仰 10086 +痕 10087 +程 10088 +允 10089 +桑 10090 +諸 10091 +劇 10092 +慕 10093 +紀 10094 +也 10095 +慢 10096 +犯 10097 +鈴 10098 +呈 10099 +松 10100 +斤 10101 +維 10102 +歌 10103 +死 10104 +油 10105 +ฬ 10106 +泣 10107 +盆 10108 +起 10109 +築 10110 +斜 10111 +耀 10112 +柄 10113 +活 10114 +俳 10115 +舌 10116 +高 10117 +捨 10118 +辣 10119 +住 10120 +創 10121 +卒 10122 +更 10123 +答 10124 +宏 10125 +惠 10126 +径 10127 +剤 10128 +房 10129 +層 10130 +昌 10131 +陣 10132 +哲 10133 +輪 10134 +禍 10135 +涛 10136 +緑 10137 +陵 10138 +垃 10139 +桶 10140 +髪 10141 +ヌ 10142 +姉 10143 +桜 10144 +駄 10145 +鳴 10146 +尿 10147 +誉 10148 +祥 10149 +碍 10150 +損 10151 +葛 10152 +辰 10153 +眉 10154 +勒 10155 +滋 10156 +茂 10157 +督 10158 +« 10159 +飼 10160 +世 10161 +弯 10162 +胎 10163 +誓 10164 +廃 10165 +服 10166 +銃 10167 +窓 10168 +男 10169 +択 10170 +侍 10171 +誘 10172 +崇 10173 +坑 10174 +僧 10175 +反 10176 +純 10177 +里 10178 +拳 10179 +撲 10180 +稀 10181 +坡 10182 +燥 10183 +孟 10184 +槽 10185 +菓 10186 +郁 10187 +璃 10188 +訓 10189 +低 10190 +串 10191 +竜 10192 +晋 10193 +旋 10194 +瓦 10195 +表 10196 +» 10197 +縮 10198 +賃 10199 +衆 10200 +拓 10201 +皇 10202 +械 10203 +犹 10204 +覇 10205 +乏 10206 +盈 10207 +専 10208 +光 10209 +堡 10210 +辱 10211 +渠 10212 +管 10213 +陶 10214 +雇 10215 +領 10216 +侠 10217 +旨 10218 +区 10219 +坊 10220 +茨 10221 +己 10222 +及 10223 +弥 10224 +袖 10225 +温 10226 += 10227 +狭 10228 +畑 10229 +殖 10230 +佑 10231 +汚 10232 +溶 10233 +潟 10234 +堵 10235 +哀 10236 +翼 10237 +芽 10238 +q 10239 +栽 10240 +傘 10241 +莱 10242 +仮 10243 +飾 10244 +考 10245 +寨 10246 +派 10247 +留 10248 +踊 10249 +候 10250 +矢 10251 +虹 10252 +扇 10253 +桐 10254 +鍋 10255 +夏 10256 +天 10257 +ォ 10258 +慣 10259 +講 10260 +蝶 10261 +晃 10262 +聖 10263 +宴 10264 +靴 10265 +抹 10266 +歴 10267 +聘 10268 +泄 10269 +栗 10270 +紅 10271 +甄 10272 +消 10273 +指 10274 +願 10275 +雀 10276 +榜 10277 +幌 10278 +− 10279 +麺 10280 +可 10281 +糸 10282 +寂 10283 +稼 10284 +則 10285 +還 10286 +遂 10287 +鶏 10288 +毅 10289 +ぷ 10290 +憲 10291 +漠 10292 +父 10293 +龍 10294 +南 10295 +展 10296 +査 10297 +萌 10298 +蜂 10299 +刃 10300 +衰 10301 +逸 10302 +尺 10303 +塗 10304 +琳 10305 +扱 10306 +豹 10307 +拐 10308 +呂 10309 +勘 10310 +楠 10311 +垂 10312 +吊 10313 +武 10314 +自 10315 +ٰ 10316 +痴 10317 +蓄 10318 +炉 10319 +虐 10320 +待 10321 +逢 10322 +爪 10323 +省 10324 +址 10325 +捷 10326 +績 10327 +駐 10328 +芯 10329 +茅 10330 +等 10331 +響 10332 +愁 10333 +慈 10334 +濯 10335 +沼 10336 +息 10337 +誇 10338 +• 10339 +柏 10340 +忌 10341 +舟 10342 +ỹ 10343 +崖 10344 +逗 10345 +句 10346 +・ 10347 +凝 10348 +辜 10349 +隙 10350 +塑 10351 +湘 10352 +仏 10353 +那 10354 +填 10355 +掃 10356 +晒 10357 +渉 10358 +騰 10359 +煙 10360 +翠 10361 +甭 10362 +菅 10363 +謎 10364 +岂 10365 +棚 10366 +棄 10367 +脅 10368 +旺 10369 +蓉 10370 +志 10371 +圏 10372 +幽 10373 +祈 10374 +憶 10375 +膜 10376 +ỵ 10377 +履 10378 +癌 10379 +才 10380 +儀 10381 +初 10382 +酬 10383 +非 10384 +第 10385 +僚 10386 +豫 10387 +卜 10388 +覧 10389 +干 10390 +府 10391 +挟 10392 +彪 10393 +三 10394 +軒 10395 +枯 10396 +縁 10397 +失 10398 +涯 10399 +悦 10400 +騒 10401 +塚 10402 +監 10403 +丘 10404 +挽 10405 +鍵 10406 +誤 10407 +旭 10408 +沸 10409 +郷 10410 +母 10411 +慮 10412 +友 10413 +稲 10414 +将 10415 +僅 10416 +血 10417 +碑 10418 +堀 10419 +償 10420 +岐 10421 +疆 10422 +鑑 10423 +炊 10424 +果 10425 +福 10426 +婚 10427 +臓 10428 +縦 10429 +ی 10430 +嘘 10431 +陰 10432 +劣 10433 +亭 10434 +二 10435 +彦 10436 +鎌 10437 +易 10438 +噴 10439 +寡 10440 +賛 10441 +春 10442 +抄 10443 +晩 10444 +肢 10445 +埃 10446 +涼 10447 +碧 10448 +稚 10449 +曇 10450 +釣 10451 +巾 10452 +貸 10453 +独 10454 +執 10455 +筆 10456 +郡 10457 +脇 10458 +没 10459 +寧 10460 +椒 10461 +渣 10462 +刊 10463 +膨 10464 +諦 10465 +亦 10466 +次 10467 +便 10468 +剣 10469 +快 10470 +涌 10471 +鏡 10472 +滅 10473 +磁 10474 +首 10475 +栃 10476 +筒 10477 +貨 10478 +喜 10479 +較 10480 +盲 10481 +縫 10482 +漬 10483 +猿 10484 +須 10485 +嘱 10486 +鶴 10487 +偽 10488 +網 10489 +帆 10490 +投 10491 +俱 10492 +耕 10493 +酒 10494 +蔽 10495 +鎖 10496 +揮 10497 +黙 10498 +剥 10499 +恥 10500 +吾 10501 +殴 10502 +早 10503 +粥 10504 +懐 10505 +斑 10506 +莎 10507 +砲 10508 +ヶ 10509 +煎 10510 +蚂 10511 +ァ 10512 +伐 10513 +涙 10514 +酢 10515 +锻 10516 +坤 10517 +漢 10518 +皓 10519 +嶋 10520 +銭 10521 +舎 10522 +霞 10523 +咳 10524 +卿 10525 +挫 10526 +絞 10527 +沖 10528 +缶 10529 +衷 10530 +洒 10531 +尴 10532 +尻 10533 +斌 10534 +受 10535 +愚 10536 +枠 10537 +尹 10538 +十 10539 +弘 10540 +詞 10541 +奮 10542 +兜 10543 +斉 10544 +小 10545 +条 10546 +卸 10547 +妾 10548 +棍 10549 +ゥ 10550 +伎 10551 +朴 10552 +病 10553 +鼎 10554 +廊 10555 +彰 10556 +腔 10557 +兵 10558 +芦 10559 +静 10560 +婿 10561 +皿 10562 +咽 10563 +昂 10564 +淋 10565 +歓 10566 +蕾 10567 +媛 10568 +庸 10569 +販 10570 +漆 10571 +丼 10572 +垣 10573 +艇 10574 +贈 10575 +霊 10576 +灌 10577 +稽 10578 +誌 10579 +晰 10580 +枕 10581 +却 10582 +孫 10583 +玫 10584 +喉 10585 +預 10586 +拝 10587 +銅 10588 +淑 10589 +膝 10590 +笠 10591 +茹 10592 +畳 10593 +呵 10594 +英 10595 +巣 10596 +希 10597 +麗 10598 +慨 10599 +宵 10600 +粹 10601 +敦 10602 +ぺ 10603 +咨 10604 +芋 10605 +環 10606 +誠 10607 +靖 10608 +翰 10609 +逮 10610 +吻 10611 +亀 10612 +吩 10613 +宰 10614 +罰 10615 +邸 10616 +喫 10617 +塘 10618 +汰 10619 +偉 10620 +艦 10621 +軟 10622 +拭 10623 +妊 10624 +淳 10625 +狩 10626 +惦 10627 +禅 10628 +特 10629 +寇 10630 +璧 10631 +貢 10632 +柿 10633 +駒 10634 +煌 10635 +暇 10636 +況 10637 +沃 10638 +沫 10639 +胳 10640 +項 10641 +斥 10642 +溢 10643 +闇 10644 +叉 10645 +姫 10646 +溪 10647 +蹴 10648 +蝴 10649 +酵 10650 +釈 10651 +韓 10652 +獲 10653 +椎 10654 +磊 10655 +芒 10656 +奢 10657 +畿 10658 +綱 10659 +徽 10660 +澄 10661 +艘 10662 +陀 10663 +桁 10664 +濫 10665 +提 10666 +共 10667 +翁 10668 +蚊 10669 +丞 10670 +娟 10671 +扉 10672 +弦 10673 +ẵ 10674 +譲 10675 +併 10676 +廉 10677 +潰 10678 +帖 10679 ++ 10680 +衣 10681 +杏 10682 +藩 10683 +へ 10684 +篠 10685 +弊 10686 +我 10687 +陥 10688 +真 10689 +棟 10690 +貫 10691 +函 10692 +腸 10693 +阜 10694 +٠ 10695 +弟 10696 +昧 10697 +滝 10698 +霜 10699 +囚 10700 +峡 10701 +逝 10702 +膏 10703 +尋 10704 +弓 10705 +葵 10706 +穏 10707 +彫 10708 +託 10709 +裸 10710 +斎 10711 +偵 10712 +窄 10713 +嬉 10714 +畜 10715 +紋 10716 +蛛 10717 +麟 10718 +慶 10719 +唇 10720 +比 10721 +& 10722 +軸 10723 +— 10724 +亜 10725 +笑 10726 +棺 10727 +١ 10728 +湧 10729 +曝 10730 +注 10731 +凰 10732 +堤 10733 +彬 10734 +債 10735 +嗅 10736 +悼 10737 +拡 10738 +懲 10739 +深 10740 +蜗 10741 +冥 10742 +賢 10743 +魄 10744 +乙 10745 +窟 10746 +顧 10747 +隅 10748 +萄 10749 +葱 10750 +屎 10751 +蒜 10752 +巷 10753 +緯 10754 +蟹 10755 +揉 10756 +幸 10757 +鋭 10758 +毯 10759 +癒 10760 +鍛 10761 +餌 10762 +鞭 10763 +霧 10764 +詩 10765 +宝 10766 +疚 10767 +茉 10768 +灸 10769 +瘤 10770 +潭 10771 +貧 10772 +到 10773 +老 10774 +崛 10775 +棠 10776 +餅 10777 +朽 10778 +馨 10779 +浄 10780 +癖 10781 +厘 10782 +衙 10783 +緒 10784 +賄 10785 +酔 10786 +夷 10787 +怠 10788 +屡 10789 +帳 10790 +侮 10791 +脈 10792 +扁 10793 +俵 10794 +ぃ 10795 +憩 10796 +建 10797 +眞 10798 +肘 10799 +梗 10800 +係 10801 +娠 10802 +濱 10803 +哨 10804 +傍 10805 +屯 10806 +嵐 10807 +紛 10808 +匿 10809 +叙 10810 +塾 10811 +橘 10812 +今 10813 +堅 10814 +貝 10815 +穂 10816 +萩 10817 +九 10818 +庶 10819 +淀 10820 +爵 10821 +礎 10822 +菱 10823 +妹 10824 +凸 10825 +膳 10826 +° 10827 +撼 10828 +祉 10829 +粧 10830 +腺 10831 +雁 10832 +后 10833 +笛 10834 +吟 10835 +哉 10836 +疑 10837 +冊 10838 +錦 10839 +栓 10840 +蒲 10841 +鞠 10842 +荘 10843 +馒 10844 +君 10845 +謀 10846 +琉 10847 +頻 10848 +颁 10849 +٢ 10850 +魁 10851 +× 10852 +壇 10853 +豁 10854 +鉢 10855 +殻 10856 +圭 10857 +廣 10858 +霖 10859 +瑜 10860 +祐 10861 +脊 10862 +麒 10863 +匈 10864 +繋 10865 +禄 10866 +碁 10867 +茜 10868 +刹 10869 +獄 10870 +賠 10871 +系 10872 +屑 10873 +妓 10874 +尉 10875 +倘 10876 +栖 10877 +簿 10878 +綾 10879 +噌 10880 +榴 10881 +坪 10882 +奨 10883 +紗 10884 +倫 10885 +蜘 10886 +縄 10887 +乞 10888 +剛 10889 +淇 10890 +耶 10891 +猾 10892 +逞 10893 +邱 10894 +獣 10895 +筛 10896 +祠 10897 +葫 10898 +羅 10899 +舆 10900 +裳 10901 +蝉 10902 +剃 10903 +輔 10904 +鼹 10905 +峻 10906 +薯 10907 +蚕 10908 +薦 10909 +媚 10910 +磯 10911 +釜 10912 +拌 10913 +痘 10914 +嚼 10915 +掺 10916 +溝 10917 +綿 10918 +蓮 10919 +蹄 10920 +斧 10921 +潤 10922 +藻 10923 +箸 10924 +苔 10925 +○ 10926 +刈 10927 +ぉ 10928 +晟 10929 +如 10930 +疹 10931 +瞳 10932 +影 10933 +枢 10934 +粛 10935 +苦 10936 +侈 10937 +写 10938 +墜 10939 +熏 10940 +四 10941 +曽 10942 +斬 10943 +櫻 10944 +汝 10945 +聡 10946 +邊 10947 +照 10948 +秉 10949 +塊 10950 +詠 10951 +隧 10952 +虔 10953 +唆 10954 +拇 10955 +茎 10956 +互 10957 +嬢 10958 +赦 10959 +鵬 10960 +٪ 10961 +祟 10962 +蘭 10963 +寮 10964 +幾 10965 +浏 10966 +萎 10967 +橙 10968 +疙 10969 +蕉 10970 +鴨 10971 +辐 10972 +顕 10973 +蹊 10974 +若 10975 +錯 10976 +砕 10977 +雍 10978 +軌 10979 +凄 10980 +汐 10981 +祷 10982 +片 10983 +禾 10984 +膚 10985 +鎮 10986 +礁 10987 +笘 10988 +苑 10989 +県 10990 +啓 10991 +祀 10992 +逍 10993 +橡 10994 +絆 10995 +拙 10996 +靳 10997 +鷲 10998 +精 10999 +“ 11000 +杖 11001 +穀 11002 +唾 11003 +渕 11004 +焚 11005 +醤 11006 +腫 11007 +籠 11008 +ฯ 11009 +奎 11010 +茸 11011 +八 11012 +捎 11013 +肇 11014 +叩 11015 +凹 11016 +寛 11017 +渦 11018 +瑠 11019 +奇 11020 +屌 11021 +憎 11022 +睦 11023 +閥 11024 +呪 11025 +縛 11026 +襟 11027 +参 11028 +厄 11029 +噂 11030 +粋 11031 +嘀 11032 +幡 11033 +辻 11034 +眼 11035 +周 11036 +冨 11037 +匂 11038 +沌 11039 +嶽 11040 +檬 11041 +窮 11042 +﴿ 11043 +冷 11044 +斐 11045 +桓 11046 +濁 11047 +裔 11048 +國 11049 +悍 11050 +﴾ 11051 +搾 11052 +槙 11053 +匡 11054 +肋 11055 +陳 11056 +倩 11057 +沮 11058 +芹 11059 +螃 11060 +疎 11061 +摂 11062 +瑛 11063 +烹 11064 +腑 11065 +‫ 11066 +惺 11067 +祛 11068 +糧 11069 +藍 11070 +靡 11071 +騎 11072 +拴 11073 +羹 11074 +芙 11075 +齋 11076 +堕 11077 +芥 11078 +錠 11079 +侥 11080 +潔 11081 +珂 11082 +怯 11083 +竿 11084 +吏 11085 +庇 11086 +舶 11087 +醸 11088 +骸 11089 +支 11090 +尽 11091 +渭 11092 +甫 11093 +邉 11094 +伽 11095 +鐘 11096 +ۚ 11097 +惚 11098 +惰 11099 +駿 11100 +凛 11101 +銘 11102 +ۖ 11103 +矫 11104 +鷹 11105 +硫 11106 +禽 11107 +謙 11108 +跋 11109 +清 11110 +ぅ 11111 +謡 11112 +他 11113 +鉱 11114 +晦 11115 +焉 11116 +蔑 11117 +黄 11118 +暧 11119 +簡 11120 +隻 11121 +荻 11122 +锄 11123 +揃 11124 +蘇 11125 +蓋 11126 +似 11127 +酌 11128 +厮 11129 +诅 11130 +饲 11131 +戎 11132 +擁 11133 +畔 11134 +٩ 11135 +五 11136 +哮 11137 +徊 11138 +撰 11139 +喚 11140 +慷 11141 +暢 11142 +梢 11143 +萱 11144 +賊 11145 +警 11146 +俣 11147 +濡 11148 +暦 11149 +何 11150 +忙 11151 +篤 11152 +铅 11153 +柵 11154 +胤 11155 +荧 11156 +薫 11157 +崭 11158 +笹 11159 +鉛 11160 +鞍 11161 +舘 11162 +青 11163 +峠 11164 +辗 11165 +條 11166 +墟 11167 +粟 11168 +蔭 11169 +‐ 11170 +彝 11171 +公 11172 +宸 11173 +蚓 11174 +/ 11175 +@ 11176 +弔 11177 +弧 11178 +瀑 11179 +邑 11180 +銚 11181 +朔 11182 +鳞 11183 +敢 11184 +剰 11185 +蚪 11186 +傑 11187 +舵 11188 +譜 11189 +戮 11190 +瑚 11191 +嵌 11192 +趾 11193 +豌 11194 +隋 11195 +忐 11196 +猝 11197 +٥ 11198 +捍 11199 +猟 11200 +該 11201 +扳 11202 +灼 11203 +磋 11204 +腌 11205 +虞 11206 +阐 11207 +嗣 11208 +墳 11209 +梶 11210 +諭 11211 +呉 11212 +٣ 11213 +ۃ 11214 +炙 11215 +耸 11216 +蛾 11217 +訟 11218 +韭 11219 +橄 11220 +琶 11221 +磐 11222 +臼 11223 +貞 11224 +髄 11225 +â 11226 +怪 11227 +欄 11228 +穗 11229 +颯 11230 +飢 11231 +冶 11232 +柠 11233 +璋 11234 +藉 11235 +蜻 11236 +螂 11237 +喪 11238 +侑 11239 +祺 11240 +镶 11241 +坍 11242 +攥 11243 +釉 11244 +噛 11245 +塀 11246 +峨 11247 +柚 11248 +牟 11249 +盎 11250 +綻 11251 +訂 11252 +賂 11253 +韻 11254 +٦ 11255 +垢 11256 +嫦 11257 +梓 11258 +繕 11259 +麓 11260 +左 11261 +珀 11262 +箇 11263 +胭 11264 +腎 11265 +诠 11266 +轄 11267 +寅 11268 +嶺 11269 +悴 11270 +汀 11271 +畠 11272 +翡 11273 +究 11274 +咤 11275 +堺 11276 +椰 11277 +楷 11278 +琊 11279 +绚 11280 +邋 11281 +癞 11282 +商 11283 +微 11284 +蝠 11285 +٤ 11286 +乒 11287 +唄 11288 +迄 11289 +鯉 11290 +胴 11291 +壕 11292 +槻 11293 +硝 11294 +酝 11295 +嵩 11296 +杵 11297 +蛍 11298 +基 11299 +懊 11300 +梧 11301 +稜 11302 +鯛 11303 +娘 11304 +俺 11305 +楓 11306 +琥 11307 +侶 11308 +岬 11309 +樽 11310 +汲 11311 +猖 11312 +痊 11313 +秤 11314 +裾 11315 +至 11316 +嘶 11317 +樋 11318 +淵 11319 +烯 11320 +砺 11321 +鳳 11322 +黯 11323 +円 11324 +掂 11325 +漩 11326 +閲 11327 +餓 11328 +忒 11329 +獅 11330 +追 11331 +勲 11332 +卉 11333 +绛 11334 +褪 11335 +鋼 11336 +俸 11337 +渇 11338 +疵 11339 +翊 11340 +蕃 11341 +邹 11342 +酎 11343 +峙 11344 +蒼 11345 +頬 11346 +鮭 11347 +ヅ 11348 +抉 11349 +樫 11350 +渓 11351 +濒 11352 +瘍 11353 +釧 11354 +‬ 11355 +٨ 11356 +匮 11357 +卯 11358 +憂 11359 +绯 11360 +醇 11361 +荔 11362 +遼 11363 +隈 11364 +頓 11365 +鵜 11366 +需 11367 +庵 11368 +窪 11369 +絹 11370 +蟋 11371 +吆 11372 +咄 11373 +幣 11374 +羲 11375 +蝗 11376 +鹦 11377 +孰 11378 +椿 11379 +虜 11380 +皆 11381 +嬴 11382 +峯 11383 +帷 11384 +拗 11385 +挿 11386 +摯 11387 +枸 11388 +毋 11389 +泸 11390 +緻 11391 +莞 11392 +六 11393 +七 11394 +喋 11395 +榊 11396 +獭 11397 +琛 11398 +缀 11399 +胧 11400 +蜷 11401 +股 11402 +☆ 11403 +ヱ 11404 +慑 11405 +樵 11406 +洱 11407 +淞 11408 +湊 11409 +禹 11410 +肮 11411 +讹 11412 +叫 11413 +拍 11414 +歳 11415 +٧ 11416 +漕 11417 +琰 11418 +芃 11419 +赡 11420 +钰 11421 +锥 11422 +顎 11423 +凱 11424 +嫡 11425 +榛 11426 +渚 11427 +犁 11428 +痤 11429 +窯 11430 +簸 11431 +袒 11432 +譬 11433 +阙 11434 +私 11435 +巍 11436 +廓 11437 +扼 11438 +擬 11439 +桢 11440 +檜 11441 +烊 11442 +睫 11443 +砥 11444 +碉 11445 +褥 11446 +詣 11447 +諮 11448 +邯 11449 +钳 11450 +彷 11451 +戬 11452 +搀 11453 +箔 11454 +锵 11455 +背 11456 +傀 11457 +儡 11458 +咆 11459 +囱 11460 +恃 11461 +榎 11462 +肴 11463 +脯 11464 +蟠 11465 +閑 11466 +ヂ 11467 +亥 11468 +啬 11469 +惋 11470 +瘪 11471 +瞭 11472 +苓 11473 +菁 11474 +轼 11475 +醍 11476 +醐 11477 +鲟 11478 +偃 11479 +嘚 11480 +壌 11481 +娼 11482 +屹 11483 +栅 11484 +缜 11485 +蟒 11486 +辍 11487 +旅 11488 +包 11489 +研 11490 +就 11491 +垛 11492 +掖 11493 +桨 11494 +渍 11495 +蝈 11496 +迦 11497 +骼 11498 +’ 11499 +斟 11500 +睬 11501 +医 11502 +倶 11503 +咀 11504 +夭 11505 +潦 11506 +猥 11507 +疱 11508 +紡 11509 +茵 11510 +诋 11511 +诲 11512 +嘆 11513 +妬 11514 +攘 11515 +暁 11516 +浚 11517 +漾 11518 +珞 11519 +笆 11520 +蜥 11521 +诧 11522 +谏 11523 +铠 11524 +馊 11525 +儲 11526 +姊 11527 +帚 11528 +籔 11529 +膿 11530 +菠 11531 +蚣 11532 +遁 11533 +錬 11534 +鳩 11535 +奚 11536 +昀 11537 +槟 11538 +渲 11539 +犒 11540 +瘴 11541 +秧 11542 +肛 11543 +蜴 11544 +辕 11545 +辘 11546 +凋 11547 +劾 11548 +泾 11549 +灞 11550 +熨 11551 +痢 11552 +盹 11553 +砚 11554 +衩 11555 +鹭 11556 +淆 11557 +賓 11558 +赂 11559 +鯨 11560 +噼 11561 +夯 11562 +徨 11563 +曖 11564 +汶 11565 +蔚 11566 +蜈 11567 +闵 11568 +陨 11569 +α 11570 +偕 11571 +凪 11572 +叡 11573 +嘣 11574 +挞 11575 +昙 11576 +枷 11577 +柊 11578 +梵 11579 +絢 11580 +脓 11581 +腱 11582 +讷 11583 +阑 11584 +骇 11585 +喀 11586 +孺 11587 +帧 11588 +應 11589 +牽 11590 +篓 11591 +薩 11592 +螳 11593 +蟑 11594 +阂 11595 +麹 11596 +ぢ 11597 +往 11598 +喔 11599 +夙 11600 +娴 11601 +忏 11602 +捻 11603 +摹 11604 +沏 11605 +瓮 11606 +畸 11607 +秽 11608 +逅 11609 +邂 11610 +俨 11611 +嘈 11612 +噱 11613 +宕 11614 +淄 11615 +痞 11616 +蚱 11617 +袴 11618 +谛 11619 +铐 11620 +霓 11621 +團 11622 +丙 11623 +扈 11624 +曳 11625 +熠 11626 +瓯 11627 +痔 11628 +皎 11629 +碇 11630 +稣 11631 +紺 11632 +羔 11633 +胱 11634 +詫 11635 +亘 11636 +孬 11637 +怦 11638 +戊 11639 +暄 11640 +沓 11641 +獾 11642 +珐 11643 +赈 11644 +钵 11645 +铢 11646 +鮎 11647 +准 11648 +匾 11649 +嗝 11650 +垦 11651 +帛 11652 +忡 11653 +忱 11654 +拚 11655 +斓 11656 +灘 11657 +炬 11658 +璀 11659 +瞰 11660 +纣 11661 +羨 11662 +艶 11663 +芍 11664 +壺 11665 +弛 11666 +弼 11667 +惬 11668 +晌 11669 +涟 11670 +烽 11671 +璨 11672 +箋 11673 +缤 11674 +蕨 11675 +薗 11676 +兄 11677 +零 11678 +≪ 11679 +△ 11680 +冽 11681 +弋 11682 +怅 11683 +恪 11684 +惣 11685 +暉 11686 +桔 11687 +涅 11688 +稔 11689 +諾 11690 +钗 11691 +陇 11692 +雹 11693 +鹂 11694 +佯 11695 +吠 11696 +堰 11697 +汕 11698 +瀧 11699 +炽 11700 +烬 11701 +薏 11702 +裘 11703 +谙 11704 +贻 11705 +邝 11706 +镰 11707 +骛 11708 +骡 11709 +故 11710 +僕 11711 +万 11712 +厥 11713 +呑 11714 +哔 11715 +噺 11716 +宦 11717 +巳 11718 +悖 11719 +懿 11720 +戛 11721 +抡 11722 +槌 11723 +漉 11724 +瞥 11725 +瞿 11726 +穹 11727 +绫 11728 +缇 11729 +耘 11730 +耙 11731 +藝 11732 +觐 11733 +謗 11734 +辄 11735 +鱿 11736 +亵 11737 +勅 11738 +悚 11739 +憤 11740 +掇 11741 +歆 11742 +浣 11743 +渎 11744 +溉 11745 +瞌 11746 +罠 11747 +胺 11748 +芮 11749 +藿 11750 +蛰 11751 +讥 11752 +傣 11753 +岌 11754 +峪 11755 +徇 11756 +悸 11757 +戍 11758 +昵 11759 +晖 11760 +栞 11761 +桧 11762 +榕 11763 +泷 11764 +浒 11765 +簪 11766 +褶 11767 +訃 11768 +誹 11769 +踵 11770 +鞘 11771 +颊 11772 +搪 11773 +柑 11774 +榔 11775 +沂 11776 +炷 11777 +稠 11778 +腩 11779 +蚌 11780 +褚 11781 +诟 11782 +谤 11783 +迸 11784 +錮 11785 +骋 11786 +鸵 11787 +超 11788 +嗤 11789 +壑 11790 +奘 11791 +幢 11792 +擀 11793 +枭 11794 +磷 11795 +芪 11796 +葆 11797 +裟 11798 +謹 11799 +跆 11800 +踞 11801 +钾 11802 +镳 11803 +麝 11804 +龊 11805 +龌 11806 +佃 11807 +兀 11808 +學 11809 +弑 11810 +涎 11811 +涞 11812 +溥 11813 +爻 11814 +瘁 11815 +祯 11816 +纫 11817 +虱 11818 +蛀 11819 +袤 11820 +裆 11821 +诽 11822 +鴻 11823 +哽 11824 +岱 11825 +愕 11826 +昴 11827 +氨 11828 +痣 11829 +眈 11830 +蔼 11831 +訣 11832 +躇 11833 +轧 11834 +遡 11835 +酣 11836 +顷 11837 +饽 11838 +齊 11839 +控 11840 +亮 11841 +睡 11842 +偎 11843 +兎 11844 +壱 11845 +岖 11846 +氯 11847 +濠 11848 +焖 11849 +猕 11850 +疟 11851 +缮 11852 +罄 11853 +蕎 11854 +虻 11855 +戯 11856 +阿 11857 +ۗ 11858 +〇 11859 +劉 11860 +忖 11861 +挎 11862 +摒 11863 +涤 11864 +紘 11865 +罵 11866 +翱 11867 +胰 11868 +茱 11869 +薙 11870 +蟾 11871 +蠣 11872 +诣 11873 +轶 11874 +闰 11875 +韶 11876 +飒 11877 +馁 11878 +鳖 11879 +咂 11880 +噗 11881 +彗 11882 +掴 11883 +楢 11884 +璜 11885 +璞 11886 +缭 11887 +臃 11888 +蝦 11889 +赝 11890 +骜 11891 +鸞 11892 +倣 11893 +呲 11894 +坯 11895 +捗 11896 +汾 11897 +皐 11898 +磺 11899 +萦 11900 +谚 11901 +邃 11902 +酋 11903 +隕 11904 +剽 11905 +哐 11906 +慵 11907 +捺 11908 +掳 11909 +栩 11910 +椛 11911 +槍 11912 +滕 11913 +炜 11914 +焙 11915 +狒 11916 +砒 11917 +糠 11918 +袈 11919 +跻 11920 +錫 11921 +锚 11922 +未 11923 +٬ 11924 +侏 11925 +唏 11926 +圃 11927 +娯 11928 +帥 11929 +帼 11930 +擢 11931 +樟 11932 +氰 11933 +泞 11934 +渥 11935 +笈 11936 +縣 11937 +绮 11938 +荼 11939 +莴 11940 +迥 11941 +酗 11942 +酶 11943 +鎧 11944 +镣 11945 +霁 11946 +喝 11947 +凜 11948 +惆 11949 +戟 11950 +暨 11951 +涸 11952 +炯 11953 +狞 11954 +硌 11955 +祇 11956 +紐 11957 +紳 11958 +耷 11959 +胯 11960 +膑 11961 +蛟 11962 +讃 11963 +踱 11964 +雛 11965 +飓 11966 +龈 11967 +🍁 11968 +來 11969 +冴 11970 +毀 11971 +汴 11972 +泯 11973 +焱 11974 +煩 11975 +綺 11976 +繭 11977 +缥 11978 +缰 11979 +腆 11980 +臀 11981 +苣 11982 +荨 11983 +蛭 11984 +踮 11985 +鉾 11986 +佼 11987 +囃 11988 +抨 11989 +燻 11990 +甬 11991 +篝 11992 +荟 11993 +荥 11994 +萬 11995 +葚 11996 +蒿 11997 +赊 11998 +铡 11999 +頸 12000 +忘 12001 +班 12002 +を 12003 +釘 12004 +冑 12005 +咿 12006 +嘩 12007 +囡 12008 +壽 12009 +巌 12010 +怄 12011 +攸 12012 +於 12013 +梆 12014 +榈 12015 +毗 12016 +竺 12017 +粕 12018 +缈 12019 +羌 12020 +茁 12021 +荃 12022 +蜍 12023 +襷 12024 +諒 12025 +諜 12026 +豺 12027 +轱 12028 +鋳 12029 +雉 12030 +鲫 12031 +黜 12032 +停 12033 +推 12034 +伢 12035 +哏 12036 +惘 12037 +憑 12038 +拮 12039 +殓 12040 +渾 12041 +炅 12042 +焯 12043 +犄 12044 +矯 12045 +簌 12046 +紬 12047 +脐 12048 +苞 12049 +蔫 12050 +蚩 12051 +蜚 12052 +遐 12053 +騙 12054 +鬓 12055 +完 12056 +پ 12057 +凧 12058 +媲 12059 +戾 12060 +洙 12061 +淬 12062 +滉 12063 +爺 12064 +糾 12065 +罔 12066 +萸 12067 +蚤 12068 +踌 12069 +踝 12070 +遷 12071 +醺 12072 +锢 12073 +锹 12074 +隍 12075 +隷 12076 +骊 12077 +李 12078 +啕 12079 +娩 12080 +惴 12081 +敝 12082 +椭 12083 +氮 12084 +涝 12085 +潍 12086 +烏 12087 +煦 12088 +痫 12089 +詮 12090 +賜 12091 +钛 12092 +镀 12093 +馥 12094 +鳍 12095 +紹 12096 +ヵ 12097 +侗 12098 +叵 12099 +呻 12100 +堑 12101 +愫 12102 +棲 12103 +毡 12104 +狰 12105 +獒 12106 +碴 12107 +礴 12108 +秆 12109 +緋 12110 +臥 12111 +舛 12112 +茗 12113 +袅 12114 +贋 12115 +铀 12116 +锏 12117 +阉 12118 +鬱 12119 +鸠 12120 +鹜 12121 +鼾 12122 +随 12123 +佞 12124 +咛 12125 +喰 12126 +喱 12127 +孚 12128 +斡 12129 +楊 12130 +檄 12131 +涣 12132 +濮 12133 +瓒 12134 +睽 12135 +羿 12136 +翳 12137 +腼 12138 +蚝 12139 +跎 12140 +蹉 12141 +遜 12142 +邈 12143 +餡 12144 +馳 12145 +گ 12146 +‮ 12147 +★ 12148 +〔 12149 +〕 12150 +冢 12151 +刽 12152 +唁 12153 +唰 12154 +廻 12155 +忤 12156 +恻 12157 +拈 12158 +掣 12159 +斛 12160 +桝 12161 +湍 12162 +滟 12163 +漳 12164 +瀛 12165 +玖 12166 +瓴 12167 +疽 12168 +禺 12169 +粼 12170 +绾 12171 +缨 12172 +膠 12173 +與 12174 +藓 12175 +藪 12176 +讧 12177 +谑 12178 +谗 12179 +谪 12180 +赳 12181 +轲 12182 +铿 12183 +镂 12184 +阖 12185 +飕 12186 +騨 12187 +麩 12188 +企 12189 +― 12190 +偌 12191 +宥 12192 +晤 12193 +椀 12194 +殇 12195 +爛 12196 +璎 12197 +砝 12198 +砾 12199 +箩 12200 +籁 12201 +舐 12202 +舷 12203 +蔻 12204 +蹑 12205 +阡 12206 +∞ 12207 +仃 12208 +佗 12209 +偻 12210 +噢 12211 +埠 12212 +妲 12213 +嬛 12214 +寰 12215 +彌 12216 +忻 12217 +恣 12218 +沣 12219 +洸 12220 +煸 12221 +畝 12222 +發 12223 +茯 12224 +莆 12225 +诓 12226 +蹂 12227 +😍 12228 +楚 12229 +咫 12230 +哙 12231 +娑 12232 +宍 12233 +掸 12234 +桀 12235 +燮 12236 +瑙 12237 +砦 12238 +祎 12239 +箕 12240 +箫 12241 +篑 12242 +繍 12243 +腋 12244 +苋 12245 +蔗 12246 +薅 12247 +蛐 12248 +诩 12249 +郸 12250 +锭 12251 +阄 12252 +靭 12253 +飴 12254 +髅 12255 +揖 12256 +🏼 12257 +朋 12258 +啉 12259 +宓 12260 +怵 12261 +椋 12262 +槃 12263 +樺 12264 +淅 12265 +熹 12266 +犷 12267 +矗 12268 +罹 12269 +舀 12270 +舫 12271 +菫 12272 +觎 12273 +貪 12274 +躏 12275 +鄱 12276 +鍼 12277 +顆 12278 +駕 12279 +骥 12280 +鰻 12281 +鱗 12282 +鹫 12283 +克 12284 +β 12285 +丕 12286 +亟 12287 +傥 12288 +啷 12289 +喩 12290 +庖 12291 +戌 12292 +扪 12293 +橿 12294 +汛 12295 +潢 12296 +爾 12297 +窈 12298 +糜 12299 +脘 12300 +膘 12301 +莅 12302 +蠕 12303 +衲 12304 +賑 12305 +輿 12306 +郦 12307 +鐵 12308 +雫 12309 +骷 12310 +髻 12311 +麋 12312 +是 12313 +ヲ 12314 +哝 12315 +嘹 12316 +晁 12317 +溏 12318 +熾 12319 +瘠 12320 +皈 12321 +瞟 12322 +罡 12323 +膈 12324 +菏 12325 +蒔 12326 +薮 12327 +藐 12328 +蛳 12329 +鄭 12330 +醜 12331 +镐 12332 +嵯 12333 +亞 12334 +倜 12335 +倹 12336 +兒 12337 +垩 12338 +塵 12339 +崋 12340 +廿 12341 +悻 12342 +挛 12343 +搡 12344 +桦 12345 +梱 12346 +泱 12347 +烩 12348 +煜 12349 +琏 12350 +疸 12351 +祓 12352 +筵 12353 +綬 12354 +膺 12355 +苫 12356 +蔦 12357 +蛹 12358 +衢 12359 +謳 12360 +跛 12361 +蹶 12362 +轟 12363 +酉 12364 +錣 12365 +铤 12366 +锱 12367 +鞄 12368 +颦 12369 +饉 12370 +饗 12371 +鰹 12372 +鲶 12373 +ڤ 12374 +ゑ 12375 +ゞ 12376 +咻 12377 +坳 12378 +埂 12379 +塙 12380 +婕 12381 +悶 12382 +拄 12383 +捭 12384 +擞 12385 +楣 12386 +欽 12387 +涧 12388 +牒 12389 +狲 12390 +痺 12391 +盂 12392 +瞠 12393 +礒 12394 +窕 12395 +荀 12396 +蜿 12397 +袂 12398 +跄 12399 +锃 12400 +颉 12401 +鯖 12402 +黝 12403 +👍 12404 +刎 12405 +匝 12406 +垠 12407 +妩 12408 +杈 12409 +杳 12410 +榭 12411 +榷 12412 +泵 12413 +浃 12414 +濤 12415 +牦 12416 +獐 12417 +皙 12418 +祜 12419 +禎 12420 +箏 12421 +簾 12422 +糗 12423 +纾 12424 +肓 12425 +芈 12426 +茴 12427 +荏 12428 +蛔 12429 +裱 12430 +諫 12431 +謁 12432 +趙 12433 +钠 12434 +铖 12435 +閃 12436 +饴 12437 +骰 12438 +魇 12439 +被 12440 +۝ 12441 +仄 12442 +嗔 12443 +嗲 12444 +嘤 12445 +姘 12446 +尕 12447 +恸 12448 +揄 12449 +揆 12450 +揶 12451 +攫 12452 +桅 12453 +桟 12454 +梏 12455 +櫓 12456 +洩 12457 +滓 12458 +濂 12459 +烷 12460 +牯 12461 +珏 12462 +瑁 12463 +睾 12464 +矬 12465 +祢 12466 +穣 12467 +纥 12468 +腚 12469 +膵 12470 +膻 12471 +菰 12472 +訊 12473 +诃 12474 +诿 12475 +賽 12476 +酊 12477 +铆 12478 +馀 12479 +É 12480 +伉 12481 +侬 12482 +傭 12483 +卍 12484 +呷 12485 +啐 12486 +啧 12487 +嚥 12488 +圓 12489 +娓 12490 +婵 12491 +孢 12492 +實 12493 +嵘 12494 +抿 12495 +搔 12496 +敕 12497 +旌 12498 +柩 12499 +桎 12500 +桠 12501 +棹 12502 +檎 12503 +欅 12504 +歎 12505 +澁 12506 +瀕 12507 +炀 12508 +犸 12509 +猢 12510 +痉 12511 +痍 12512 +痿 12513 +砧 12514 +禰 12515 +缄 12516 +蓟 12517 +蜒 12518 +蝼 12519 +谀 12520 +遴 12521 +鏑 12522 +钨 12523 +镭 12524 +鲲 12525 +鷺 12526 +鸬 12527 +鸾 12528 +鹑 12529 +ٱ 12530 +俎 12531 +厩 12532 +咦 12533 +啵 12534 +姣 12535 +娆 12536 +搐 12537 +摺 12538 +旮 12539 +栀 12540 +楔 12541 +檻 12542 +燈 12543 +燭 12544 +珪 12545 +磴 12546 +笕 12547 +缢 12548 +苅 12549 +苯 12550 +苺 12551 +荠 12552 +菖 12553 +葦 12554 +蓑 12555 +蛆 12556 +蛉 12557 +褛 12558 +诌 12559 +貅 12560 +貔 12561 +跚 12562 +蹒 12563 +躊 12564 +遽 12565 +醛 12566 +铎 12567 +馴 12568 +鮨 12569 +鮫 12570 +鳝 12571 +鸢 12572 +鹚 12573 +麾 12574 +再 12575 +此 12576 +倖 12577 +叟 12578 +噻 12579 +姝 12580 +姪 12581 +婀 12582 +彿 12583 +恿 12584 +會 12585 +梠 12586 +槇 12587 +汎 12588 +泓 12589 +潺 12590 +澪 12591 +獗 12592 +珅 12593 +琮 12594 +瘙 12595 +皑 12596 +碓 12597 +縞 12598 +绉 12599 +羯 12600 +胄 12601 +莠 12602 +蔺 12603 +蛯 12604 +褴 12605 +覗 12606 +谡 12607 +谩 12608 +赅 12609 +郜 12610 +酮 12611 +锌 12612 +阚 12613 +霏 12614 +饅 12615 +馏 12616 +鳃 12617 +鶯 12618 +鹄 12619 +🤓 12620 +以 12621 +卞 12622 +埴 12623 +塹 12624 +奧 12625 +岷 12626 +悌 12627 +旯 12628 +柾 12629 +毘 12630 +毽 12631 +氦 12632 +汨 12633 +洵 12634 +湄 12635 +滁 12636 +潸 12637 +煉 12638 +燦 12639 +珲 12640 +當 12641 +盃 12642 +筏 12643 +糞 12644 +聒 12645 +胥 12646 +荞 12647 +螨 12648 +蠅 12649 +詔 12650 +谔 12651 +赭 12652 +鍮 12653 +钴 12654 +镁 12655 +镆 12656 +镍 12657 +頚 12658 +飚 12659 +饬 12660 +鬃 12661 +麸 12662 +龅 12663 +龛 12664 + 12665 +藁 12666 + 12667 +改 12668 +又 12669 +Δ 12670 +佻 12671 +俶 12672 +剋 12673 +喆 12674 +喹 12675 +嗫 12676 +嘔 12677 +嘭 12678 +囫 12679 +圀 12680 +壬 12681 +嬌 12682 +崂 12683 +崗 12684 +巽 12685 +廠 12686 +弭 12687 +彙 12688 +徕 12689 +忪 12690 +恹 12691 +懋 12692 +懑 12693 +掟 12694 +撥 12695 +楕 12696 +櫛 12697 +涿 12698 +淺 12699 +滂 12700 +瀞 12701 +燗 12702 +獠 12703 +玳 12704 +玷 12705 +痧 12706 +盅 12707 +硯 12708 +笏 12709 +纂 12710 +胫 12711 +臧 12712 +荚 12713 +觊 12714 +觥 12715 +譴 12716 +谄 12717 +谧 12718 +贮 12719 +鄢 12720 +酯 12721 +醚 12722 +鍾 12723 +铩 12724 +靱 12725 +颌 12726 +颚 12727 +颧 12728 +骞 12729 +鳗 12730 +麿 12731 +* 12732 + 12733 + 12734 +♂ 12735 +僭 12736 +儆 12737 +啜 12738 +嗟 12739 +奂 12740 +姦 12741 +峒 12742 +嵜 12743 +廟 12744 +恫 12745 +攪 12746 +瑭 12747 +痱 12748 +癬 12749 +睑 12750 +糍 12751 +紆 12752 +絨 12753 +續 12754 +纭 12755 +纰 12756 +罷 12757 +耦 12758 +菟 12759 +葭 12760 +薔 12761 +蟻 12762 +诨 12763 +賦 12764 +郢 12765 +鈿 12766 +銮 12767 +阈 12768 +雎 12769 +韮 12770 +馗 12771 +骶 12772 +髋 12773 +魯 12774 +鰺 12775 +鵑 12776 +鸚 12777 +鸨 12778 +鸩 12779 +鹌 12780 +鼬 12781 +🤔 12782 +辿 12783 +播 12784 +θ 12785 +┐ 12786 +✪ 12787 +丶 12788 +亳 12789 +伧 12790 +伫 12791 +侉 12792 +兖 12793 +匐 12794 +吮 12795 +囵 12796 +墾 12797 +壅 12798 +壷 12799 +孪 12800 +寵 12801 +峦 12802 +慄 12803 +抻 12804 +掬 12805 +櫃 12806 +歙 12807 +汞 12808 +湮 12809 +溧 12810 +焗 12811 +牝 12812 +玑 12813 +珩 12814 +琲 12815 +璟 12816 +瓤 12817 +癜 12818 +盱 12819 +竽 12820 +箒 12821 +箴 12822 +粳 12823 +聯 12824 +芩 12825 +莇 12826 +葺 12827 +蓦 12828 +蕙 12829 +裨 12830 +訶 12831 +诰 12832 +踉 12833 +迩 12834 +逵 12835 +邺 12836 +郴 12837 +酩 12838 +鋒 12839 +錐 12840 +閤 12841 +隽 12842 +霭 12843 +靉 12844 +鞆 12845 +饯 12846 +鮪 12847 +鰭 12848 +ٔ 12849 +掻 12850 +脩 12851 +這 12852 +Ó 12853 +🌼 12854 +۔ 12855 +◎ 12856 +佶 12857 +傳 12858 +儋 12859 +吽 12860 +噤 12861 +噶 12862 +妯 12863 +媪 12864 +孀 12865 +岫 12866 +嵬 12867 +扦 12868 +掮 12869 +杷 12870 +枇 12871 +柘 12872 +栂 12873 +梛 12874 +棂 12875 +樂 12876 +欸 12877 +殒 12878 +殚 12879 +汩 12880 +泙 12881 +湟 12882 +滦 12883 +滲 12884 +烃 12885 +煨 12886 +猷 12887 +瑤 12888 +痈 12889 +瘡 12890 +皋 12891 +硒 12892 +竈 12893 +筍 12894 +粝 12895 +綜 12896 +綴 12897 +罂 12898 +翫 12899 +苒 12900 +蜊 12901 +襖 12902 +詈 12903 +讣 12904 +讴 12905 +谥 12906 +蹩 12907 +邬 12908 +酚 12909 +鐔 12910 +铄 12911 +铬 12912 +锒 12913 +锲 12914 +閖 12915 +閻 12916 +韋 12917 +鬣 12918 +鱒 12919 +鱧 12920 +鲀 12921 +鲈 12922 +鳕 12923 +鹬 12924 +黍 12925 + 12926 +🌹 12927 +😃 12928 +😎 12929 +最 12930 +不 12931 +> 12932 +Ú 12933 +İ 12934 +٫ 12935 +▲ 12936 +☺ 12937 +仞 12938 +儺 12939 +匁 12940 +啖 12941 +喏 12942 +喬 12943 +嚢 12944 +埜 12945 +娌 12946 +婺 12947 +岿 12948 +挲 12949 +搽 12950 +撚 12951 +旛 12952 +杓 12953 +桉 12954 +毓 12955 +沅 12956 +泔 12957 +泗 12958 +浔 12959 +滢 12960 +燊 12961 +燧 12962 +琚 12963 +甕 12964 +疖 12965 +碘 12966 +礫 12967 +稹 12968 +穢 12969 +筧 12970 +纏 12971 +纨 12972 +绡 12973 +聩 12974 +聰 12975 +舩 12976 +舳 12977 +苁 12978 +萼 12979 +蛎 12980 +蜃 12981 +蜇 12982 +蜢 12983 +诳 12984 +豢 12985 +踽 12986 +辇 12987 +遒 12988 +遙 12989 +遨 12990 +邁 12991 +酰 12992 +鑓 12993 +钒 12994 +髭 12995 +魍 12996 +鰓 12997 +鴎 12998 +鴫 12999 +鵤 13000 +黢 13001 +龇 13002 +😉 13003 +🌷 13004 +鋸 13005 +鯵 13006 +🌺 13007 +( 13008 +÷ 13009 +ٓ 13010 +ک 13011 +ڭ 13012 +۞ 13013 +❤ 13014 +ヮ 13015 +佝 13016 +侩 13017 +刍 13018 +剌 13019 +劭 13020 +勖 13021 +勸 13022 +唢 13023 +嗳 13024 +嘗 13025 +囿 13026 +垅 13027 +姒 13028 +孱 13029 +屓 13030 +崚 13031 +嵇 13032 +忿 13033 +怆 13034 +恁 13035 +憫 13036 +朧 13037 +杼 13038 +枥 13039 +梼 13040 +楡 13041 +楹 13042 +榮 13043 +榲 13044 +檸 13045 +殲 13046 +毬 13047 +氟 13048 +沭 13049 +湎 13050 +澧 13051 +濛 13052 +濾 13053 +焔 13054 +犍 13055 +獺 13056 +瑳 13057 +痂 13058 +癣 13059 +癸 13060 +矾 13061 +砀 13062 +秭 13063 +穎 13064 +竪 13065 +笄 13066 +笥 13067 +筠 13068 +箪 13069 +粂 13070 +緞 13071 +纈 13072 +纐 13073 +绔 13074 +绻 13075 +缱 13076 +肱 13077 +腧 13078 +芎 13079 +蓿 13080 +蝿 13081 +螈 13082 +螯 13083 +蟲 13084 +褓 13085 +覃 13086 +詛 13087 +諄 13088 +讫 13089 +诙 13090 +谒 13091 +贔 13092 +逑 13093 +邕 13094 +邙 13095 +鄞 13096 +鍬 13097 +鏖 13098 +钎 13099 +钜 13100 +铂 13101 +铉 13102 +锰 13103 +镉 13104 +镌 13105 +闳 13106 +陝 13107 +霎 13108 +頌 13109 +饕 13110 +髡 13111 +魉 13112 +鱈 13113 +鲢 13114 +鹕 13115 +👋 13116 +🤗 13117 +Ö 13118 +救 13119 +鴈 13120 +搗 13121 + 13122 + 13123 +Θ 13124 +Ω 13125 +γ 13126 +۱ 13127 +□ 13128 +♬ 13129 +♯ 13130 +〆 13131 +【 13132 +】 13133 +ゐ 13134 +゙ 13135 +ゝ 13136 +佇 13137 +俾 13138 +倏 13139 +僑 13140 +剱 13141 +卅 13142 +唑 13143 +嚅 13144 +嚴 13145 +墉 13146 +妪 13147 +嬬 13148 +寤 13149 +嶌 13150 +巖 13151 +幄 13152 +徉 13153 +徜 13154 +怏 13155 +怩 13156 +惇 13157 +憐 13158 +憚 13159 +挝 13160 +捌 13161 +撻 13162 +枡 13163 +栉 13164 +椴 13165 +楮 13166 +槎 13167 +櫂 13168 +泮 13169 +洇 13170 +渌 13171 +漑 13172 +瀉 13173 +瀾 13174 +炴 13175 +狎 13176 +獏 13177 +獰 13178 +瓊 13179 +畦 13180 +疝 13181 +痦 13182 +眦 13183 +瞼 13184 +矍 13185 +砭 13186 +祗 13187 +禊 13188 +秸 13189 +稗 13190 +笸 13191 +篁 13192 +簀 13193 +籐 13194 +籾 13195 +糀 13196 +脍 13197 +臾 13198 +芨 13199 +苷 13200 +茏 13201 +茼 13202 +蓼 13203 +蕗 13204 +藜 13205 +藺 13206 +虢 13207 +蝋 13208 +蠡 13209 +誨 13210 +諌 13211 +謇 13212 +證 13213 +诘 13214 +谆 13215 +谟 13216 +谲 13217 +貰 13218 +賤 13219 +贄 13220 +蹟 13221 +輻 13222 +邳 13223 +醪 13224 +鎏 13225 +鎹 13226 +铰 13227 +锷 13228 +闱 13229 +阆 13230 +飫 13231 +餮 13232 +馐 13233 +骅 13234 +骝 13235 +鬆 13236 +鮒 13237 +鰯 13238 +鳏 13239 +鳐 13240 +鹈 13241 +鹸 13242 +黩 13243 +龋 13244 + 13245 +🌵 13246 +💐 13247 +💕 13248 +🙃 13249 +🧐 13250 +站 13251 +坐 13252 +把 13253 +Í 13254 +υ 13255 +ۙ 13256 +۸ 13257 +‍ 13258 +∪ 13259 +● 13260 +佰 13261 +僂 13262 +儂 13263 +匍 13264 +厠 13265 +唳 13266 +唸 13267 +嗬 13268 +嚯 13269 +孑 13270 +將 13271 +對 13272 +屍 13273 +岘 13274 +崑 13275 +帶 13276 +幇 13277 +廬 13278 +忸 13279 +恽 13280 +悗 13281 +慟 13282 +戕 13283 +拵 13284 +撫 13285 +撹 13286 +擤 13287 +旎 13288 +旖 13289 +桡 13290 +椟 13291 +楯 13292 +榉 13293 +樓 13294 +歃 13295 +毂 13296 +氣 13297 +氤 13298 +氲 13299 +洄 13300 +溟 13301 +漿 13302 +潋 13303 +濘 13304 +瀋 13305 +玥 13306 +珮 13307 +璽 13308 +甑 13309 +畷 13310 +疇 13311 +疥 13312 +癡 13313 +癩 13314 +睢 13315 +睨 13316 +砷 13317 +碕 13318 +磬 13319 +礇 13320 +祿 13321 +秣 13322 +稞 13323 +稟 13324 +笺 13325 +筅 13326 +筥 13327 +筺 13328 +篭 13329 +篾 13330 +簑 13331 +絃 13332 +緘 13333 +绺 13334 +缙 13335 +羟 13336 +耄 13337 +耋 13338 +耒 13339 +肽 13340 +胍 13341 +膦 13342 +臈 13343 +舁 13344 +舢 13345 +苜 13346 +荪 13347 +荸 13348 +莢 13349 +萢 13350 +蒡 13351 +蕁 13352 +蚜 13353 +蛸 13354 +蝮 13355 +蠹 13356 +裡 13357 +襁 13358 +襦 13359 +襪 13360 +謖 13361 +譚 13362 +谶 13363 +豉 13364 +貶 13365 +贰 13366 +蹼 13367 +躙 13368 +軋 13369 +輦 13370 +逓 13371 +逡 13372 +遑 13373 +郧 13374 +醮 13375 +鉗 13376 +鉤 13377 +鉦 13378 +錆 13379 +錢 13380 +錺 13381 +钣 13382 +铣 13383 +铱 13384 +锉 13385 +镊 13386 +镛 13387 +闊 13388 +陲 13389 +靂 13390 +靄 13391 +靛 13392 +頒 13393 +顛 13394 +颀 13395 +餞 13396 +饌 13397 +饒 13398 +髷 13399 +魑 13400 +鰾 13401 +鲇 13402 +鲳 13403 +鴇 13404 +鵝 13405 +鵯 13406 + 13407 +👀 13408 +😁 13409 +😕 13410 +😭 13411 +😻 13412 +🙄 13413 +🤪 13414 +Ü 13415 +必 13416 +玩 13417 +姐 13418 +机 13419 +个 13420 +什 13421 +Ā 13422 +鉈 13423 +Ä 13424 +Α 13425 +Ε 13426 +λ 13427 +μ 13428 +φ 13429 +ۛ 13430 +ۭ 13431 +۰ 13432 +۲ 13433 +۳ 13434 +۹ 13435 +′ 13436 +↑ 13437 +☻ 13438 +♠ 13439 +✌ 13440 +✔ 13441 +仝 13442 +伜 13443 +佚 13444 +侘 13445 +俅 13446 +俚 13447 +俦 13448 +偲 13449 +僖 13450 +儚 13451 +兇 13452 +勁 13453 +厭 13454 +厶 13455 +啮 13456 +喙 13457 +嗚 13458 +嘁 13459 +嘬 13460 +嘯 13461 +噙 13462 +囹 13463 +圄 13464 +圜 13465 +垓 13466 +埒 13467 +壟 13468 +妁 13469 +妣 13470 +姹 13471 +寶 13472 +尭 13473 +峋 13474 +崃 13475 +崙 13476 +崧 13477 +嶂 13478 +嶙 13479 +幔 13480 +忾 13481 +悱 13482 +愎 13483 +愼 13484 +懺 13485 +捲 13486 +揩 13487 +撺 13488 +晝 13489 +曉 13490 +杣 13491 +枋 13492 +枳 13493 +柝 13494 +柞 13495 +棗 13496 +椁 13497 +榑 13498 +榫 13499 +橈 13500 +檍 13501 +櫨 13502 +殯 13503 +氙 13504 +汜 13505 +洹 13506 +浬 13507 +涔 13508 +涜 13509 +涪 13510 +淖 13511 +淦 13512 +渫 13513 +溘 13514 +燿 13515 +爰 13516 +爲 13517 +狍 13518 +狢 13519 +獨 13520 +瑩 13521 +甙 13522 +瘢 13523 +盥 13524 +盧 13525 +眙 13526 +睚 13527 +碣 13528 +磽 13529 +祕 13530 +禮 13531 +秫 13532 +窠 13533 +笤 13534 +筿 13535 +箜 13536 +篌 13537 +簗 13538 +糅 13539 +糺 13540 +紂 13541 +絣 13542 +總 13543 +繚 13544 +缛 13545 +缫 13546 +羧 13547 +羸 13548 +翦 13549 +耆 13550 +聾 13551 +聿 13552 +腭 13553 +腴 13554 +臍 13555 +臚 13556 +臬 13557 +舂 13558 +艮 13559 +芡 13560 +苎 13561 +苧 13562 +苻 13563 +茲 13564 +莚 13565 +莜 13566 +菡 13567 +萋 13568 +萘 13569 +萠 13570 +蒐 13571 +蒺 13572 +蓁 13573 +蕩 13574 +藷 13575 +蘆 13576 +蘗 13577 +蝕 13578 +螢 13579 +蟥 13580 +蟷 13581 +蠑 13582 +衞 13583 +衮 13584 +衾 13585 +袢 13586 +裃 13587 +訛 13588 +詢 13589 +詭 13590 +謄 13591 +诮 13592 +豸 13593 +貉 13594 +贖 13595 +蹕 13596 +蹙 13597 +轢 13598 +辯 13599 +迤 13600 +迺 13601 +邛 13602 +郅 13603 +醴 13604 +鉉 13605 +銛 13606 +鋲 13607 +鎚 13608 +鑽 13609 +钼 13610 +锟 13611 +锨 13612 +镕 13613 +關 13614 +闩 13615 +靥 13616 +鞑 13617 +頤 13618 +餘 13619 +馕 13620 +鯤 13621 +鯱 13622 +鰐 13623 +鰤 13624 +鲑 13625 +鲠 13626 +鲷 13627 +鳟 13628 +鳶 13629 +鵠 13630 +鹞 13631 +鹳 13632 +麼 13633 +麽 13634 +黌 13635 +黠 13636 +🎛 13637 +💡 13638 +😌 13639 +😘 13640 +😧 13641 +🙁 13642 +🤛 13643 +🤜 13644 +🤨 13645 +🤭 13646 +ٕ 13647 +叔 13648 +姑 13649 +曾 13650 +肯 13651 +挺 13652 +嘛 13653 +其 13654 +而 13655 +觑 13656 +楂 13657 +婧 13658 +咩 13659 +鹉 13660 +驹 13661 +芜 13662 +篡 13663 +匕 13664 +颐 13665 +粱 13666 +昱 13667 +孜 13668 +佘 13669 +驮 13670 +蟀 13671 +蜕 13672 +萃 13673 +摞 13674 +嗜 13675 +啾 13676 +咣 13677 +蹿 13678 +讐 13679 +犊 13680 +燎 13681 +瀚 13682 +悯 13683 +讪 13684 +薰 13685 +痹 13686 +橇 13687 +幂 13688 +嗒 13689 +迂 13690 +糯 13691 +簇 13692 +竣 13693 +砌 13694 +榻 13695 +嫖 13696 +囧 13697 +噎 13698 +荫 13699 +粽 13700 +朦 13701 +捶 13702 +怔 13703 +崴 13704 +嚇 13705 +碱 13706 +剐 13707 +眩 13708 +珺 13709 +湛 13710 +殡 13711 +惮 13712 +乓 13713 +貂 13714 +殆 13715 +曙 13716 +雏 13717 +谴 13718 +荤 13719 +籽 13720 +渤 13721 +嫔 13722 +莘 13723 +痪 13724 +滇 13725 +囔 13726 +胚 13727 +篆 13728 +洼 13729 +坨 13730 +吝 13731 +眸 13732 +憬 13733 +婊 13734 +饪 13735 +膛 13736 +瞑 13737 +撸 13738 +懇 13739 +屿 13740 +鳅 13741 +髦 13742 +蝙 13743 +玮 13744 +壹 13745 +遢 13746 +遏 13747 +諏 13748 +笃 13749 +杞 13750 +擂 13751 +喃 13752 +瑕 13753 +犟 13754 +) 13755 +缔 13756 +曰 13757 +褂 13758 +舜 13759 +臊 13760 +簧 13761 +疡 13762 +沽 13763 +寐 13764 +鸳 13765 +谬 13766 +蘸 13767 +藕 13768 +羁 13769 +缅 13770 +窿 13771 +棣 13772 +撅 13773 +掷 13774 +嗷 13775 +吒 13776 +纶 13777 +碜 13778 +灏 13779 +殃 13780 +恤 13781 +跺 13782 +憔 13783 +鸯 13784 +鬟 13785 +颓 13786 +腮 13787 +咏 13788 +矜 13789 +漪 13790 +恬 13791 +峭 13792 +尧 13793 +嚎 13794 +馍 13795 +皖 13796 +褐 13797 +橱 13798 +羚 13799 +箍 13800 +煽 13801 +渝 13802 +柬 13803 +隼 13804 +蜓 13805 +窘 13806 +棱 13807 +谕 13808 +翟 13809 +絮 13810 +稷 13811 +拂 13812 +禧 13813 +涡 13814 +暫 13815 +涮 13816 +嚓 13817 +俪 13818 +侨 13819 +琵 13820 +溅 13821 +袄 13822 +癫 13823 +焊 13824 +湃 13825 +淌 13826 +亢 13827 +霆 13828 +熔 13829 +榄 13830 +怼 13831 +徙 13832 +驭 13833 +韬 13834 +隘 13835 +镯 13836 +锈 13837 +芷 13838 +澎 13839 +栾 13840 +黔 13841 +铝 13842 +缪 13843 +瘸 13844 +酥 13845 +缕 13846 +岑 13847 +噔 13848 +陡 13849 +锂 13850 +粑 13851 +烙 13852 +忑 13853 +匣 13854 +碾 13855 +鈍 13856 +衅 13857 +缎 13858 +缆 13859 +绞 13860 +瞩 13861 +猶 13862 +婪 13863 +嗖 13864 +伶 13865 +饨 13866 +镑 13867 +迢 13868 +茧 13869 +芊 13870 +纬 13871 +榨 13872 +饵 13873 +蝌 13874 +狛 13875 +蹋 13876 +窥 13877 +蚯 13878 +筐 13879 +畴 13880 +氪 13881 +阮 13882 +绰 13883 +笙 13884 +焕 13885 +抒 13886 +卤 13887 +庚 13888 +吭 13889 +馄 13890 +绢 13891 +甸 13892 +呕 13893 +贅 13894 +痨 13895 +浊 13896 +臆 13897 +紊 13898 +憨 13899 +乍 13900 +驷 13901 +槿 13902 +诵 13903 +瓢 13904 +帜 13905 +囤 13906 +咙 13907 +钝 13908 +珑 13909 +捋 13910 +拣 13911 +叼 13912 +弈 13913 +倚 13914 +賭 13915 +蚀 13916 +驿 13917 +雳 13918 +赘 13919 +蕊 13920 +玺 13921 +潼 13922 +洽 13923 +嗡 13924 +哺 13925 +詹 13926 +磅 13927 +漓 13928 +恺 13929 +徘 13930 +髓 13931 +颅 13932 +诫 13933 +绷 13934 +沱 13935 +殉 13936 +滔 13937 +淤 13938 +弩 13939 +嫣 13940 +嚏 13941 +珈 13942 +鲤 13943 +锯 13944 +钙 13945 +涕 13946 +霹 13947 +沥 13948 +沁 13949 +旱 13950 +铛 13951 +璇 13952 +啄 13953 +蕴 13954 +粤 13955 +旷 13956 +俐 13957 +# 13958 +瞻 13959 +坷 13960 +噪 13961 +诛 13962 +睐 13963 +璐 13964 +涓 13965 +糙 13966 +昕 13967 +咎 13968 +敖 13969 +懦 13970 +鹃 13971 +靶 13972 +熄 13973 +溯 13974 +拷 13975 +娅 13976 +钊 13977 +澈 13978 +眶 13979 +牡 13980 +蹬 13981 +翩 13982 +窖 13983 +恙 13984 +馋 13985 +贿 13986 +撩 13987 +撂 13988 +呸 13989 +篱 13990 +擎 13991 +喳 13992 +矣 13993 +邢 13994 +蛊 13995 +狈 13996 +冗 13997 +哧 13998 +骁 13999 +颂 14000 +襄 14001 +筱 14002 +俑 14003 +饷 14004 +霾 14005 +撬 14006 +虏 14007 +逾 14008 +撵 14009 +哆 14010 +闽 14011 +疮 14012 +摁 14013 +丐 14014 +鞅 14015 +砰 14016 +榆 14017 +痩 14018 +寥 14019 +钞 14020 +苇 14021 +缚 14022 +筝 14023 +甥 14024 +瘀 14025 +烁 14026 +拱 14027 +翎 14028 +坝 14029 +闸 14030 +踹 14031 +蝎 14032 +搓 14033 +骏 14034 +觅 14035 +俯 14036 +鸥 14037 +赣 14038 +翘 14039 +碟 14040 +沧 14041 +晗 14042 +屉 14043 +啼 14044 +跤 14045 +炕 14046 +噬 14047 +酪 14048 +梭 14049 +敛 14050 +惟 14051 +庐 14052 +矶 14053 +晾 14054 +臻 14055 +韧 14056 +呛 14057 +檐 14058 +氢 14059 +嬷 14060 +冕 14061 +俏 14062 +驯 14063 +绥 14064 +烨 14065 +掠 14066 +冉 14067 +兢 14068 +鲨 14069 +篷 14070 +瞄 14071 +檀 14072 +呦 14073 +刨 14074 +躯 14075 +盏 14076 +遛 14077 +煞 14078 +哩 14079 +钮 14080 +姗 14081 +闫 14082 +邵 14083 +萤 14084 +涩 14085 +兹 14086 +袱 14087 +漱 14088 +茬 14089 +滤 14090 +喧 14091 +鳌 14092 +绅 14093 +剁 14094 +飽 14095 +孵 14096 +埔 14097 +巩 14098 +黏 14099 +垄 14100 +窒 14101 +犀 14102 +☎ 14103 +宛 14104 +棘 14105 +僻 14106 +皂 14107 +沐 14108 +奠 14109 +挚 14110 +钧 14111 +楞 14112 +渺 14113 +岚 14114 +裴 14115 +苟 14116 +呱 14117 +鄂 14118 +讳 14119 +辫 14120 +跷 14121 +烘 14122 +垒 14123 +懵 14124 +怂 14125 +匀 14126 +陋 14127 +绒 14128 +瘩 14129 +琅 14130 +坞 14131 +” 14132 +黛 14133 +窜 14134 +诡 14135 +淫 14136 +嚣 14137 +盔 14138 +擒 14139 +阀 14140 +恍 14141 +疤 14142 +惭 14143 +聋 14144 +瘟 14145 +泻 14146 +搂 14147 +壤 14148 +咔 14149 +蓓 14150 +冀 14151 +狄 14152 +巅 14153 +懈 14154 +瘫 14155 +碳 14156 +雌 14157 +讼 14158 +亨 14159 +葩 14160 +辙 14161 +冈 14162 +诏 14163 +剔 14164 +蝇 14165 +佬 14166 +腥 14167 +绎 14168 +笋 14169 +赃 14170 +秃 14171 +泌 14172 +呜 14173 +撇 14174 +粪 14175 +睹 14176 +娲 14177 +诬 14178 +纺 14179 +莽 14180 +貿 14181 +驸 14182 +揽 14183 +窦 14184 +嗨 14185 +倦 14186 +眯 14187 +赁 14188 +琦 14189 +凿 14190 +啰 14191 +唧 14192 +渗 14193 +戳 14194 +惶 14195 +灶 14196 +墩 14197 +鲸 14198 +霄 14199 +揪 14200 +蟆 14201 +煲 14202 +殷 14203 +莺 14204 +咧 14205 +吱 14206 +掰 14207 +峥 14208 +驼 14209 +炳 14210 +棕 14211 +刁 14212 +瑾 14213 +叱 14214 +躬 14215 +眷 14216 +崽 14217 +倪 14218 +鸽 14219 +铲 14220 +芭 14221 +戈 14222 +淼 14223 +汹 14224 +拶 14225 +吁 14226 +苛 14227 +窍 14228 +栈 14229 +斋 14230 +摧 14231 +岔 14232 +娄 14233 +倔 14234 +阱 14235 +拧 14236 +辖 14237 +仆 14238 +诀 14239 +隶 14240 +滥 14241 +敞 14242 +掀 14243 +喇 14244 +勿 14245 +铸 14246 +眺 14247 +晏 14248 +惫 14249 +蛤 14250 +拢 14251 +倭 14252 +焰 14253 +衔 14254 +蔷 14255 +谜 14256 +捆 14257 +俭 14258 +荆 14259 +咯 14260 +: 14261 +驳 14262 +溺 14263 +琼 14264 +拎 14265 +聂 14266 +迭 14267 +浆 14268 +嘻 14269 +捂 14270 +酿 14271 +啃 14272 +骤 14273 +歼 14274 +谍 14275 +劈 14276 +廖 14277 +腊 14278 +讽 14279 +茄 14280 +孽 14281 +舔 14282 +哒 14283 +槐 14284 +哗 14285 +蜀 14286 +贬 14287 +鑫 14288 +竭 14289 +掐 14290 +妍 14291 +绽 14292 +叭 14293 +揣 14294 +衫 14295 +噩 14296 +馅 14297 +硕 14298 +佟 14299 +鄙 14300 +蓬 14301 +骆 14302 +绊 14303 +亩 14304 +阎 14305 +昊 14306 +倡 14307 +俘 14308 +睿 14309 +厦 14310 +勺 14311 +餃 14312 +锡 14313 +挠 14314 +帐 14315 +衬 14316 +沛 14317 +兮 14318 +锣 14319 +竖 14320 +拽 14321 +巢 14322 +颖 14323 +惕 14324 +颤 14325 +墅 14326 +啤 14327 +贞 14328 +嘎 14329 +飙 14330 +沦 14331 +貯 14332 +轴 14333 +捅 14334 +抠 14335 +鹤 14336 +瓣 14337 +嘿 14338 +喻 14339 +樊 14340 +帘 14341 +莓 14342 +恕 14343 +嗑 14344 +啸 14345 +靓 14346 +轿 14347 +谭 14348 +桩 14349 +筷 14350 +揍 14351 +坠 14352 +蔓 14353 +蜡 14354 +螺 14355 +蔬 14356 +龚 14357 +咚 14358 +钏 14359 +郵 14360 +恳 14361 +琐 14362 +奕 14363 +槛 14364 +嗦 14365 +凳 14366 +侃 14367 +眨 14368 +猩 14369 +娥 14370 +缉 14371 +氧 14372 +扒 14373 +鹊 14374 +猬 14375 +烛 14376 +吼 14377 +铮 14378 +仨 14379 +蘑 14380 +叮 14381 +潇 14382 +谐 14383 +皱 14384 +葡 14385 +狡 14386 +歧 14387 +雯 14388 +瞪 14389 +嫉 14390 +卦 14391 +枣 14392 +舱 14393 +佣 14394 +绸 14395 +钦 14396 +纤 14397 +妒 14398 +熙 14399 +勋 14400 +鲍 14401 +厢 14402 +僵 14403 +喵 14404 +浇 14405 +瑟 14406 +淮 14407 +饥 14408 +韦 14409 +搏 14410 +瘾 14411 +炖 14412 +痰 14413 +叽 14414 +驰 14415 +碌 14416 +嫩 14417 +袍 14418 +鳄 14419 +肆 14420 +挪 14421 +勃 14422 +侄 14423 +彤 14424 +曦 14425 +钓 14426 +淹 14427 +枫 14428 +坟 14429 +讶 14430 +罕 14431 +硅 14432 +婢 14433 +樱 14434 +唬 14435 +辟 14436 +缸 14437 +绵 14438 +郝 14439 +炫 14440 +辽 14441 +纲 14442 +氓 14443 +繊 14444 +嗽 14445 +谣 14446 +瑶 14447 +奄 14448 +儒 14449 +蹭 14450 +菇 14451 +氾 14452 +垮 14453 +帕 14454 +剖 14455 +澜 14456 +哑 14457 +锐 14458 +馈 14459 +铭 14460 +衍 14461 +顽 14462 +袜 14463 +裹 14464 +屠 14465 +兑 14466 +膊 14467 +叠 14468 +咒 14469 +柯 14470 +耿 14471 +赎 14472 +捣 14473 +婴 14474 +颇 14475 +钩 14476 +痒 14477 +嗓 14478 +拯 14479 +杠 14480 +泼 14481 +纱 14482 +攒 14483 +谊 14484 +胀 14485 +捏 14486 +稻 14487 +俞 14488 +坎 14489 +锤 14490 +虾 14491 +禀 14492 +壶 14493 +赫 14494 +渊 14495 +貼 14496 +趴 14497 +矮 14498 +框 14499 +萍 14500 +饺 14501 +菩 14502 +赠 14503 +灿 14504 +梳 14505 +啪 14506 +嘲 14507 +畏 14508 +肪 14509 +婉 14510 +囊 14511 +砖 14512 +渔 14513 +娇 14514 +喘 14515 +秩 14516 +瑰 14517 +搅 14518 +剿 14519 +仑 14520 +斩 14521 +哼 14522 +韵 14523 +捞 14524 +巫 14525 +躁 14526 +蒂 14527 +怡 14528 +寓 14529 +贯 14530 +镖 14531 +滩 14532 +赐 14533 +珊 14534 +钉 14535 +磕 14536 +澳 14537 +删 14538 +姬 14539 +莹 14540 +攀 14541 +宪 14542 +醋 14543 +蹲 14544 +毙 14545 +骚 14546 +哇 14547 +刮 14548 +贱 14549 +穆 14550 +妄 14551 +垫 14552 +烫 14553 +剂 14554 +逊 14555 +栋 14556 +勧 14557 +裙 14558 +滨 14559 +褒 14560 +甩 14561 +氛 14562 +缴 14563 +丛 14564 +侣 14565 +塌 14566 +鸦 14567 +嚷 14568 +腻 14569 +蠢 14570 +涵 14571 +颠 14572 +尬 14573 +胶 14574 +伞 14575 +沾 14576 +瞅 14577 +吨 14578 +臂 14579 +雾 14580 +妞 14581 +沪 14582 +肿 14583 +泛 14584 +贩 14585 +寞 14586 +笼 14587 +枉 14588 +嘟 14589 +蚁 14590 +愣 14591 +歹 14592 +歪 14593 +酱 14594 +犠 14595 +雕 14596 +铃 14597 +耻 14598 +谦 14599 +窑 14600 +霉 14601 +阔 14602 +愉 14603 +鸿 14604 +辅 14605 +咸 14606 +撕 14607 +憧 14608 +溃 14609 +览 14610 +棉 14611 +擅 14612 +姚 14613 +脖 14614 +芬 14615 +赋 14616 +辨 14617 +煤 14618 +聆 14619 +遮 14620 +砍 14621 +唤 14622 +憋 14623 +捧 14624 +穫 14625 +蹈 14626 +诱 14627 +鸣 14628 +窃 14629 +绳 14630 +哄 14631 +婶 14632 +弗 14633 +玻 14634 +杆 14635 +绘 14636 +瓷 14637 +琢 14638 +咐 14639 +驱 14640 +噜 14641 +绣 14642 +庞 14643 +萝 14644 +浙 14645 +惩 14646 +诈 14647 +潘 14648 +骄 14649 +肃 14650 +杭 14651 +叨 14652 +厕 14653 +宠 14654 +驴 14655 +揭 14656 +匙 14657 +掏 14658 +篮 14659 +庙 14660 +萧 14661 +圳 14662 +愤 14663 +羞 14664 +钥 14665 +颈 14666 +琪 14667 +舰 14668 +蛙 14669 +浓 14670 +扛 14671 +咕 14672 +抚 14673 +纽 14674 +唠 14675 +践 14676 +盼 14677 +吕 14678 +踩 14679 +苍 14680 +匆 14681 +翅 14682 +霍 14683 +罐 14684 +郊 14685 +茫 14686 +拘 14687 +详 14688 +蹦 14689 +祁 14690 +艳 14691 +鉴 14692 +赴 14693 +贡 14694 +谨 14695 +坛 14696 +跪 14697 +咪 14698 +循 14699 +俄 14700 +卢 14701 +抖 14702 +译 14703 +龟 14704 +鹰 14705 +摊 14706 +岭 14707 +妨 14708 +翌 14709 +齿 14710 +黎 14711 +棵 14712 +尘 14713 +壳 14714 +詐 14715 +踢 14716 +渴 14717 +羡 14718 +辩 14719 +愈 14720 +吞 14721 +冻 14722 +雰 14723 +页 14724 +胁 14725 +袁 14726 +鹅 14727 +哟 14728 +轩 14729 +迈 14730 +玛 14731 +盐 14732 +鹏 14733 +拨 14734 +夹 14735 +逛 14736 +肾 14737 +捐 14738 +肤 14739 +栏 14740 +矿 14741 +嘞 14742 +狮 14743 +饰 14744 +缠 14745 +捡 14746 +昏 14747 +饶 14748 +遵 14749 +恼 14750 +污 14751 +扑 14752 +肠 14753 +彭 14754 +澡 14755 +娱 14756 +箭 14757 +悬 14758 +叹 14759 +驻 14760 +卧 14761 +辉 14762 +畅 14763 +锋 14764 +薪 14765 +轰 14766 +疏 14767 +幺 14768 +凑 14769 +趋 14770 +烤 14771 +晕 14772 +婷 14773 +耽 14774 +掩 14775 +惧 14776 +逻 14777 +陌 14778 +愧 14779 +剪 14780 +铜 14781 +裤 14782 +挤 14783 +纹 14784 +崔 14785 +搁 14786 +诞 14787 +薛 14788 +蔡 14789 +丑 14790 +購 14791 +综 14792 +妥 14793 +拟 14794 +掲 14795 +浑 14796 +侧 14797 +粘 14798 +伪 14799 +飘 14800 +姆 14801 +罢 14802 +憾 14803 +歇 14804 +扭 14805 +阁 14806 +邮 14807 +罩 14808 +缝 14809 +妆 14810 +莲 14811 +岗 14812 +堪 14813 +跨 14814 +瘦 14815 +冤 14816 +脉 14817 +萨 14818 +偿 14819 +倾 14820 +睁 14821 +闷 14822 +膀 14823 +兽 14824 +贪 14825 +砸 14826 +跃 14827 +锦 14828 +邻 14829 +脆 14830 +凯 14831 +懒 14832 +圾 14833 +鸭 14834 +笨 14835 +迁 14836 +册 14837 +勾 14838 +饼 14839 +傲 14840 +醉 14841 +筹 14842 +询 14843 +贼 14844 +贤 14845 +汪 14846 +纵 14847 +妮 14848 +卑 14849 +盒 14850 +贺 14851 +贸 14852 +挡 14853 +闯 14854 +抛 14855 +耍 14856 +饱 14857 +艰 14858 +炼 14859 +敲 14860 +拦 14861 +扮 14862 +贾 14863 +哎 14864 +霸 14865 +丧 14866 +椅 14867 +喷 14868 +挨 14869 +叛 14870 +拆 14871 +谎 14872 +袭 14873 +糕 14874 +贫 14875 +谱 14876 +冯 14877 +荐 14878 +轨 14879 +蒋 14880 +丫 14881 +荡 14882 +昆 14883 +摔 14884 +伦 14885 +恰 14886 +啡 14887 +猎 14888 +熬 14889 +孕 14890 +唉 14891 +邓 14892 +夺 14893 +洁 14894 +拔 14895 +扶 14896 +闺 14897 +绕 14898 +揺 14899 +◆ 14900 +矛 14901 +祸 14902 +惹 14903 +呆 14904 +钻 14905 +糟 14906 +忧 14907 +缩 14908 +纠 14909 +陛 14910 +淘 14911 +钢 14912 +佩 14913 +喽 14914 +仿 14915 +瞒 14916 +谅 14917 +插 14918 +夸 14919 +赖 14920 +狸 14921 +诶 14922 +趁 14923 +扣 14924 +咖 14925 +悄 14926 +匪 14927 +卷 14928 +仪 14929 +窝 14930 +绑 14931 +厌 14932 +辑 14933 +匹 14934 +咬 14935 +泽 14936 +涂 14937 +赌 14938 +盯 14939 +悉 14940 +抬 14941 +侦 14942 +呐 14943 +赔 14944 +挖 14945 +扎 14946 +铺 14947 +烂 14948 +扯 14949 +凌 14950 +宾 14951 +扩 14952 +牵 14953 +灾 14954 +乖 14955 +仔 14956 +诸 14957 +乘 14958 +驶 14959 +碎 14960 +脏 14961 +娶 14962 +魏 14963 +扔 14964 +躺 14965 +柜 14966 +储 14967 +屁 14968 +艾 14969 +邀 14970 +锁 14971 +篇 14972 +狠 14973 +尸 14974 +仓 14975 +锅 14976 +撑 14977 +鲁 14978 +彻 14979 +狱 14980 +饮 14981 +踪 14982 +骑 14983 +档 14984 +披 14985 +赏 14986 +乌 14987 +赞 14988 +缓 14989 +洪 14990 +穷 14991 +恢 14992 +郑 14993 +瞎 14994 +罚 14995 +闪 14996 +毁 14997 +阅 14998 +凤 14999 +础 15000 +纷 15001 +涉 15002 +订 15003 +递 15004 +猴 15005 +链 15006 +喂 15007 +扬 15008 +宽 15009 +奋 15010 +阻 15011 +滚 15012 +龄 15013 +扫 15014 +违 15015 +迪 15016 +乔 15017 +凉 15018 +扰 15019 +桥 15020 +圣 15021 +歉 15022 +岛 15023 +闲 15024 +拒 15025 +趟 15026 +疯 15027 +娜 15028 +陷 15029 +润 15030 +缘 15031 +汇 15032 +纯 15033 +粮 15034 +访 15035 +窗 15036 +库 15037 +剑 15038 +摇 15039 +诊 15040 +废 15041 +迟 15042 +载 15043 +竞 15044 +颗 15045 +墙 15046 +暂 15047 +桌 15048 +撞 15049 +稍 15050 +摄 15051 +拖 15052 +沟 15053 +瞧 15054 +肚 15055 +聪 15056 +纳 15057 +饿 15058 +忽 15059 +诺 15060 +忆 15061 +驾 15062 +迹 15063 +摸 15064 +赢 15065 +伟 15066 +埋 15067 +晨 15068 +贷 15069 +贴 15070 +阴 15071 +汤 15072 +疲 15073 +诗 15074 +启 15075 +跌 15076 +圆 15077 +绩 15078 +鸟 15079 +甜 15080 +喊 15081 +挣 15082 +胖 15083 +帅 15084 +诚 15085 +劝 15086 +亏 15087 +绿 15088 +仇 15089 +骂 15090 +编 15091 +摆 15092 +谋 15093 +厅 15094 +针 15095 +尤 15096 +聚 15097 +猜 15098 +渐 15099 +损 15100 +朵 15101 +荣 15102 +躲 15103 +灭 15104 +孤 15105 +颜 15106 +杰 15107 +韩 15108 +镜 15109 +镇 15110 +剩 15111 +挥 15112 +遗 15113 +盖 15114 +嫂 15115 +阶 15116 +遭 15117 +闭 15118 +辆 15119 +鲜 15120 +顿 15121 +拼 15122 +旁 15123 +奖 15124 +签 15125 +庆 15126 +撤 15127 +苹 15128 +债 15129 +挂 15130 +沉 15131 +审 15132 +齐 15133 +丰 15134 +赚 15135 +租 15136 +隐 15137 +媳 15138 +阵 15139 +腾 15140 +尝 15141 +吓 15142 +兔 15143 +币 15144 +拥 15145 +绪 15146 +纸 15147 +估 15148 +络 15149 +烟 15150 +默 15151 +协 15152 +劲 15153 +炸 15154 +寻 15155 +欺 15156 +账 15157 +劳 15158 +凭 15159 +搜 15160 +呗 15161 +傅 15162 +汽 15163 +蓝 15164 +杂 15165 +恶 15166 +异 15167 +县 15168 +轮 15169 +键 15170 +碰 15171 +傻 15172 +吵 15173 +冰 15174 +绍 15175 +惯 15176 +哦 15177 +输 15178 +舒 15179 +搬 15180 +谓 15181 +词 15182 +抢 15183 +亚 15184 +执 15185 +猪 15186 +厉 15187 +烧 15188 +减 15189 +丢 15190 +软 15191 +织 15192 +逼 15193 +毎 15194 +训 15195 +丝 15196 +归 15197 +疗 15198 +疼 15199 +兰 15200 +释 15201 +乡 15202 +稳 15203 +缺 15204 +范 15205 +胜 15206 +笔 15207 +陆 15208 +败 15209 +宁 15210 +售 15211 +顶 15212 +赛 15213 +吴 15214 +购 15215 +净 15216 +积 15217 +惊 15218 +额 15219 +翻 15220 +弃 15221 +弹 15222 +赵 15223 +漂 15224 +讨 15225 +盘 15226 +课 15227 +农 15228 +敌 15229 +园 15230 +码 15231 +检 15232 +构 15233 +讯 15234 +评 15235 +晓 15236 +闻 15237 +馆 15238 +灵 15239 +频 15240 +鸡 15241 +贝 15242 +临 15243 +拜 15244 +厂 15245 +骗 15246 +测 15247 +录 15248 +杨 15249 +哈 15250 +纪 15251 +层 15252 +补 15253 +维 15254 +铁 15255 +宫 15256 +艺 15257 +偷 15258 +妇 15259 +销 15260 +涨 15261 +剧 15262 +罗 15263 +圈 15264 +误 15265 +卡 15266 +蛋 15267 +努 15268 +闹 15269 +练 15270 +姨 15271 +搞 15272 +卫 15273 +批 15274 +丽 15275 +监 15276 +孙 15277 +辈 15278 +毕 15279 +枪 15280 +虑 15281 +举 15282 +爹 15283 +狗 15284 +货 15285 +优 15286 +围 15287 +效 15288 +伙 15289 +苏 15290 +烦 15291 +获 15292 +累 15293 +树 15294 +鱼 15295 +汉 15296 +坚 15297 +《 15298 +压 15299 +某 15300 +语 15301 +醒 15302 +预 15303 +尔 15304 +职 15305 +济 15306 +按 15307 +环 15308 +势 15309 +贵 15310 +怀 15311 +则 15312 +钟 15313 +银 15314 +坏 15315 +乎 15316 +顺 15317 +仅 15318 +图 15319 +靠 15320 +项 15321 +划 15322 +细 15323 +择 15324 +适 15325 +议 15326 +严 15327 +梦 15328 +际 15329 +既 15330 +财 15331 +竟 15332 +击 15333 +懂 15334 +脑 15335 +显 15336 +责 15337 +云 15338 +权 15339 +极 15340 +穿 15341 +响 15342 +简 15343 +假 15344 +验 15345 +德 15346 +标 15347 +级 15348 +负 15349 +继 15350 +须 15351 +顾 15352 +刘 15353 +换 15354 +险 15355 +抓 15356 +广 15357 +脸 15358 +陈 15359 +质 15360 +约 15361 +习 15362 +戏 15363 +营 15364 +读 15365 +护 15366 +普 15367 +呃 15368 +龙 15369 +谈 15370 +组 15371 +众 15372 +历 15373 +黑 15374 +掉 15375 +阳 15376 +排 15377 +值 15378 +养 15379 +增 15380 +规 15381 +专 15382 +华 15383 +绝 15384 +统 15385 +亿 15386 +药 15387 +类 15388 +游 15389 +态 15390 +卖 15391 +啥 15392 +〉 15393 +啦 15394 +兴 15395 +试 15396 +户 15397 +〈 15398 +终 15399 +奶 15400 +义 15401 +岁 15402 +热 15403 +领 15404 +模 15405 +满 15406 +论 15407 +转 15408 +创 15409 +观 15410 +飞 15411 +视 15412 +术 15413 +续 15414 +设 15415 +复 15416 +嗯 15417 +聊 15418 +费 15419 +伤 15420 +运 15421 +份 15422 +赶 15423 +团 15424 +步 15425 +导 15426 +轻 15427 +拉 15428 +跑 15429 +[ 15430 +] 15431 +许 15432 +识 15433 +愿 15434 +红 15435 +杀 15436 +调 15437 +饭 15438 +达 15439 +况 15440 +选 15441 +紧 15442 +传 15443 +价 15444 +查 15445 +线 15446 +乐 15447 +联 15448 +块 15449 +据 15450 +ฒ 15451 +俩 15452 +较 15453 +决 15454 +备 15455 +强 15456 +证 15457 +远 15458 +节 15459 +单 15460 +连 15461 +网 15462 +书 15463 +确 15464 +风 15465 +ฎ 15466 +错 15467 +买 15468 +务 15469 +且 15470 +怕 15471 +并 15472 +爷 15473 +或 15474 +诉 15475 +离 15476 +战 15477 +员 15478 +张 15479 +计 15480 +晚 15481 +队 15482 +๘ 15483 +记 15484 +够 15485 +๗ 15486 +各 15487 +收 15488 +拿 15489 +处 15490 +报 15491 +讲 15492 +资 15493 +请 15494 +帮 15495 +门 15496 +认 15497 +变 15498 +亲 15499 +马 15500 +结 15501 +办 15502 +总 15503 +欢 15504 +难 15505 +产 15506 +每 15507 +军 15508 +ỡ 15509 +谁 15510 +爱 15511 +刚 15512 +带 15513 +爸 15514 +题 15515 +车 15516 +气 15517 +哥 15518 +场 15519 +师 15520 +几 15521 +电 15522 +谢 15523 +孩 15524 +该 15525 +无 15526 +咱 15527 +边 15528 +哪 15529 +钱 15530 +应 15531 +头 15532 +东 15533 +吃 15534 +业 15535 +找 15536 +进 15537 +见 15538 +关 15539 +它 15540 +妈 15541 +听 15542 +已 15543 +动 15544 +从 15545 +您 15546 +于 15547 +间 15548 +问 15549 +๕ 15550 +两 15551 +呀 15552 +种 15553 +只 15554 +觉 15555 +长 15556 +让 15557 +但 15558 +她 15559 +发 15560 +ẫ 15561 +做 15562 +实 15563 +些 15564 +话 15565 +开 15566 +经 15567 +别 15568 +怎 15569 +ằ 15570 +很 15571 +๑ 15572 +吗 15573 +吧 15574 +跟 15575 +๐ 15576 +样 15577 +儿 15578 +给 15579 +现 15580 +呢 15581 +对 15582 +过 15583 +看 15584 +时 15585 +还 15586 +为 15587 +ặ 15588 +啊 15589 +ắ 15590 +说 15591 +么 15592 +们 15593 +ึ 15594 +ậ 15595 +โ 15596 +这 15597 +ํ 15598 +你 15599 +ấ 15600 +ใ 15601 +‪ 15602 +🌻 15603 +Š 15604 +چ 15605 +ۡ 15606 +蜆 15607 + 15608 +$ 15609 +; 15610 +_ 15611 +¥ 15612 +® 15613 +À 15614 +È 15615 +Ò 15616 +Ņ 15617 +Ō 15618 +̀ 15619 +Λ 15620 +Ξ 15621 +η 15622 +π 15623 +ھ 15624 +ۜ 15625 +ۢ 15626 +۩ 15627 +۷ 15628 +ࣰ 15629 +‰ 15630 +‹ 15631 +› 15632 +※ 15633 +⁄ 15634 +€ 15635 +≥ 15636 +☝ 15637 +☹ 15638 +♣ 15639 +♦ 15640 +⚫ 15641 +乩 15642 +亙 15643 +亰 15644 +仟 15645 +伥 15646 +俟 15647 +俥 15648 +偈 15649 +僊 15650 +僣 15651 +僮 15652 +兪 15653 +冼 15654 +凇 15655 +刿 15656 +剜 15657 +劔 15658 +劵 15659 +勐 15660 +勰 15661 +叢 15662 +叺 15663 +叻 15664 +呋 15665 +呤 15666 +唔 15667 +唖 15668 +唪 15669 +唻 15670 +啭 15671 +喒 15672 +喟 15673 +嘌 15674 +嚔 15675 +囁 15676 +囍 15677 +囮 15678 +圩 15679 +坻 15680 +垪 15681 +垭 15682 +埓 15683 +埙 15684 +墁 15685 +夔 15686 +夘 15687 +娣 15688 +媽 15689 +嫘 15690 +屐 15691 +屮 15692 +峽 15693 +嵊 15694 +嵋 15695 +嶮 15696 +帔 15697 +廚 15698 +弐 15699 +弖 15700 +徂 15701 +徠 15702 +徭 15703 +恆 15704 +愠 15705 +愴 15706 +戗 15707 +戞 15708 +挈 15709 +捯 15710 +摎 15711 +攣 15712 +數 15713 +斃 15714 +斫 15715 +旻 15716 +晄 15717 +晔 15718 +晷 15719 +暈 15720 +暹 15721 +朶 15722 +杢 15723 +枦 15724 +柒 15725 +栢 15726 +桴 15727 +桿 15728 +梟 15729 +椏 15730 +椚 15731 +椶 15732 +椹 15733 +楳 15734 +槁 15735 +槨 15736 +樒 15737 +樯 15738 +樾 15739 +橛 15740 +橹 15741 +櫚 15742 +歿 15743 +殂 15744 +氅 15745 +氩 15746 +泠 15747 +泫 15748 +洟 15749 +浐 15750 +漣 15751 +潅 15752 +潞 15753 +澱 15754 +濑 15755 +瀟 15756 +炝 15757 +焘 15758 +煅 15759 +煊 15760 +煕 15761 +煥 15762 +煬 15763 +熵 15764 +燐 15765 +燚 15766 +爐 15767 +玟 15768 +瓠 15769 +甾 15770 +畭 15771 +疋 15772 +疔 15773 +疣 15774 +疳 15775 +痙 15776 +瘻 15777 +癔 15778 +皀 15779 +皌 15780 +皺 15781 +眇 15782 +瞋 15783 +砣 15784 +硲 15785 +硼 15786 +磧 15787 +禪 15788 +秕 15789 +秡 15790 +稙 15791 +稱 15792 +穃 15793 +穰 15794 +窨 15795 +窩 15796 +竦 15797 +筈 15798 +筚 15799 +筬 15800 +箐 15801 +篥 15802 +篦 15803 +篳 15804 +簋 15805 +籟 15806 +籤 15807 +糒 15808 +紮 15809 +絅 15810 +絲 15811 +絽 15812 +綵 15813 +綸 15814 +緬 15815 +縢 15816 +縵 15817 +縷 15818 +縺 15819 +繝 15820 +繧 15821 +绌 15822 +绦 15823 +绶 15824 +缑 15825 +罎 15826 +罫 15827 +羈 15828 +胛 15829 +腓 15830 +膣 15831 +膾 15832 +臑 15833 +艤 15834 +艱 15835 +艹 15836 +苕 15837 +茔 15838 +荜 15839 +莒 15840 +萁 15841 +蓖 15842 +蔀 15843 +蕕 15844 +蕪 15845 +蕷 15846 +薀 15847 +薊 15848 +蘅 15849 +蘋 15850 +虬 15851 +蜉 15852 +蝣 15853 +蝸 15854 +蟇 15855 +袷 15856 +裢 15857 +褄 15858 +褊 15859 +褡 15860 +襞 15861 +襴 15862 +觞 15863 +註 15864 +誅 15865 +誊 15866 +誼 15867 +謠 15868 +謨 15869 +譟 15870 +讀 15871 +讒 15872 +诂 15873 +诒 15874 +谯 15875 +豈 15876 +豐 15877 +豕 15878 +貳 15879 +賁 15880 +賈 15881 +贓 15882 +贲 15883 +趄 15884 +趔 15885 +趵 15886 +趸 15887 +跏 15888 +跖 15889 +跬 15890 +踟 15891 +蹇 15892 +蹐 15893 +蹰 15894 +躰 15895 +躾 15896 +輒 15897 +逶 15898 +邇 15899 +邗 15900 +鄲 15901 +酘 15902 +醗 15903 +釋 15904 +鈎 15905 +鈔 15906 +銜 15907 +鋏 15908 +錘 15909 +錾 15910 +鍍 15911 +鏨 15912 +鐙 15913 +鐸 15914 +鑼 15915 +钡 15916 +钺 15917 +铍 15918 +铵 15919 +锆 15920 +镒 15921 +閼 15922 +闕 15923 +陂 15924 +陜 15925 +雙 15926 +靜 15927 +靼 15928 +鞣 15929 +鞨 15930 +韪 15931 +頴 15932 +頷 15933 +顯 15934 +颏 15935 +颞 15936 +颶 15937 +餉 15938 +馔 15939 +駝 15940 +駱 15941 +駸 15942 +骠 15943 +髀 15944 +髌 15945 +髯 15946 +鬘 15947 +鬚 15948 +鬢 15949 +鬨 15950 +魃 15951 +魎 15952 +鮑 15953 +鮓 15954 +鮟 15955 +鯰 15956 +鰆 15957 +鰍 15958 +鱠 15959 +鱸 15960 +鲧 15961 +鳜 15962 +鳫 15963 +鴛 15964 +鴦 15965 +鴬 15966 +鵡 15967 +鷽 15968 +鸪 15969 +鸮 15970 +鸱 15971 +鹗 15972 +鹧 15973 +齉 15974 +齟 15975 +齧 15976 +齬 15977 + 15978 + 15979 + 15980 + 15981 +🌈 15982 +🎠 15983 +🎡 15984 +👆 15985 +👈 15986 +👌 15987 +👷 15988 +💃 15989 +💘 15990 +💙 15991 +💛 15992 +💨 15993 +💪 15994 +Ē 15995 +禳 15996 +腟 15997 +ไ 15998 +♩ 15999 +#0 16000 +#1 16001 +#2 16002 +#3 16003 +#4 16004 +#5 16005 +#6 16006 +#7 16007 +#8 16008 +#9 16009 +#10 16010 +#11 16011 +#12 16012 +#13 16013 +#14 16014 +#15 16015 From 536bfd2e093932b3be6e8154f60b7d5b1190839a Mon Sep 17 00:00:00 2001 From: ailia_watanabe Date: Tue, 24 Feb 2026 12:59:09 +0900 Subject: [PATCH 11/15] Add model link --- README.md | 1 + scripts/download_all_models.sh | 1 + 2 files changed, 2 insertions(+) diff --git a/README.md b/README.md index 3258f2274..e0accbb8b 100644 --- a/README.md +++ b/README.md @@ -132,6 +132,7 @@ If you would like to try on your computer: | [reazon_speech2](/audio_processing/reazon_speech2/) | [ReazonSpeech2](https://research.reazon.jp/projects/ReazonSpeech/) | Pytorch | 1.4.0 and later | Feb 2024 | | | [kotoba-whisper](/audio_processing/kotoba-whisper/) | [kotoba-whisper](https://huggingface.co/kotoba-tech/kotoba-whisper-v1.0) | Pytorch | 1.2.16 and later | Apr 2024 | | | [sensevoice](/audio_processing/sensevoice/) | [SenseVoice](https://github.com/FunAudioLLM/SenseVoice) | Pytorch | 1.2.13 and later | July 2024 | [JP](https://medium.com/axinc/sensevoice-%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%81%AB%E3%82%82%E5%AF%BE%E5%BF%9C%E3%81%97%E3%81%9F%E9%AB%98%E9%80%9F%E3%81%AA%E9%9F%B3%E5%A3%B0%E8%AA%8D%E8%AD%98%E3%83%A2%E3%83%87%E3%83%AB-3721c79e0592) | +| [sherpa-onnx](/audio_processing/sherpa-onnx/) | [sherpa-onnx](https://huggingface.co/csukuangfj/sherpa-onnx-streaming-zipformer-ar_en_id_ja_ru_th_vi_zh-2025-02-10/tree/main) | Pytorch | | Feb 2026 | | ### Text to speech diff --git a/scripts/download_all_models.sh b/scripts/download_all_models.sh index 697007a12..09f75a30d 100755 --- a/scripts/download_all_models.sh +++ b/scripts/download_all_models.sh @@ -48,6 +48,7 @@ cd ../../audio_processing/audiosep/; python3 audiosep.py ${OPTION} cd ../../audio_processing/cosyvoice2/; python3 cosyvoice2.py ${OPTION} cd ../../audio_processing/sensevoice/; python3 sensevoice.py ${OPTION} cd ../../audio_processing/demucs/; python3 demucs.py ${OPTION} +cd ../../audio_processing/sherpa-onnx/; python3 sherpa-onnx.py ${OPTION} cd ../../background_ramoval/deep-image-matting; python3 deep-image-matting.py ${OPTION} cd ../../background_ramoval/u2net; python3 u2net.py ${OPTION} cd ../../background_ramoval/u2net; python3 u2net.py -a small ${OPTION} From bc5ff1be81a27a2bf9fe41a53c885a2f8b7a9d05 Mon Sep 17 00:00:00 2001 From: ailia_watanabe Date: Tue, 24 Feb 2026 14:07:48 +0900 Subject: [PATCH 12/15] Changed to download model --- audio_processing/sherpa-onnx/sherpa-onnx.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/audio_processing/sherpa-onnx/sherpa-onnx.py b/audio_processing/sherpa-onnx/sherpa-onnx.py index 4cc7880d2..081536ed8 100644 --- a/audio_processing/sherpa-onnx/sherpa-onnx.py +++ b/audio_processing/sherpa-onnx/sherpa-onnx.py @@ -10,6 +10,8 @@ sys.path.append('../../util') from arg_utils import get_base_parser, update_parser from microphone_utils import start_microphone_input +from model_utils import check_and_download_models + logger = getLogger(__name__) @@ -343,6 +345,9 @@ def main(): WEIGHT_ENC_PATH, MODEL_ENC_PATH = model_info["enc"] WEIGHT_DEC_PATH, MODEL_DEC_PATH = model_info["dec"] WEIGHT_JOI_PATH, MODEL_JOI_PATH = model_info["joi"] + check_and_download_models(WEIGHT_ENC_PATH, MODEL_ENC_PATH, REMOTE_PATH) + check_and_download_models(WEIGHT_DEC_PATH, MODEL_DEC_PATH, REMOTE_PATH) + check_and_download_models(WEIGHT_JOI_PATH, MODEL_JOI_PATH, REMOTE_PATH) MODEL_OFFSET = model_info["offset"] TOKEN_PATH = model_info["token"] From 84849b87bf1bd70d6893ade9d1f024abddc8fae3 Mon Sep 17 00:00:00 2001 From: ailia_watanabe Date: Tue, 24 Feb 2026 14:18:55 +0900 Subject: [PATCH 13/15] Update .gitignore --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index b88e8bbc2..c7b984394 100644 --- a/.gitignore +++ b/.gitignore @@ -50,3 +50,5 @@ face_identification/validation/dataset/ image_segmentation/pspnet-hair-segmentation/images object_tracking/deepsort/images/ style_transfer/adain/images/ + +audio_processing\sherpa-onnx\development_memo.md \ No newline at end of file From 492dee4dc29a6268fabd7d9f24f7caeae8b6460f Mon Sep 17 00:00:00 2001 From: ailia_watanabe Date: Tue, 24 Feb 2026 15:25:39 +0900 Subject: [PATCH 14/15] Remove online-decode-files.py --- .../sherpa-onnx/online-decode-files.py | 449 ------------------ 1 file changed, 449 deletions(-) delete mode 100644 audio_processing/sherpa-onnx/online-decode-files.py diff --git a/audio_processing/sherpa-onnx/online-decode-files.py b/audio_processing/sherpa-onnx/online-decode-files.py deleted file mode 100644 index 586741ffd..000000000 --- a/audio_processing/sherpa-onnx/online-decode-files.py +++ /dev/null @@ -1,449 +0,0 @@ -#!/usr/bin/env python3 - -""" -This file demonstrates how to use sherpa-onnx Python API to transcribe -file(s) with a streaming model. - -Usage: - -(1) Streaming transducer - -curl -SL -O https://github.com/k2-fsa/sherpa-onnx/releases/download/asr-models/sherpa-onnx-streaming-zipformer-en-2023-06-26.tar.bz2 -tar xvf sherpa-onnx-streaming-zipformer-en-2023-06-26.tar.bz2 -rm sherpa-onnx-streaming-zipformer-en-2023-06-26.tar.bz2 - -./python-api-examples/online-decode-files.py \ - --tokens=./sherpa-onnx-streaming-zipformer-en-2023-06-26/tokens.txt \ - --encoder=./sherpa-onnx-streaming-zipformer-en-2023-06-26/encoder-epoch-99-avg-1-chunk-16-left-64.onnx \ - --decoder=./sherpa-onnx-streaming-zipformer-en-2023-06-26/decoder-epoch-99-avg-1-chunk-16-left-64.onnx \ - --joiner=./sherpa-onnx-streaming-zipformer-en-2023-06-26/joiner-epoch-99-avg-1-chunk-16-left-64.onnx \ - ./sherpa-onnx-streaming-zipformer-en-2023-06-26/test_wavs/0.wav \ - ./sherpa-onnx-streaming-zipformer-en-2023-06-26/test_wavs/1.wav \ - ./sherpa-onnx-streaming-zipformer-en-2023-06-26/test_wavs/8k.wav - -or with RNN LM rescoring and LODR: - -./python-api-examples/online-decode-files.py \ - --tokens=./sherpa-onnx-streaming-zipformer-en-2023-06-26/tokens.txt \ - --encoder=./sherpa-onnx-streaming-zipformer-en-2023-06-26/encoder-epoch-99-avg-1-chunk-16-left-64.onnx \ - --decoder=./sherpa-onnx-streaming-zipformer-en-2023-06-26/decoder-epoch-99-avg-1-chunk-16-left-64.onnx \ - --joiner=./sherpa-onnx-streaming-zipformer-en-2023-06-26/joiner-epoch-99-avg-1-chunk-16-left-64.onnx \ - --decoding-method=modified_beam_search \ - --lm=/path/to/lm.onnx \ - --lm-scale=0.1 \ - --lodr-fst=/path/to/lodr.fst \ - --lodr-scale=-0.1 \ - ./sherpa-onnx-streaming-zipformer-en-2023-06-26/test_wavs/0.wav \ - ./sherpa-onnx-streaming-zipformer-en-2023-06-26/test_wavs/1.wav \ - ./sherpa-onnx-streaming-zipformer-en-2023-06-26/test_wavs/8k.wav - -(2) Streaming paraformer - -curl -SL -O https://github.com/k2-fsa/sherpa-onnx/releases/download/asr-models/sherpa-onnx-streaming-paraformer-bilingual-zh-en.tar.bz2 -tar xvf sherpa-onnx-streaming-paraformer-bilingual-zh-en.tar.bz2 -rm sherpa-onnx-streaming-paraformer-bilingual-zh-en.tar.bz2 - -./python-api-examples/online-decode-files.py \ - --tokens=./sherpa-onnx-streaming-paraformer-bilingual-zh-en/tokens.txt \ - --paraformer-encoder=./sherpa-onnx-streaming-paraformer-bilingual-zh-en/encoder.int8.onnx \ - --paraformer-decoder=./sherpa-onnx-streaming-paraformer-bilingual-zh-en/decoder.int8.onnx \ - ./sherpa-onnx-streaming-paraformer-bilingual-zh-en/test_wavs/0.wav \ - ./sherpa-onnx-streaming-paraformer-bilingual-zh-en/test_wavs/1.wav \ - ./sherpa-onnx-streaming-paraformer-bilingual-zh-en/test_wavs/2.wav \ - ./sherpa-onnx-streaming-paraformer-bilingual-zh-en/test_wavs/3.wav \ - ./sherpa-onnx-streaming-paraformer-bilingual-zh-en/test_wavs/8k.wav - -(3) Streaming Zipformer2 CTC - -wget https://github.com/k2-fsa/sherpa-onnx/releases/download/asr-models/sherpa-onnx-streaming-zipformer-ctc-multi-zh-hans-2023-12-13.tar.bz2 -tar xvf sherpa-onnx-streaming-zipformer-ctc-multi-zh-hans-2023-12-13.tar.bz2 -rm sherpa-onnx-streaming-zipformer-ctc-multi-zh-hans-2023-12-13.tar.bz2 -ls -lh sherpa-onnx-streaming-zipformer-ctc-multi-zh-hans-2023-12-13 - -./python-api-examples/online-decode-files.py \ - --zipformer2-ctc=./sherpa-onnx-streaming-zipformer-ctc-multi-zh-hans-2023-12-13/ctc-epoch-20-avg-1-chunk-16-left-128.onnx \ - --tokens=./sherpa-onnx-streaming-zipformer-ctc-multi-zh-hans-2023-12-13/tokens.txt \ - ./sherpa-onnx-streaming-zipformer-ctc-multi-zh-hans-2023-12-13/test_wavs/DEV_T0000000000.wav \ - ./sherpa-onnx-streaming-zipformer-ctc-multi-zh-hans-2023-12-13/test_wavs/DEV_T0000000001.wav - -(4) Streaming Conformer CTC from WeNet - -curl -SL -O https://github.com/k2-fsa/sherpa-onnx/releases/download/asr-models/sherpa-onnx-zh-wenet-wenetspeech.tar.bz2 -tar xvf sherpa-onnx-zh-wenet-wenetspeech.tar.bz2 -rm sherpa-onnx-zh-wenet-wenetspeech.tar.bz2 - -./python-api-examples/online-decode-files.py \ - --tokens=./sherpa-onnx-zh-wenet-wenetspeech/tokens.txt \ - --wenet-ctc=./sherpa-onnx-zh-wenet-wenetspeech/model-streaming.onnx \ - ./sherpa-onnx-zh-wenet-wenetspeech/test_wavs/0.wav \ - ./sherpa-onnx-zh-wenet-wenetspeech/test_wavs/1.wav \ - ./sherpa-onnx-zh-wenet-wenetspeech/test_wavs/8k.wav - - -Please refer to -https://k2-fsa.github.io/sherpa/onnx/pretrained_models/index.html -to download streaming pre-trained models. -""" -import argparse -import time -import wave -from pathlib import Path -from typing import List, Tuple - -import numpy as np -import sherpa_onnx - - -def get_args(): - parser = argparse.ArgumentParser( - formatter_class=argparse.ArgumentDefaultsHelpFormatter - ) - - parser.add_argument( - "--tokens", - type=str, - help="Path to tokens.txt", - ) - - parser.add_argument( - "--encoder", - type=str, - help="Path to the transducer encoder model", - ) - - parser.add_argument( - "--decoder", - type=str, - help="Path to the transducer decoder model", - ) - - parser.add_argument( - "--joiner", - type=str, - help="Path to the transducer joiner model", - ) - - parser.add_argument( - "--zipformer2-ctc", - type=str, - help="Path to the zipformer2 ctc model", - ) - - parser.add_argument( - "--paraformer-encoder", - type=str, - help="Path to the paraformer encoder model", - ) - - parser.add_argument( - "--paraformer-decoder", - type=str, - help="Path to the paraformer decoder model", - ) - - parser.add_argument( - "--wenet-ctc", - type=str, - help="Path to the wenet ctc model", - ) - - parser.add_argument( - "--wenet-ctc-chunk-size", - type=int, - default=16, - help="The --chunk-size parameter for streaming WeNet models", - ) - - parser.add_argument( - "--wenet-ctc-num-left-chunks", - type=int, - default=4, - help="The --num-left-chunks parameter for streaming WeNet models", - ) - - parser.add_argument( - "--num-threads", - type=int, - default=1, - help="Number of threads for neural network computation", - ) - - parser.add_argument( - "--decoding-method", - type=str, - default="greedy_search", - help="Valid values are greedy_search and modified_beam_search", - ) - - parser.add_argument( - "--max-active-paths", - type=int, - default=4, - help="""Used only when --decoding-method is modified_beam_search. - It specifies number of active paths to keep during decoding. - """, - ) - - parser.add_argument( - "--lm", - type=str, - default="", - help="""Used only when --decoding-method is modified_beam_search. - path of language model. - """, - ) - - parser.add_argument( - "--lm-scale", - type=float, - default=0.1, - help="""Used only when --decoding-method is modified_beam_search. - scale of language model. - """, - ) - - parser.add_argument( - "--lodr-fst", - metavar="file", - type=str, - default="", - help="Path to LODR FST model. Used only when --lm is given.", - ) - - parser.add_argument( - "--lodr-scale", - metavar="lodr_scale", - type=float, - default=-0.1, - help="LODR scale for rescoring.Used only when --lodr_fst is given.", - ) - - parser.add_argument( - "--provider", - type=str, - default="cpu", - help="Valid values: cpu, cuda, coreml", - ) - - parser.add_argument( - "--hotwords-file", - type=str, - default="", - help=""" - The file containing hotwords, one words/phrases per line, like - HELLO WORLD - 你好世界 - """, - ) - - parser.add_argument( - "--hotwords-score", - type=float, - default=1.5, - help=""" - The hotword score of each token for biasing word/phrase. Used only if - --hotwords-file is given. - """, - ) - - parser.add_argument( - "--modeling-unit", - type=str, - default="", - help=""" - The modeling unit of the model, valid values are cjkchar, bpe, cjkchar+bpe. - Used only when hotwords-file is given. - """, - ) - - parser.add_argument( - "--bpe-vocab", - type=str, - default="", - help=""" - The path to the bpe vocabulary, the bpe vocabulary is generated by - sentencepiece, you can also export the bpe vocabulary through a bpe model - by `scripts/export_bpe_vocab.py`. Used only when hotwords-file is given - and modeling-unit is bpe or cjkchar+bpe. - """, - ) - - parser.add_argument( - "--blank-penalty", - type=float, - default=0.0, - help=""" - The penalty applied on blank symbol during decoding. - Note: It is a positive value that would be applied to logits like - this `logits[:, 0] -= blank_penalty` (suppose logits.shape is - [batch_size, vocab] and blank id is 0). - """, - ) - - parser.add_argument( - "sound_files", - type=str, - nargs="+", - help="The input sound file(s) to decode. Each file must be of WAVE" - "format with a single channel, and each sample has 16-bit, " - "i.e., int16_t. " - "The sample rate of the file can be arbitrary and does not need to " - "be 16 kHz", - ) - - return parser.parse_args() - - -def assert_file_exists(filename: str): - assert Path(filename).is_file(), ( - f"{filename} does not exist!\n" - "Please refer to " - "https://k2-fsa.github.io/sherpa/onnx/pretrained_models/index.html to download it" - ) - - -def read_wave(wave_filename: str) -> Tuple[np.ndarray, int]: - """ - Args: - wave_filename: - Path to a wave file. It should be single channel and each sample should - be 16-bit. Its sample rate does not need to be 16kHz. - Returns: - Return a tuple containing: - - A 1-D array of dtype np.float32 containing the samples, which are - normalized to the range [-1, 1]. - - sample rate of the wave file - """ - - with wave.open(wave_filename) as f: - assert f.getnchannels() == 1, f.getnchannels() - assert f.getsampwidth() == 2, f.getsampwidth() # it is in bytes - num_samples = f.getnframes() - samples = f.readframes(num_samples) - samples_int16 = np.frombuffer(samples, dtype=np.int16) - samples_float32 = samples_int16.astype(np.float32) - - samples_float32 = samples_float32 / 32768 - return samples_float32, f.getframerate() - - -def main(): - args = get_args() - assert_file_exists(args.tokens) - - if args.encoder: - assert_file_exists(args.encoder) - assert_file_exists(args.decoder) - assert_file_exists(args.joiner) - - assert not args.paraformer_encoder, args.paraformer_encoder - assert not args.paraformer_decoder, args.paraformer_decoder - - recognizer = sherpa_onnx.OnlineRecognizer.from_transducer( - tokens=args.tokens, - encoder=args.encoder, - decoder=args.decoder, - joiner=args.joiner, - num_threads=args.num_threads, - provider=args.provider, - sample_rate=16000, - feature_dim=80, - decoding_method=args.decoding_method, - max_active_paths=args.max_active_paths, - lm=args.lm, - lm_scale=args.lm_scale, - lodr_fst=args.lodr_fst, - lodr_scale=args.lodr_scale, - hotwords_file=args.hotwords_file, - hotwords_score=args.hotwords_score, - modeling_unit=args.modeling_unit, - bpe_vocab=args.bpe_vocab, - blank_penalty=args.blank_penalty, - ) - elif args.zipformer2_ctc: - recognizer = sherpa_onnx.OnlineRecognizer.from_zipformer2_ctc( - tokens=args.tokens, - model=args.zipformer2_ctc, - num_threads=args.num_threads, - provider=args.provider, - sample_rate=16000, - feature_dim=80, - decoding_method="greedy_search", - ) - elif args.paraformer_encoder: - recognizer = sherpa_onnx.OnlineRecognizer.from_paraformer( - tokens=args.tokens, - encoder=args.paraformer_encoder, - decoder=args.paraformer_decoder, - num_threads=args.num_threads, - provider=args.provider, - sample_rate=16000, - feature_dim=80, - decoding_method="greedy_search", - ) - elif args.wenet_ctc: - recognizer = sherpa_onnx.OnlineRecognizer.from_wenet_ctc( - tokens=args.tokens, - model=args.wenet_ctc, - chunk_size=args.wenet_ctc_chunk_size, - num_left_chunks=args.wenet_ctc_num_left_chunks, - num_threads=args.num_threads, - provider=args.provider, - sample_rate=16000, - feature_dim=80, - decoding_method="greedy_search", - ) - else: - raise ValueError("Please provide a model") - - print("Started!") - start_time = time.time() - - streams = [] - total_duration = 0 - for wave_filename in args.sound_files: - assert_file_exists(wave_filename) - samples, sample_rate = read_wave(wave_filename) - duration = len(samples) / sample_rate - total_duration += duration - - s = recognizer.create_stream() - - s.accept_waveform(sample_rate, samples) - - tail_paddings = np.zeros(int(0.66 * sample_rate), dtype=np.float32) - s.accept_waveform(sample_rate, tail_paddings) - - s.input_finished() - - streams.append(s) - - while True: - ready_list = [] - for s in streams: - if recognizer.is_ready(s): - ready_list.append(s) - if len(ready_list) == 0: - break - recognizer.decode_streams(ready_list) - results = [recognizer.get_result(s) for s in streams] - end_time = time.time() - print("Done!") - - for wave_filename, result in zip(args.sound_files, results): - print(f"{wave_filename}\n{result}") - print("-" * 10) - - elapsed_seconds = end_time - start_time - rtf = elapsed_seconds / total_duration - print(f"num_threads: {args.num_threads}") - print(f"decoding_method: {args.decoding_method}") - print(f"Wave duration: {total_duration:.3f} s") - print(f"Elapsed time: {elapsed_seconds:.3f} s") - print( - f"Real time factor (RTF): {elapsed_seconds:.3f}/{total_duration:.3f} = {rtf:.3f}" - ) - - -if __name__ == "__main__": - main() From 87f590c20fb26abc6e665571c9e599d148415a0e Mon Sep 17 00:00:00 2001 From: ailia_watanabe Date: Tue, 24 Feb 2026 15:30:47 +0900 Subject: [PATCH 15/15] Remove unused ailia_audio_utils.py and csrc/ --- .../sherpa-onnx/ailia_audio_utils.py | 68 --- .../csrc/offline-ctc-greedy-search-decoder.cc | 54 -- .../csrc/offline-ctc-greedy-search-decoder.h | 28 - ...ffline-transducer-greedy-search-decoder.cc | 87 --- ...offline-transducer-greedy-search-decoder.h | 34 -- .../sherpa-onnx/csrc/online-model-config.cc | 186 ------- .../sherpa-onnx/csrc/online-model-config.h | 90 --- .../csrc/online-recognizer-impl.cc | 294 ---------- .../sherpa-onnx/csrc/online-recognizer-impl.h | 74 --- .../sherpa-onnx/csrc/online-recognizer.cc | 271 --------- .../sherpa-onnx/csrc/online-recognizer.h | 229 -------- .../sherpa-onnx/csrc/online-stream.cc | 285 ---------- .../sherpa-onnx/csrc/online-stream.h | 121 ---- .../csrc/online-transducer-model-config.cc | 51 -- .../csrc/online-transducer-model-config.h | 32 -- .../csrc/online-transducer-model.cc | 230 -------- .../csrc/online-transducer-model.h | 147 ----- .../csrc/online-zipformer-transducer-model.cc | 518 ------------------ .../csrc/online-zipformer-transducer-model.h | 99 ---- .../online-zipformer2-ctc-model-config.cc | 42 -- .../csrc/online-zipformer2-ctc-model-config.h | 29 - .../csrc/online-zipformer2-ctc-model.cc | 494 ----------------- .../csrc/online-zipformer2-ctc-model.h | 76 --- 23 files changed, 3539 deletions(-) delete mode 100644 audio_processing/sherpa-onnx/ailia_audio_utils.py delete mode 100644 audio_processing/sherpa-onnx/csrc/offline-ctc-greedy-search-decoder.cc delete mode 100644 audio_processing/sherpa-onnx/csrc/offline-ctc-greedy-search-decoder.h delete mode 100644 audio_processing/sherpa-onnx/csrc/offline-transducer-greedy-search-decoder.cc delete mode 100644 audio_processing/sherpa-onnx/csrc/offline-transducer-greedy-search-decoder.h delete mode 100644 audio_processing/sherpa-onnx/csrc/online-model-config.cc delete mode 100644 audio_processing/sherpa-onnx/csrc/online-model-config.h delete mode 100644 audio_processing/sherpa-onnx/csrc/online-recognizer-impl.cc delete mode 100644 audio_processing/sherpa-onnx/csrc/online-recognizer-impl.h delete mode 100644 audio_processing/sherpa-onnx/csrc/online-recognizer.cc delete mode 100644 audio_processing/sherpa-onnx/csrc/online-recognizer.h delete mode 100644 audio_processing/sherpa-onnx/csrc/online-stream.cc delete mode 100644 audio_processing/sherpa-onnx/csrc/online-stream.h delete mode 100644 audio_processing/sherpa-onnx/csrc/online-transducer-model-config.cc delete mode 100644 audio_processing/sherpa-onnx/csrc/online-transducer-model-config.h delete mode 100644 audio_processing/sherpa-onnx/csrc/online-transducer-model.cc delete mode 100644 audio_processing/sherpa-onnx/csrc/online-transducer-model.h delete mode 100644 audio_processing/sherpa-onnx/csrc/online-zipformer-transducer-model.cc delete mode 100644 audio_processing/sherpa-onnx/csrc/online-zipformer-transducer-model.h delete mode 100644 audio_processing/sherpa-onnx/csrc/online-zipformer2-ctc-model-config.cc delete mode 100644 audio_processing/sherpa-onnx/csrc/online-zipformer2-ctc-model-config.h delete mode 100644 audio_processing/sherpa-onnx/csrc/online-zipformer2-ctc-model.cc delete mode 100644 audio_processing/sherpa-onnx/csrc/online-zipformer2-ctc-model.h diff --git a/audio_processing/sherpa-onnx/ailia_audio_utils.py b/audio_processing/sherpa-onnx/ailia_audio_utils.py deleted file mode 100644 index 06d973ed5..000000000 --- a/audio_processing/sherpa-onnx/ailia_audio_utils.py +++ /dev/null @@ -1,68 +0,0 @@ -import numpy as np -import ailia.audio -import soundfile as sf - -# hard-coded audio hyperparameters -SAMPLE_RATE = 16000 -N_FFT = 400 -HOP_LENGTH = 160 -CHUNK_LENGTH = 30 -N_SAMPLES = CHUNK_LENGTH * SAMPLE_RATE # 480000: number of samples in a chunk -N_FRAMES = (N_SAMPLES // HOP_LENGTH) # 3000: number of frames in a mel spectrogram input - - -def load_audio(file: str, sr: int = SAMPLE_RATE): - # prepare input data - wav, source_sr = sf.read(file) - # convert to mono - if len(wav.shape) >= 2 and wav.shape[1] == 2: - wav = np.mean(wav, axis=1) - # Resample the wav if needed - if source_sr is not None and source_sr != sr: - wav = ailia.audio.resample(wav, org_sr=source_sr, target_sr=sr) - return wav - - -def pad_or_trim(array, length=N_SAMPLES, axis=-1): - """ - Pad or trim the audio array to N_SAMPLES, as expected by the encoder. - """ - if array.shape[axis] > length: - array = array.take(indices=range(length), axis=axis) - - if array.shape[axis] < length: - pad_widths = [(0, 0)] * array.ndim - pad_widths[axis] = (0, length - array.shape[axis]) - array = np.pad(array, pad_widths) - - return array - - -def log_mel_spectrogram(audio, n_mels: int = 80, padding: int = 0): - """ - Compute the log-Mel spectrogram of - - Parameters - ---------- - audio: np.ndarray - n_mels: int - The number of Mel-frequency filters, only 80 is supported - padding: int - Number of zero samples to pad to the right - - Returns - ------- - A Tensor that contains the Mel spectrogram, shape = (80, n_frames) - """ - if padding > 0: - audio = np.pad(audio, (0, padding)) - - mel_spec = ailia.audio.mel_spectrogram( - audio, sample_rate=SAMPLE_RATE, fft_n=N_FFT, hop_n=HOP_LENGTH, - win_type="hann", center_mode=1, power=2.0, mel_n=n_mels) - - log_spec = np.log10(np.clip(mel_spec, 1e-10, None)) - log_spec = np.maximum(log_spec, np.max(log_spec) - 8.0) - log_spec = (log_spec + 4.0) / 4.0 - - return log_spec diff --git a/audio_processing/sherpa-onnx/csrc/offline-ctc-greedy-search-decoder.cc b/audio_processing/sherpa-onnx/csrc/offline-ctc-greedy-search-decoder.cc deleted file mode 100644 index 59d16f5d3..000000000 --- a/audio_processing/sherpa-onnx/csrc/offline-ctc-greedy-search-decoder.cc +++ /dev/null @@ -1,54 +0,0 @@ -// sherpa-onnx/csrc/offline-ctc-greedy-search-decoder.h -// -// Copyright (c) 2023 Xiaomi Corporation - -#include "sherpa-onnx/csrc/offline-ctc-greedy-search-decoder.h" - -#include -#include -#include - -#include "sherpa-onnx/csrc/macros.h" - -namespace sherpa_onnx { - -std::vector OfflineCtcGreedySearchDecoder::Decode( - Ort::Value log_probs, Ort::Value log_probs_length) { - std::vector shape = log_probs.GetTensorTypeAndShapeInfo().GetShape(); - int32_t batch_size = static_cast(shape[0]); - int32_t num_frames = static_cast(shape[1]); - int32_t vocab_size = static_cast(shape[2]); - - const int64_t *p_log_probs_length = log_probs_length.GetTensorData(); - - std::vector ans; - ans.reserve(batch_size); - - for (int32_t b = 0; b != batch_size; ++b) { - const float *p_log_probs = - log_probs.GetTensorData() + b * num_frames * vocab_size; - - OfflineCtcDecoderResult r; - int64_t prev_id = -1; - - for (int32_t t = 0; t != static_cast(p_log_probs_length[b]); ++t) { - auto y = static_cast(std::distance( - static_cast(p_log_probs), - std::max_element( - static_cast(p_log_probs), - static_cast(p_log_probs) + vocab_size))); - p_log_probs += vocab_size; - - if (y != blank_id_ && y != prev_id) { - r.tokens.push_back(y); - r.timestamps.push_back(t); - } - prev_id = y; - } // for (int32_t t = 0; ...) - - ans.push_back(std::move(r)); - } - return ans; -} - -} // namespace sherpa_onnx diff --git a/audio_processing/sherpa-onnx/csrc/offline-ctc-greedy-search-decoder.h b/audio_processing/sherpa-onnx/csrc/offline-ctc-greedy-search-decoder.h deleted file mode 100644 index ccc2f728a..000000000 --- a/audio_processing/sherpa-onnx/csrc/offline-ctc-greedy-search-decoder.h +++ /dev/null @@ -1,28 +0,0 @@ -// sherpa-onnx/csrc/offline-ctc-greedy-search-decoder.h -// -// Copyright (c) 2023 Xiaomi Corporation - -#ifndef SHERPA_ONNX_CSRC_OFFLINE_CTC_GREEDY_SEARCH_DECODER_H_ -#define SHERPA_ONNX_CSRC_OFFLINE_CTC_GREEDY_SEARCH_DECODER_H_ - -#include - -#include "sherpa-onnx/csrc/offline-ctc-decoder.h" - -namespace sherpa_onnx { - -class OfflineCtcGreedySearchDecoder : public OfflineCtcDecoder { - public: - explicit OfflineCtcGreedySearchDecoder(int32_t blank_id) - : blank_id_(blank_id) {} - - std::vector Decode( - Ort::Value log_probs, Ort::Value log_probs_length) override; - - private: - int32_t blank_id_; -}; - -} // namespace sherpa_onnx - -#endif // SHERPA_ONNX_CSRC_OFFLINE_CTC_GREEDY_SEARCH_DECODER_H_ diff --git a/audio_processing/sherpa-onnx/csrc/offline-transducer-greedy-search-decoder.cc b/audio_processing/sherpa-onnx/csrc/offline-transducer-greedy-search-decoder.cc deleted file mode 100644 index 6fd3bf404..000000000 --- a/audio_processing/sherpa-onnx/csrc/offline-transducer-greedy-search-decoder.cc +++ /dev/null @@ -1,87 +0,0 @@ -// sherpa-onnx/csrc/offline-transducer-greedy-search-decoder.cc -// -// Copyright (c) 2023 Xiaomi Corporation - -#include "sherpa-onnx/csrc/offline-transducer-greedy-search-decoder.h" - -#include -#include -#include - -#include "sherpa-onnx/csrc/onnx-utils.h" -#include "sherpa-onnx/csrc/packed-sequence.h" -#include "sherpa-onnx/csrc/slice.h" - -namespace sherpa_onnx { - -std::vector -OfflineTransducerGreedySearchDecoder::Decode(Ort::Value encoder_out, - Ort::Value encoder_out_length, - OfflineStream **ss /*= nullptr*/, - int32_t n /*= 0*/) { - PackedSequence packed_encoder_out = PackPaddedSequence( - model_->Allocator(), &encoder_out, &encoder_out_length); - - int32_t batch_size = - static_cast(packed_encoder_out.sorted_indexes.size()); - - int32_t vocab_size = model_->VocabSize(); - int32_t context_size = model_->ContextSize(); - - std::vector ans(batch_size); - for (auto &r : ans) { - r.tokens.resize(context_size, -1); - // 0 is the ID of the blank token - r.tokens.back() = 0; - } - - auto decoder_input = model_->BuildDecoderInput(ans, ans.size()); - Ort::Value decoder_out = model_->RunDecoder(std::move(decoder_input)); - - int32_t start = 0; - int32_t t = 0; - for (auto n : packed_encoder_out.batch_sizes) { - Ort::Value cur_encoder_out = packed_encoder_out.Get(start, n); - Ort::Value cur_decoder_out = Slice(model_->Allocator(), &decoder_out, 0, n); - start += n; - Ort::Value logit = model_->RunJoiner(std::move(cur_encoder_out), - std::move(cur_decoder_out)); - float *p_logit = logit.GetTensorMutableData(); - bool emitted = false; - for (int32_t i = 0; i != n; ++i) { - if (blank_penalty_ > 0.0) { - p_logit[0] -= blank_penalty_; // assuming blank id is 0 - } - auto y = static_cast(std::distance( - static_cast(p_logit), - std::max_element(static_cast(p_logit), - static_cast(p_logit) + vocab_size))); - p_logit += vocab_size; - // blank id is hardcoded to 0 - // also, it treats unk as blank - if (y != 0 && y != unk_id_) { - ans[i].tokens.push_back(y); - ans[i].timestamps.push_back(t); - emitted = true; - } - } - if (emitted) { - Ort::Value decoder_input = model_->BuildDecoderInput(ans, n); - decoder_out = model_->RunDecoder(std::move(decoder_input)); - } - ++t; - } - - for (auto &r : ans) { - r.tokens = {r.tokens.begin() + context_size, r.tokens.end()}; - } - - std::vector unsorted_ans(batch_size); - for (int32_t i = 0; i != batch_size; ++i) { - unsorted_ans[packed_encoder_out.sorted_indexes[i]] = std::move(ans[i]); - } - - return unsorted_ans; -} - -} // namespace sherpa_onnx diff --git a/audio_processing/sherpa-onnx/csrc/offline-transducer-greedy-search-decoder.h b/audio_processing/sherpa-onnx/csrc/offline-transducer-greedy-search-decoder.h deleted file mode 100644 index 79109e60d..000000000 --- a/audio_processing/sherpa-onnx/csrc/offline-transducer-greedy-search-decoder.h +++ /dev/null @@ -1,34 +0,0 @@ -// sherpa-onnx/csrc/offline-transducer-greedy-search-decoder.h -// -// Copyright (c) 2023 Xiaomi Corporation - -#ifndef SHERPA_ONNX_CSRC_OFFLINE_TRANSDUCER_GREEDY_SEARCH_DECODER_H_ -#define SHERPA_ONNX_CSRC_OFFLINE_TRANSDUCER_GREEDY_SEARCH_DECODER_H_ - -#include - -#include "sherpa-onnx/csrc/offline-transducer-decoder.h" -#include "sherpa-onnx/csrc/offline-transducer-model.h" - -namespace sherpa_onnx { - -class OfflineTransducerGreedySearchDecoder : public OfflineTransducerDecoder { - public: - OfflineTransducerGreedySearchDecoder(OfflineTransducerModel *model, - int32_t unk_id, - float blank_penalty) - : model_(model), unk_id_(unk_id), blank_penalty_(blank_penalty) {} - - std::vector Decode( - Ort::Value encoder_out, Ort::Value encoder_out_length, - OfflineStream **ss = nullptr, int32_t n = 0) override; - - private: - OfflineTransducerModel *model_; // Not owned - int32_t unk_id_; - float blank_penalty_; -}; - -} // namespace sherpa_onnx - -#endif // SHERPA_ONNX_CSRC_OFFLINE_TRANSDUCER_GREEDY_SEARCH_DECODER_H_ diff --git a/audio_processing/sherpa-onnx/csrc/online-model-config.cc b/audio_processing/sherpa-onnx/csrc/online-model-config.cc deleted file mode 100644 index 8de8bfc07..000000000 --- a/audio_processing/sherpa-onnx/csrc/online-model-config.cc +++ /dev/null @@ -1,186 +0,0 @@ -// sherpa-onnx/csrc/online-model-config.cc -// -// Copyright (c) 2023 Xiaomi Corporation -#include "sherpa-onnx/csrc/online-model-config.h" - -#include - -#include "sherpa-onnx/csrc/file-utils.h" -#include "sherpa-onnx/csrc/macros.h" -#include "sherpa-onnx/csrc/text-utils.h" - -namespace sherpa_onnx { - -void OnlineModelConfig::Register(ParseOptions *po) { - transducer.Register(po); - paraformer.Register(po); - wenet_ctc.Register(po); - zipformer2_ctc.Register(po); - nemo_ctc.Register(po); - t_one_ctc.Register(po); - provider_config.Register(po); - - po->Register("tokens", &tokens, "Path to tokens.txt"); - - po->Register("num-threads", &num_threads, - "Number of threads to run the neural network"); - - po->Register("warm-up", &warm_up, - "Number of warm-up to run the onnxruntime" - "Valid vales are: zipformer2"); - - po->Register("debug", &debug, - "true to print model information while loading it."); - - po->Register("modeling-unit", &modeling_unit, - "The modeling unit of the model, commonly used units are bpe, " - "cjkchar, cjkchar+bpe, etc. Currently, it is needed only when " - "hotwords are provided, we need it to encode the hotwords into " - "token sequence."); - - po->Register("bpe-vocab", &bpe_vocab, - "The vocabulary generated by google's sentencepiece program. " - "It is a file has two columns, one is the token, the other is " - "the log probability, you can get it from the directory where " - "your bpe model is generated. Only used when hotwords provided " - "and the modeling unit is bpe or cjkchar+bpe"); - - po->Register("model-type", &model_type, - "Specify it to reduce model initialization time. " - "Valid values are: conformer, lstm, zipformer, zipformer2, " - "wenet_ctc, nemo_ctc. " - "All other values lead to loading the model twice."); -} - -bool OnlineModelConfig::Validate() const { - // For RK NPU, we reinterpret num_threads: - // - // For RK3588 only - // num_threads == 1 -> Select a core randomly - // num_threads == 0 -> Use NPU core 0 - // num_threads == -1 -> Use NPU core 1 - // num_threads == -2 -> Use NPU core 2 - // num_threads == -3 -> Use NPU core 0 and core 1 - // num_threads == -4 -> Use NPU core 0, core 1, and core 2 - if (provider_config.provider != "rknn") { - if (num_threads < 1) { - SHERPA_ONNX_LOGE("num_threads should be > 0. Given %d", num_threads); - return false; - } - if (!transducer.encoder.empty() && (EndsWith(transducer.encoder, ".rknn") || - EndsWith(transducer.decoder, ".rknn") || - EndsWith(transducer.joiner, ".rknn"))) { - SHERPA_ONNX_LOGE( - "--provider is %s, which is not rknn, but you pass rknn model " - "filenames. encoder: '%s', decoder: '%s', joiner: '%s'", - provider_config.provider.c_str(), transducer.encoder.c_str(), - transducer.decoder.c_str(), transducer.joiner.c_str()); - return false; - } - - if (!zipformer2_ctc.model.empty() && - EndsWith(zipformer2_ctc.model, ".rknn")) { - SHERPA_ONNX_LOGE( - "--provider is %s, which is not rknn, but you pass rknn model " - "filename for zipformer2_ctc: '%s'", - provider_config.provider.c_str(), zipformer2_ctc.model.c_str()); - return false; - } - } - - if (provider_config.provider == "rknn") { - if (!transducer.encoder.empty() && (EndsWith(transducer.encoder, ".onnx") || - EndsWith(transducer.decoder, ".onnx") || - EndsWith(transducer.joiner, ".onnx"))) { - SHERPA_ONNX_LOGE( - "--provider is rknn, but you pass onnx model " - "filenames. encoder: '%s', decoder: '%s', joiner: '%s'", - transducer.encoder.c_str(), transducer.decoder.c_str(), - transducer.joiner.c_str()); - return false; - } - - if (!zipformer2_ctc.model.empty() && - EndsWith(zipformer2_ctc.model, ".onnx")) { - SHERPA_ONNX_LOGE( - "--provider rknn, but you pass onnx model filename for " - "zipformer2_ctc: '%s'", - zipformer2_ctc.model.c_str()); - return false; - } - } - - if (!tokens_buf.empty() && FileExists(tokens)) { - SHERPA_ONNX_LOGE( - "you can not provide a tokens_buf and a tokens file: '%s', " - "at the same time, which is confusing", - tokens.c_str()); - return false; - } - - if (tokens_buf.empty() && !FileExists(tokens)) { - SHERPA_ONNX_LOGE( - "tokens: '%s' does not exist, you should provide " - "either a tokens buffer or a tokens file", - tokens.c_str()); - return false; - } - - if (!modeling_unit.empty() && - (modeling_unit == "bpe" || modeling_unit == "cjkchar+bpe")) { - if (!FileExists(bpe_vocab)) { - SHERPA_ONNX_LOGE("bpe_vocab: '%s' does not exist", bpe_vocab.c_str()); - return false; - } - } - - if (!paraformer.encoder.empty()) { - return paraformer.Validate(); - } - - if (!wenet_ctc.model.empty()) { - return wenet_ctc.Validate(); - } - - if (!zipformer2_ctc.model.empty()) { - return zipformer2_ctc.Validate(); - } - - if (!nemo_ctc.model.empty()) { - return nemo_ctc.Validate(); - } - - if (!t_one_ctc.model.empty()) { - return t_one_ctc.Validate(); - } - - if (!provider_config.Validate()) { - return false; - } - - return transducer.Validate(); -} - -std::string OnlineModelConfig::ToString() const { - std::ostringstream os; - - os << "OnlineModelConfig("; - os << "transducer=" << transducer.ToString() << ", "; - os << "paraformer=" << paraformer.ToString() << ", "; - os << "wenet_ctc=" << wenet_ctc.ToString() << ", "; - os << "zipformer2_ctc=" << zipformer2_ctc.ToString() << ", "; - os << "nemo_ctc=" << nemo_ctc.ToString() << ", "; - os << "t_one_ctc=" << t_one_ctc.ToString() << ", "; - os << "provider_config=" << provider_config.ToString() << ", "; - os << "tokens=\"" << tokens << "\", "; - os << "num_threads=" << num_threads << ", "; - os << "warm_up=" << warm_up << ", "; - os << "debug=" << (debug ? "True" : "False") << ", "; - os << "model_type=\"" << model_type << "\", "; - os << "modeling_unit=\"" << modeling_unit << "\", "; - os << "bpe_vocab=\"" << bpe_vocab << "\")"; - - return os.str(); -} - -} // namespace sherpa_onnx diff --git a/audio_processing/sherpa-onnx/csrc/online-model-config.h b/audio_processing/sherpa-onnx/csrc/online-model-config.h deleted file mode 100644 index d82559a22..000000000 --- a/audio_processing/sherpa-onnx/csrc/online-model-config.h +++ /dev/null @@ -1,90 +0,0 @@ -// sherpa-onnx/csrc/online-model-config.h -// -// Copyright (c) 2023 Xiaomi Corporation -#ifndef SHERPA_ONNX_CSRC_ONLINE_MODEL_CONFIG_H_ -#define SHERPA_ONNX_CSRC_ONLINE_MODEL_CONFIG_H_ - -#include - -#include "sherpa-onnx/csrc/online-nemo-ctc-model-config.h" -#include "sherpa-onnx/csrc/online-paraformer-model-config.h" -#include "sherpa-onnx/csrc/online-t-one-ctc-model-config.h" -#include "sherpa-onnx/csrc/online-transducer-model-config.h" -#include "sherpa-onnx/csrc/online-wenet-ctc-model-config.h" -#include "sherpa-onnx/csrc/online-zipformer2-ctc-model-config.h" -#include "sherpa-onnx/csrc/provider-config.h" - -namespace sherpa_onnx { - -struct OnlineModelConfig { - OnlineTransducerModelConfig transducer; - OnlineParaformerModelConfig paraformer; - OnlineWenetCtcModelConfig wenet_ctc; - OnlineZipformer2CtcModelConfig zipformer2_ctc; - OnlineNeMoCtcModelConfig nemo_ctc; - OnlineToneCtcModelConfig t_one_ctc; - ProviderConfig provider_config; - std::string tokens; - int32_t num_threads = 1; - int32_t warm_up = 0; - bool debug = false; - - // Valid values: - // - conformer, conformer transducer from icefall - // - lstm, lstm transducer from icefall - // - zipformer, zipformer transducer from icefall - // - zipformer2, zipformer2 transducer or CTC from icefall - // - wenet_ctc, wenet CTC model - // - nemo_ctc, NeMo CTC model - // - // All other values are invalid and lead to loading the model twice. - std::string model_type; - - // Valid values: - // - cjkchar - // - bpe - // - cjkchar+bpe - std::string modeling_unit = "cjkchar"; - std::string bpe_vocab; - - /// if tokens_buf is non-empty, - /// the tokens will be loaded from the buffer instead of from the - /// "tokens" file - std::string tokens_buf; - - OnlineModelConfig() = default; - OnlineModelConfig(const OnlineTransducerModelConfig &transducer, - const OnlineParaformerModelConfig ¶former, - const OnlineWenetCtcModelConfig &wenet_ctc, - const OnlineZipformer2CtcModelConfig &zipformer2_ctc, - const OnlineNeMoCtcModelConfig &nemo_ctc, - const OnlineToneCtcModelConfig &t_one_ctc, - const ProviderConfig &provider_config, - const std::string &tokens, int32_t num_threads, - int32_t warm_up, bool debug, const std::string &model_type, - const std::string &modeling_unit, - const std::string &bpe_vocab) - : transducer(transducer), - paraformer(paraformer), - wenet_ctc(wenet_ctc), - zipformer2_ctc(zipformer2_ctc), - nemo_ctc(nemo_ctc), - t_one_ctc(t_one_ctc), - provider_config(provider_config), - tokens(tokens), - num_threads(num_threads), - warm_up(warm_up), - debug(debug), - model_type(model_type), - modeling_unit(modeling_unit), - bpe_vocab(bpe_vocab) {} - - void Register(ParseOptions *po); - bool Validate() const; - - std::string ToString() const; -}; - -} // namespace sherpa_onnx - -#endif // SHERPA_ONNX_CSRC_ONLINE_MODEL_CONFIG_H_ diff --git a/audio_processing/sherpa-onnx/csrc/online-recognizer-impl.cc b/audio_processing/sherpa-onnx/csrc/online-recognizer-impl.cc deleted file mode 100644 index 7b96c5b8f..000000000 --- a/audio_processing/sherpa-onnx/csrc/online-recognizer-impl.cc +++ /dev/null @@ -1,294 +0,0 @@ -// sherpa-onnx/csrc/online-recognizer-impl.cc -// -// Copyright (c) 2023-2025 Xiaomi Corporation - -#include "sherpa-onnx/csrc/online-recognizer-impl.h" - -#include -#include - -#if __ANDROID_API__ >= 9 -#include "android/asset_manager.h" -#include "android/asset_manager_jni.h" -#endif - -#if __OHOS__ -#include "rawfile/raw_file_manager.h" -#endif - -#include "fst/extensions/far/far.h" -#include "kaldifst/csrc/kaldi-fst-io.h" -#include "sherpa-onnx/csrc/macros.h" -#include "sherpa-onnx/csrc/online-recognizer-ctc-impl.h" -#include "sherpa-onnx/csrc/online-recognizer-paraformer-impl.h" -#include "sherpa-onnx/csrc/online-recognizer-transducer-impl.h" -#include "sherpa-onnx/csrc/online-recognizer-transducer-nemo-impl.h" -#include "sherpa-onnx/csrc/onnx-utils.h" -#include "sherpa-onnx/csrc/text-utils.h" - -#if SHERPA_ONNX_ENABLE_RKNN -#include "sherpa-onnx/csrc/rknn/online-recognizer-ctc-rknn-impl.h" -#include "sherpa-onnx/csrc/rknn/online-recognizer-transducer-rknn-impl.h" -#endif - -namespace sherpa_onnx { - -std::unique_ptr OnlineRecognizerImpl::Create( - const OnlineRecognizerConfig &config) { - if (config.model_config.provider_config.provider == "rknn") { -#if SHERPA_ONNX_ENABLE_RKNN - if (config.model_config.transducer.encoder.empty() && - config.model_config.zipformer2_ctc.model.empty()) { - SHERPA_ONNX_LOGE( - "Only Zipformer transducers and CTC models are currently supported " - "by rknn. Fallback to CPU. Make sure you pass an onnx model"); - } else if (!config.model_config.transducer.encoder.empty()) { - return std::make_unique(config); - } else if (!config.model_config.zipformer2_ctc.model.empty()) { - return std::make_unique(config); - } -#else - SHERPA_ONNX_LOGE( - "Please rebuild sherpa-onnx with -DSHERPA_ONNX_ENABLE_RKNN=ON if you " - "want to use rknn."); - SHERPA_ONNX_EXIT(-1); - return nullptr; -#endif - } - - if (!config.model_config.transducer.encoder.empty()) { - Ort::Env env(ORT_LOGGING_LEVEL_ERROR); - - Ort::SessionOptions sess_opts; - sess_opts.SetIntraOpNumThreads(1); - sess_opts.SetInterOpNumThreads(1); - - auto decoder_model = ReadFile(config.model_config.transducer.decoder); - auto sess = std::make_unique(env, decoder_model.data(), - decoder_model.size(), sess_opts); - - size_t node_count = sess->GetOutputCount(); - - if (node_count == 1) { - return std::make_unique(config); - } else { - return std::make_unique(config); - } - } - - if (!config.model_config.paraformer.encoder.empty()) { - return std::make_unique(config); - } - - if (!config.model_config.wenet_ctc.model.empty() || - !config.model_config.zipformer2_ctc.model.empty() || - !config.model_config.nemo_ctc.model.empty() || - !config.model_config.t_one_ctc.model.empty()) { - return std::make_unique(config); - } - - SHERPA_ONNX_LOGE("Please specify a model"); - SHERPA_ONNX_EXIT(-1); -} - -template -std::unique_ptr OnlineRecognizerImpl::Create( - Manager *mgr, const OnlineRecognizerConfig &config) { - if (config.model_config.provider_config.provider == "rknn") { -#if SHERPA_ONNX_ENABLE_RKNN - // Currently, only zipformer v1 is suported for rknn - if (config.model_config.transducer.encoder.empty() && - config.model_config.zipformer2_ctc.model.empty()) { - SHERPA_ONNX_LOGE( - "Only Zipformer transducers and CTC models are currently supported " - "by rknn. Fallback to CPU"); - } else if (!config.model_config.transducer.encoder.empty()) { - return std::make_unique(mgr, config); - } else if (!config.model_config.zipformer2_ctc.model.empty()) { - return std::make_unique(mgr, config); - } -#else - SHERPA_ONNX_LOGE( - "Please rebuild sherpa-onnx with -DSHERPA_ONNX_ENABLE_RKNN=ON if you " - "want to use rknn."); - SHERPA_ONNX_EXIT(-1); - return nullptr; -#endif - } - - if (!config.model_config.transducer.encoder.empty()) { - Ort::Env env(ORT_LOGGING_LEVEL_ERROR); - - Ort::SessionOptions sess_opts; - sess_opts.SetIntraOpNumThreads(1); - sess_opts.SetInterOpNumThreads(1); - - auto decoder_model = ReadFile(mgr, config.model_config.transducer.decoder); - auto sess = std::make_unique(env, decoder_model.data(), - decoder_model.size(), sess_opts); - - size_t node_count = sess->GetOutputCount(); - - if (node_count == 1) { - return std::make_unique(mgr, config); - } else { - return std::make_unique(mgr, config); - } - } - - if (!config.model_config.paraformer.encoder.empty()) { - return std::make_unique(mgr, config); - } - - if (!config.model_config.wenet_ctc.model.empty() || - !config.model_config.zipformer2_ctc.model.empty() || - !config.model_config.nemo_ctc.model.empty() || - !config.model_config.t_one_ctc.model.empty()) { - return std::make_unique(mgr, config); - } - - SHERPA_ONNX_LOGE("Please specify a model"); - SHERPA_ONNX_EXIT(-1); -} - -OnlineRecognizerImpl::OnlineRecognizerImpl(const OnlineRecognizerConfig &config) - : config_(config) { - if (!config.rule_fsts.empty()) { - std::vector files; - SplitStringToVector(config.rule_fsts, ",", false, &files); - itn_list_.reserve(files.size()); - for (const auto &f : files) { - if (config.model_config.debug) { - SHERPA_ONNX_LOGE("rule fst: %s", f.c_str()); - } - itn_list_.push_back(std::make_unique(f)); - } - } - - if (!config.rule_fars.empty()) { - if (config.model_config.debug) { - SHERPA_ONNX_LOGE("Loading FST archives"); - } - std::vector files; - SplitStringToVector(config.rule_fars, ",", false, &files); - - itn_list_.reserve(files.size() + itn_list_.size()); - - for (const auto &f : files) { - if (config.model_config.debug) { - SHERPA_ONNX_LOGE("rule far: %s", f.c_str()); - } - std::unique_ptr> reader( - fst::FarReader::Open(f)); - for (; !reader->Done(); reader->Next()) { - std::unique_ptr r( - fst::CastOrConvertToConstFst(reader->GetFst()->Copy())); - - itn_list_.push_back( - std::make_unique(std::move(r))); - } - } - - if (config.model_config.debug) { - SHERPA_ONNX_LOGE("FST archives loaded!"); - } - } - - if (!config.hr.lexicon.empty() && !config.hr.rule_fsts.empty()) { - auto hr_config = config.hr; - hr_config.debug = config.model_config.debug; - hr_ = std::make_unique(hr_config); - } -} - -template -OnlineRecognizerImpl::OnlineRecognizerImpl(Manager *mgr, - const OnlineRecognizerConfig &config) - : config_(config) { - if (!config.rule_fsts.empty()) { - std::vector files; - SplitStringToVector(config.rule_fsts, ",", false, &files); - itn_list_.reserve(files.size()); - for (const auto &f : files) { - if (config.model_config.debug) { - SHERPA_ONNX_LOGE("rule fst: %s", f.c_str()); - } - auto buf = ReadFile(mgr, f); - std::istrstream is(buf.data(), buf.size()); - itn_list_.push_back(std::make_unique(is)); - } - } - - if (!config.rule_fars.empty()) { - std::vector files; - SplitStringToVector(config.rule_fars, ",", false, &files); - itn_list_.reserve(files.size() + itn_list_.size()); - - for (const auto &f : files) { - if (config.model_config.debug) { - SHERPA_ONNX_LOGE("rule far: %s", f.c_str()); - } - - auto buf = ReadFile(mgr, f); - - std::unique_ptr s( - new std::istrstream(buf.data(), buf.size())); - - std::unique_ptr> reader( - fst::FarReader::Open(std::move(s))); - - for (; !reader->Done(); reader->Next()) { - std::unique_ptr r( - fst::CastOrConvertToConstFst(reader->GetFst()->Copy())); - - itn_list_.push_back( - std::make_unique(std::move(r))); - } // for (; !reader->Done(); reader->Next()) - } // for (const auto &f : files) - } // if (!config.rule_fars.empty()) - if (!config.hr.lexicon.empty() && !config.hr.rule_fsts.empty()) { - auto hr_config = config.hr; - hr_config.debug = config.model_config.debug; - hr_ = std::make_unique(mgr, hr_config); - } -} - -std::string OnlineRecognizerImpl::ApplyInverseTextNormalization( - std::string text) const { - text = RemoveInvalidUtf8Sequences(text); - - if (!itn_list_.empty()) { - for (const auto &tn : itn_list_) { - text = tn->Normalize(text); - } - } - - return text; -} - -std::string OnlineRecognizerImpl::ApplyHomophoneReplacer( - std::string text) const { - if (hr_) { - text = hr_->Apply(text); - } - - return text; -} - -#if __ANDROID_API__ >= 9 -template OnlineRecognizerImpl::OnlineRecognizerImpl( - AAssetManager *mgr, const OnlineRecognizerConfig &config); - -template std::unique_ptr OnlineRecognizerImpl::Create( - AAssetManager *mgr, const OnlineRecognizerConfig &config); -#endif - -#if __OHOS__ -template OnlineRecognizerImpl::OnlineRecognizerImpl( - NativeResourceManager *mgr, const OnlineRecognizerConfig &config); - -template std::unique_ptr OnlineRecognizerImpl::Create( - NativeResourceManager *mgr, const OnlineRecognizerConfig &config); -#endif - -} // namespace sherpa_onnx diff --git a/audio_processing/sherpa-onnx/csrc/online-recognizer-impl.h b/audio_processing/sherpa-onnx/csrc/online-recognizer-impl.h deleted file mode 100644 index d752bde60..000000000 --- a/audio_processing/sherpa-onnx/csrc/online-recognizer-impl.h +++ /dev/null @@ -1,74 +0,0 @@ -// sherpa-onnx/csrc/online-recognizer-impl.h -// -// Copyright (c) 2023 Xiaomi Corporation - -#ifndef SHERPA_ONNX_CSRC_ONLINE_RECOGNIZER_IMPL_H_ -#define SHERPA_ONNX_CSRC_ONLINE_RECOGNIZER_IMPL_H_ - -#include -#include -#include - -#include "kaldifst/csrc/text-normalizer.h" -#include "sherpa-onnx/csrc/homophone-replacer.h" -#include "sherpa-onnx/csrc/macros.h" -#include "sherpa-onnx/csrc/online-recognizer.h" -#include "sherpa-onnx/csrc/online-stream.h" - -namespace sherpa_onnx { - -class OnlineRecognizerImpl { - public: - explicit OnlineRecognizerImpl(const OnlineRecognizerConfig &config); - - static std::unique_ptr Create( - const OnlineRecognizerConfig &config); - - template - OnlineRecognizerImpl(Manager *mgr, const OnlineRecognizerConfig &config); - - template - static std::unique_ptr Create( - Manager *mgr, const OnlineRecognizerConfig &config); - - virtual ~OnlineRecognizerImpl() = default; - - virtual std::unique_ptr CreateStream() const = 0; - - virtual std::unique_ptr CreateStream( - const std::string &hotwords) const { - SHERPA_ONNX_LOGE("Only transducer models support contextual biasing."); - exit(-1); - } - - virtual bool IsReady(OnlineStream *s) const = 0; - - virtual void WarmpUpRecognizer(int32_t warmup, int32_t mbs) const { - // ToDo extending to other models - SHERPA_ONNX_LOGE("Only zipformer2 model supports Warm up for now."); - exit(-1); - } - - virtual void DecodeStreams(OnlineStream **ss, int32_t n) const = 0; - - virtual OnlineRecognizerResult GetResult(OnlineStream *s) const = 0; - - virtual bool IsEndpoint(OnlineStream *s) const = 0; - - virtual void Reset(OnlineStream *s) const = 0; - - std::string ApplyInverseTextNormalization(std::string text) const; - std::string ApplyHomophoneReplacer(std::string text) const; - - private: - OnlineRecognizerConfig config_; - // for inverse text normalization. Used only if - // config.rule_fsts is not empty or - // config.rule_fars is not empty - std::vector> itn_list_; - std::unique_ptr hr_; -}; - -} // namespace sherpa_onnx - -#endif // SHERPA_ONNX_CSRC_ONLINE_RECOGNIZER_IMPL_H_ diff --git a/audio_processing/sherpa-onnx/csrc/online-recognizer.cc b/audio_processing/sherpa-onnx/csrc/online-recognizer.cc deleted file mode 100644 index 338a92f32..000000000 --- a/audio_processing/sherpa-onnx/csrc/online-recognizer.cc +++ /dev/null @@ -1,271 +0,0 @@ -// sherpa-onnx/csrc/online-recognizer.cc -// -// Copyright (c) 2023 Xiaomi Corporation -// Copyright (c) 2023 Pingfeng Luo - -#include "sherpa-onnx/csrc/online-recognizer.h" - -#include -#include -#include -#include -#include -#include -#include - -#if __ANDROID_API__ >= 9 -#include "android/asset_manager.h" -#include "android/asset_manager_jni.h" -#endif - -#if __OHOS__ -#include "rawfile/raw_file_manager.h" -#endif - -#include "sherpa-onnx/csrc/file-utils.h" -#include "sherpa-onnx/csrc/online-recognizer-impl.h" -#include "sherpa-onnx/csrc/text-utils.h" - -namespace sherpa_onnx { - -namespace { - -/// Helper for `OnlineRecognizerResult::AsJsonString()` -template -std::string VecToString(const std::vector &vec, int32_t precision = 6) { - std::ostringstream oss; - if (precision != 0) { - oss << std::fixed << std::setprecision(precision); - } - oss << "["; - std::string sep = ""; - for (const auto &item : vec) { - oss << sep << item; - sep = ", "; - } - oss << "]"; - return oss.str(); -} - -/// Helper for `OnlineRecognizerResult::AsJsonString()` -template <> // explicit specialization for T = std::string -std::string VecToString(const std::vector &vec, - int32_t) { // ignore 2nd arg - std::ostringstream oss; - oss << "["; - std::string sep = ""; - for (const auto &item : vec) { - oss << sep << std::quoted(item); - sep = ", "; - } - oss << "]"; - return oss.str(); -} - -} // namespace - -std::string OnlineRecognizerResult::AsJsonString() const { - std::ostringstream os; - os << "{ "; - os << "\"text\": " << std::quoted(text) << ", "; - os << "\"tokens\": " << VecToString(tokens) << ", "; - os << "\"timestamps\": " << VecToString(timestamps, 2) << ", "; - os << "\"ys_probs\": " << VecToString(ys_probs, 6) << ", "; - os << "\"lm_probs\": " << VecToString(lm_probs, 6) << ", "; - os << "\"context_scores\": " << VecToString(context_scores, 6) << ", "; - os << "\"segment\": " << segment << ", "; - os << "\"words\": " << VecToString(words, 0) << ", "; - os << "\"start_time\": " << std::fixed << std::setprecision(2) << start_time - << ", "; - os << "\"is_final\": " << (is_final ? "true" : "false") << ", "; - os << "\"is_eof\": " << (is_eof ? "true" : "false"); - os << "}"; - return os.str(); -} - -void OnlineRecognizerConfig::Register(ParseOptions *po) { - feat_config.Register(po); - model_config.Register(po); - endpoint_config.Register(po); - lm_config.Register(po); - ctc_fst_decoder_config.Register(po); - hr.Register(po); - - po->Register("enable-endpoint", &enable_endpoint, - "True to enable endpoint detection. False to disable it."); - po->Register("max-active-paths", &max_active_paths, - "beam size used in modified beam search."); - po->Register("blank-penalty", &blank_penalty, - "The penalty applied on blank symbol during decoding. " - "Note: It is a positive value. " - "Increasing value will lead to lower deletion at the cost" - "of higher insertions. " - "Currently only applicable for transducer models."); - po->Register("hotwords-score", &hotwords_score, - "The bonus score for each token in context word/phrase. " - "Used only when decoding_method is modified_beam_search"); - po->Register( - "hotwords-file", &hotwords_file, - "The file containing hotwords, one words/phrases per line, For example: " - "HELLO WORLD" - "你好世界"); - po->Register("decoding-method", &decoding_method, - "decoding method," - "now support greedy_search and modified_beam_search."); - po->Register("temperature-scale", &temperature_scale, - "Temperature scale for confidence computation in decoding."); - po->Register( - "rule-fsts", &rule_fsts, - "If not empty, it specifies fsts for inverse text normalization. " - "If there are multiple fsts, they are separated by a comma."); - - po->Register( - "rule-fars", &rule_fars, - "If not empty, it specifies fst archives for inverse text normalization. " - "If there are multiple archives, they are separated by a comma."); - - po->Register("reset-encoder", &reset_encoder, - "True to reset encoder_state on an endpoint after empty segment." - "Done in `Reset()` method, after an endpoint was detected."); -} - -bool OnlineRecognizerConfig::Validate() const { - if (decoding_method == "modified_beam_search" && !lm_config.model.empty()) { - if (max_active_paths <= 0) { - SHERPA_ONNX_LOGE("max_active_paths is less than 0! Given: %d", - max_active_paths); - return false; - } - - if (!lm_config.Validate()) { - return false; - } - } - - if (!hotwords_file.empty() && decoding_method != "modified_beam_search") { - SHERPA_ONNX_LOGE( - "Please use --decoding-method=modified_beam_search if you" - " provide --hotwords-file. Given --decoding-method=%s", - decoding_method.c_str()); - return false; - } - - if (!ctc_fst_decoder_config.graph.empty() && - !ctc_fst_decoder_config.Validate()) { - SHERPA_ONNX_LOGE("Errors in ctc_fst_decoder_config"); - return false; - } - - if (!hotwords_file.empty() && !FileExists(hotwords_file)) { - SHERPA_ONNX_LOGE("--hotwords-file: '%s' does not exist", - hotwords_file.c_str()); - return false; - } - - if (!rule_fsts.empty()) { - std::vector files; - SplitStringToVector(rule_fsts, ",", false, &files); - for (const auto &f : files) { - if (!FileExists(f)) { - SHERPA_ONNX_LOGE("Rule fst '%s' does not exist. ", f.c_str()); - return false; - } - } - } - - if (!rule_fars.empty()) { - std::vector files; - SplitStringToVector(rule_fars, ",", false, &files); - for (const auto &f : files) { - if (!FileExists(f)) { - SHERPA_ONNX_LOGE("Rule far '%s' does not exist. ", f.c_str()); - return false; - } - } - } - - if (!hr.lexicon.empty() && !hr.rule_fsts.empty() && !hr.Validate()) { - return false; - } - - return model_config.Validate(); -} - -std::string OnlineRecognizerConfig::ToString() const { - std::ostringstream os; - - os << "OnlineRecognizerConfig("; - os << "feat_config=" << feat_config.ToString() << ", "; - os << "model_config=" << model_config.ToString() << ", "; - os << "lm_config=" << lm_config.ToString() << ", "; - os << "endpoint_config=" << endpoint_config.ToString() << ", "; - os << "ctc_fst_decoder_config=" << ctc_fst_decoder_config.ToString() << ", "; - os << "enable_endpoint=" << (enable_endpoint ? "True" : "False") << ", "; - os << "max_active_paths=" << max_active_paths << ", "; - os << "hotwords_score=" << hotwords_score << ", "; - os << "hotwords_file=\"" << hotwords_file << "\", "; - os << "decoding_method=\"" << decoding_method << "\", "; - os << "blank_penalty=" << blank_penalty << ", "; - os << "temperature_scale=" << temperature_scale << ", "; - os << "rule_fsts=\"" << rule_fsts << "\", "; - os << "rule_fars=\"" << rule_fars << "\", "; - os << "reset_encoder=" << (reset_encoder ? "True" : "False") << ", "; - os << "hr=" << hr.ToString() << ")"; - - return os.str(); -} - -OnlineRecognizer::OnlineRecognizer(const OnlineRecognizerConfig &config) - : impl_(OnlineRecognizerImpl::Create(config)) {} - -template -OnlineRecognizer::OnlineRecognizer(Manager *mgr, - const OnlineRecognizerConfig &config) - : impl_(OnlineRecognizerImpl::Create(mgr, config)) {} - -OnlineRecognizer::~OnlineRecognizer() = default; - -std::unique_ptr OnlineRecognizer::CreateStream() const { - return impl_->CreateStream(); -} - -std::unique_ptr OnlineRecognizer::CreateStream( - const std::string &hotwords) const { - return impl_->CreateStream(hotwords); -} - -bool OnlineRecognizer::IsReady(OnlineStream *s) const { - return impl_->IsReady(s); -} - -void OnlineRecognizer::WarmpUpRecognizer(int32_t warmup, int32_t mbs) const { - if (warmup > 0) { - impl_->WarmpUpRecognizer(warmup, mbs); - } -} - -void OnlineRecognizer::DecodeStreams(OnlineStream **ss, int32_t n) const { - impl_->DecodeStreams(ss, n); -} - -OnlineRecognizerResult OnlineRecognizer::GetResult(OnlineStream *s) const { - return impl_->GetResult(s); -} - -bool OnlineRecognizer::IsEndpoint(OnlineStream *s) const { - return impl_->IsEndpoint(s); -} - -void OnlineRecognizer::Reset(OnlineStream *s) const { impl_->Reset(s); } - -#if __ANDROID_API__ >= 9 -template OnlineRecognizer::OnlineRecognizer( - AAssetManager *mgr, const OnlineRecognizerConfig &config); -#endif - -#if __OHOS__ -template OnlineRecognizer::OnlineRecognizer( - NativeResourceManager *mgr, const OnlineRecognizerConfig &config); -#endif - -} // namespace sherpa_onnx diff --git a/audio_processing/sherpa-onnx/csrc/online-recognizer.h b/audio_processing/sherpa-onnx/csrc/online-recognizer.h deleted file mode 100644 index 09e2c5f66..000000000 --- a/audio_processing/sherpa-onnx/csrc/online-recognizer.h +++ /dev/null @@ -1,229 +0,0 @@ -// sherpa-onnx/csrc/online-recognizer.h -// -// Copyright (c) 2023 Xiaomi Corporation - -#ifndef SHERPA_ONNX_CSRC_ONLINE_RECOGNIZER_H_ -#define SHERPA_ONNX_CSRC_ONLINE_RECOGNIZER_H_ - -#include -#include -#include - -#include "sherpa-onnx/csrc/endpoint.h" -#include "sherpa-onnx/csrc/features.h" -#include "sherpa-onnx/csrc/homophone-replacer.h" -#include "sherpa-onnx/csrc/online-ctc-fst-decoder-config.h" -#include "sherpa-onnx/csrc/online-lm-config.h" -#include "sherpa-onnx/csrc/online-model-config.h" -#include "sherpa-onnx/csrc/online-stream.h" -#include "sherpa-onnx/csrc/online-transducer-model-config.h" -#include "sherpa-onnx/csrc/parse-options.h" - -namespace sherpa_onnx { - -struct OnlineRecognizerResult { - /// Recognition results. - /// For English, it consists of space separated words. - /// For Chinese, it consists of Chinese words without spaces. - /// Example 1: "hello world" - /// Example 2: "你好世界" - std::string text; - - /// Decoded results at the token level. - /// For instance, for BPE-based models it consists of a list of BPE tokens. - std::vector tokens; - - /// timestamps.size() == tokens.size() - /// timestamps[i] records the time in seconds when tokens[i] is decoded. - std::vector timestamps; - - std::vector ys_probs; //< log-prob scores from ASR model - std::vector lm_probs; //< log-prob scores from language model - // - /// log-domain scores from "hot-phrase" contextual boosting - std::vector context_scores; - - std::vector words; - - /// ID of this segment - /// When an endpoint is detected, it is incremented - int32_t segment = 0; - - /// Starting time of this segment. - /// When an endpoint is detected, it will change - float start_time = 0; - - /// True if the end of this segment is reached, i.e., an endpoint is detected - /// used only in ./online-websocket-server-impl.cc - bool is_final = false; - - /// used only in ./online-websocket-server-impl.cc - /// If it is true, it means the server has processed all received samples - bool is_eof = false; - - /** Return a json string. - * - * The returned string contains: - * { - * "text": "The recognition result", - * "tokens": [x, x, x], - * "timestamps": [x, x, x], - * "ys_probs": [x, x, x], - * "lm_probs": [x, x, x], - * "context_scores": [x, x, x], - * "segment": x, - * "start_time": x, - * "is_final": true|false - * "is_eof": true|false - * } - */ - std::string AsJsonString() const; -}; - -struct OnlineRecognizerConfig { - FeatureExtractorConfig feat_config; - OnlineModelConfig model_config; - OnlineLMConfig lm_config; - EndpointConfig endpoint_config; - OnlineCtcFstDecoderConfig ctc_fst_decoder_config; - - bool enable_endpoint = true; - - std::string decoding_method = "greedy_search"; - // now support modified_beam_search and greedy_search - - // used only for modified_beam_search - int32_t max_active_paths = 4; - - /// used only for modified_beam_search - std::string hotwords_file; - float hotwords_score = 1.5; - - float blank_penalty = 0.0; - - float temperature_scale = 2.0; - - // If there are multiple rules, they are applied from left to right. - std::string rule_fsts; - - // If there are multiple FST archives, they are applied from left to right. - std::string rule_fars; - - // True to reset encoder_state on an endpoint after empty segment. - // Done in `Reset()` method, after an endpoint was detected, - // currently only in `OnlineRecognizerTransducerImpl`. - bool reset_encoder = false; - - HomophoneReplacerConfig hr; - - /// used only for modified_beam_search, if hotwords_buf is non-empty, - /// the hotwords will be loaded from the buffered string instead of from the - /// "hotwords_file" - std::string hotwords_buf; - - OnlineRecognizerConfig() = default; - - OnlineRecognizerConfig( - const FeatureExtractorConfig &feat_config, - const OnlineModelConfig &model_config, const OnlineLMConfig &lm_config, - const EndpointConfig &endpoint_config, - const OnlineCtcFstDecoderConfig &ctc_fst_decoder_config, - bool enable_endpoint, const std::string &decoding_method, - int32_t max_active_paths, const std::string &hotwords_file, - float hotwords_score, float blank_penalty, float temperature_scale, - const std::string &rule_fsts, const std::string &rule_fars, - bool reset_encoder, const HomophoneReplacerConfig &hr) - : feat_config(feat_config), - model_config(model_config), - lm_config(lm_config), - endpoint_config(endpoint_config), - ctc_fst_decoder_config(ctc_fst_decoder_config), - enable_endpoint(enable_endpoint), - decoding_method(decoding_method), - max_active_paths(max_active_paths), - hotwords_file(hotwords_file), - hotwords_score(hotwords_score), - blank_penalty(blank_penalty), - temperature_scale(temperature_scale), - rule_fsts(rule_fsts), - rule_fars(rule_fars), - reset_encoder(reset_encoder), - hr(hr) {} - - void Register(ParseOptions *po); - bool Validate() const; - - std::string ToString() const; -}; - -class OnlineRecognizerImpl; - -class OnlineRecognizer { - public: - explicit OnlineRecognizer(const OnlineRecognizerConfig &config); - - template - OnlineRecognizer(Manager *mgr, const OnlineRecognizerConfig &config); - - ~OnlineRecognizer(); - - /// Create a stream for decoding. - std::unique_ptr CreateStream() const; - - /** Create a stream for decoding. - * - * @param The hotwords for this string, it might contain several hotwords, - * the hotwords are separated by "/". In each of the hotwords, there - * are cjkchars or bpes, the bpe/cjkchar are separated by space (" "). - * For example, hotwords I LOVE YOU and HELLO WORLD, looks like: - * - * "▁I ▁LOVE ▁YOU/▁HE LL O ▁WORLD" - */ - std::unique_ptr CreateStream(const std::string &hotwords) const; - - /** - * Return true if the given stream has enough frames for decoding. - * Return false otherwise - */ - bool IsReady(OnlineStream *s) const; - - /** Decode a single stream. */ - void DecodeStream(OnlineStream *s) const { - OnlineStream *ss[1] = {s}; - DecodeStreams(ss, 1); - } - - /** - * Warmups up onnxruntime sessions by apply optimization and - * allocating memory prior - * - * @param warmup Number of warmups. - * @param mbs : max-batch-size Max batch size for the models - */ - void WarmpUpRecognizer(int32_t warmup, int32_t mbs) const; - - /** Decode multiple streams in parallel - * - * @param ss Pointer array containing streams to be decoded. - * @param n Number of streams in `ss`. - */ - void DecodeStreams(OnlineStream **ss, int32_t n) const; - - OnlineRecognizerResult GetResult(OnlineStream *s) const; - - // Return true if we detect an endpoint for this stream. - // Note: If this function returns true, you usually want to - // invoke Reset(s). - bool IsEndpoint(OnlineStream *s) const; - - // Clear the state of this stream. If IsEndpoint(s) returns true, - // after calling this function, IsEndpoint(s) will return false - void Reset(OnlineStream *s) const; - - private: - std::unique_ptr impl_; -}; - -} // namespace sherpa_onnx - -#endif // SHERPA_ONNX_CSRC_ONLINE_RECOGNIZER_H_ diff --git a/audio_processing/sherpa-onnx/csrc/online-stream.cc b/audio_processing/sherpa-onnx/csrc/online-stream.cc deleted file mode 100644 index f7abaa66a..000000000 --- a/audio_processing/sherpa-onnx/csrc/online-stream.cc +++ /dev/null @@ -1,285 +0,0 @@ -// sherpa-onnx/csrc/online-stream.cc -// -// Copyright (c) 2023 Xiaomi Corporation -#include "sherpa-onnx/csrc/online-stream.h" - -#include -#include -#include - -#include "sherpa-onnx/csrc/features.h" -#include "sherpa-onnx/csrc/transducer-keyword-decoder.h" - -namespace sherpa_onnx { - -class OnlineStream::Impl { - public: - explicit Impl(const FeatureExtractorConfig &config, - ContextGraphPtr context_graph) - : feat_extractor_(config), context_graph_(std::move(context_graph)) {} - - void AcceptWaveform(int32_t sampling_rate, const float *waveform, int32_t n) { - std::lock_guard lock(mutex_); - feat_extractor_.AcceptWaveform(sampling_rate, waveform, n); - } - - void InputFinished() const { - std::lock_guard lock(mutex_); - feat_extractor_.InputFinished(); - } - - int32_t NumFramesReady() const { - std::lock_guard lock(mutex_); - return feat_extractor_.NumFramesReady() - start_frame_index_; - } - - bool IsLastFrame(int32_t frame) const { - std::lock_guard lock(mutex_); - return feat_extractor_.IsLastFrame(frame); - } - - std::vector GetFrames(int32_t frame_index, int32_t n) const { - std::lock_guard lock(mutex_); - return feat_extractor_.GetFrames(frame_index + start_frame_index_, n); - } - - void Reset() { - std::lock_guard lock(mutex_); - // we don't reset the feature extractor - start_frame_index_ += num_processed_frames_; - num_processed_frames_ = 0; - } - - int32_t &GetNumProcessedFrames() { - std::lock_guard lock(mutex_); - return num_processed_frames_; - } - - int32_t GetNumFramesSinceStart() const { - std::lock_guard lock(mutex_); - return start_frame_index_; - } - - int32_t &GetCurrentSegment() { - std::lock_guard lock(mutex_); - return segment_; - } - - void SetResult(const OnlineTransducerDecoderResult &r) { result_ = r; } - - OnlineTransducerDecoderResult &GetResult() { return result_; } - - void SetKeywordResult(const TransducerKeywordResult &r) { - keyword_result_ = r; - } - TransducerKeywordResult &GetKeywordResult(bool remove_duplicates) { - if (remove_duplicates) { - if (!prev_keyword_result_.timestamps.empty() && - !keyword_result_.timestamps.empty() && - keyword_result_.timestamps[0] <= - prev_keyword_result_.timestamps.back()) { - return empty_keyword_result_; - } else { - prev_keyword_result_ = keyword_result_; - } - return keyword_result_; - } else { - return keyword_result_; - } - } - - OnlineCtcDecoderResult &GetCtcResult() { return ctc_result_; } - - void SetCtcResult(const OnlineCtcDecoderResult &r) { ctc_result_ = r; } - - void SetParaformerResult(const OnlineParaformerDecoderResult &r) { - paraformer_result_ = r; - } - - OnlineParaformerDecoderResult &GetParaformerResult() { - return paraformer_result_; - } - - int32_t FeatureDim() const { return feat_extractor_.FeatureDim(); } - - void SetStates(std::vector states) { - states_ = std::move(states); - } - - std::vector &GetStates() { return states_; } - - void SetNeMoDecoderStates(std::vector decoder_states) { - decoder_states_ = std::move(decoder_states); - } - - std::vector &GetNeMoDecoderStates() { return decoder_states_; } - - const ContextGraphPtr &GetContextGraph() const { return context_graph_; } - - std::vector &GetParaformerFeatCache() { - return paraformer_feat_cache_; - } - - std::vector &GetParaformerEncoderOutCache() { - return paraformer_encoder_out_cache_; - } - - std::vector &GetParaformerAlphaCache() { - return paraformer_alpha_cache_; - } - - void SetFasterDecoder(std::unique_ptr decoder) { - faster_decoder_ = std::move(decoder); - } - - kaldi_decoder::FasterDecoder *GetFasterDecoder() const { - return faster_decoder_.get(); - } - - int32_t &GetFasterDecoderProcessedFrames() { - return faster_decoder_processed_frames_; - } - - private: - FeatureExtractor feat_extractor_; - mutable std::mutex mutex_; - /// For contextual-biasing - ContextGraphPtr context_graph_; - int32_t num_processed_frames_ = 0; // before subsampling - int32_t start_frame_index_ = 0; // never reset - int32_t segment_ = 0; - OnlineTransducerDecoderResult result_; - TransducerKeywordResult prev_keyword_result_; - TransducerKeywordResult keyword_result_; - TransducerKeywordResult empty_keyword_result_; - OnlineCtcDecoderResult ctc_result_; - std::vector states_; // states for transducer or ctc models - std::vector decoder_states_; // states for nemo transducer models - std::vector paraformer_feat_cache_; - std::vector paraformer_encoder_out_cache_; - std::vector paraformer_alpha_cache_; - OnlineParaformerDecoderResult paraformer_result_; - std::unique_ptr faster_decoder_; - int32_t faster_decoder_processed_frames_ = 0; -}; - -OnlineStream::OnlineStream(const FeatureExtractorConfig &config /*= {}*/, - ContextGraphPtr context_graph /*= nullptr */) - : impl_(std::make_unique(config, std::move(context_graph))) {} - -OnlineStream::~OnlineStream() = default; - -void OnlineStream::AcceptWaveform(int32_t sampling_rate, const float *waveform, - int32_t n) const { - impl_->AcceptWaveform(sampling_rate, waveform, n); -} - -void OnlineStream::InputFinished() const { impl_->InputFinished(); } - -int32_t OnlineStream::NumFramesReady() const { return impl_->NumFramesReady(); } - -bool OnlineStream::IsLastFrame(int32_t frame) const { - return impl_->IsLastFrame(frame); -} - -std::vector OnlineStream::GetFrames(int32_t frame_index, - int32_t n) const { - return impl_->GetFrames(frame_index, n); -} - -void OnlineStream::Reset() { impl_->Reset(); } - -int32_t OnlineStream::FeatureDim() const { return impl_->FeatureDim(); } - -int32_t &OnlineStream::GetNumProcessedFrames() { - return impl_->GetNumProcessedFrames(); -} - -int32_t OnlineStream::GetNumFramesSinceStart() const { - return impl_->GetNumFramesSinceStart(); -} - -int32_t &OnlineStream::GetCurrentSegment() { - return impl_->GetCurrentSegment(); -} - -void OnlineStream::SetResult(const OnlineTransducerDecoderResult &r) { - impl_->SetResult(r); -} - -OnlineTransducerDecoderResult &OnlineStream::GetResult() { - return impl_->GetResult(); -} - -void OnlineStream::SetKeywordResult(const TransducerKeywordResult &r) { - impl_->SetKeywordResult(r); -} - -TransducerKeywordResult &OnlineStream::GetKeywordResult( - bool remove_duplicates /*=false*/) { - return impl_->GetKeywordResult(remove_duplicates); -} - -OnlineCtcDecoderResult &OnlineStream::GetCtcResult() { - return impl_->GetCtcResult(); -} - -void OnlineStream::SetCtcResult(const OnlineCtcDecoderResult &r) { - impl_->SetCtcResult(r); -} - -void OnlineStream::SetParaformerResult(const OnlineParaformerDecoderResult &r) { - impl_->SetParaformerResult(r); -} - -OnlineParaformerDecoderResult &OnlineStream::GetParaformerResult() { - return impl_->GetParaformerResult(); -} - -void OnlineStream::SetStates(std::vector states) { - impl_->SetStates(std::move(states)); -} - -std::vector &OnlineStream::GetStates() { - return impl_->GetStates(); -} - -void OnlineStream::SetNeMoDecoderStates( - std::vector decoder_states) { - return impl_->SetNeMoDecoderStates(std::move(decoder_states)); -} - -std::vector &OnlineStream::GetNeMoDecoderStates() { - return impl_->GetNeMoDecoderStates(); -} - -const ContextGraphPtr &OnlineStream::GetContextGraph() const { - return impl_->GetContextGraph(); -} - -void OnlineStream::SetFasterDecoder( - std::unique_ptr decoder) { - impl_->SetFasterDecoder(std::move(decoder)); -} - -kaldi_decoder::FasterDecoder *OnlineStream::GetFasterDecoder() const { - return impl_->GetFasterDecoder(); -} - -int32_t &OnlineStream::GetFasterDecoderProcessedFrames() { - return impl_->GetFasterDecoderProcessedFrames(); -} - -std::vector &OnlineStream::GetParaformerFeatCache() { - return impl_->GetParaformerFeatCache(); -} - -std::vector &OnlineStream::GetParaformerEncoderOutCache() { - return impl_->GetParaformerEncoderOutCache(); -} - -std::vector &OnlineStream::GetParaformerAlphaCache() { - return impl_->GetParaformerAlphaCache(); -} - -} // namespace sherpa_onnx diff --git a/audio_processing/sherpa-onnx/csrc/online-stream.h b/audio_processing/sherpa-onnx/csrc/online-stream.h deleted file mode 100644 index 71600db65..000000000 --- a/audio_processing/sherpa-onnx/csrc/online-stream.h +++ /dev/null @@ -1,121 +0,0 @@ -// sherpa-onnx/csrc/online-stream.h -// -// Copyright (c) 2023 Xiaomi Corporation - -#ifndef SHERPA_ONNX_CSRC_ONLINE_STREAM_H_ -#define SHERPA_ONNX_CSRC_ONLINE_STREAM_H_ - -#include -#include - -#include "kaldi-decoder/csrc/faster-decoder.h" -#include "onnxruntime_cxx_api.h" // NOLINT -#include "sherpa-onnx/csrc/context-graph.h" -#include "sherpa-onnx/csrc/features.h" -#include "sherpa-onnx/csrc/online-ctc-decoder.h" -#include "sherpa-onnx/csrc/online-paraformer-decoder.h" -#include "sherpa-onnx/csrc/online-transducer-decoder.h" - -namespace sherpa_onnx { - -struct TransducerKeywordResult; -class OnlineStream { - public: - explicit OnlineStream(const FeatureExtractorConfig &config = {}, - ContextGraphPtr context_graph = nullptr); - - virtual ~OnlineStream(); - - /** - @param sampling_rate The sampling_rate of the input waveform. If it does - not equal to config.sampling_rate, we will do - resampling inside. - @param waveform Pointer to a 1-D array of size n. It must be normalized to - the range [-1, 1]. - @param n Number of entries in waveform - */ - void AcceptWaveform(int32_t sampling_rate, const float *waveform, - int32_t n) const; - - /** - * InputFinished() tells the class you won't be providing any - * more waveform. This will help flush out the last frame or two - * of features, in the case where snip-edges == false; it also - * affects the return value of IsLastFrame(). - */ - void InputFinished() const; - - int32_t NumFramesReady() const; - - /** Note: IsLastFrame() will only ever return true if you have called - * InputFinished() (and this frame is the last frame). - */ - bool IsLastFrame(int32_t frame) const; - - /** Get n frames starting from the given frame index. - * - * @param frame_index The starting frame index - * @param n Number of frames to get. - * @return Return a 2-D tensor of shape (n, feature_dim). - * which is flattened into a 1-D vector (flattened in row major) - */ - std::vector GetFrames(int32_t frame_index, int32_t n) const; - - void Reset(); - - int32_t FeatureDim() const; - - // Return a reference to the number of processed frames so far - // before subsampling.. - // Initially, it is 0. It is always less than NumFramesReady(). - // - // The returned reference is valid as long as this object is alive. - int32_t &GetNumProcessedFrames(); // It's reset after calling Reset() - - int32_t GetNumFramesSinceStart() const; - - int32_t &GetCurrentSegment(); - - void SetResult(const OnlineTransducerDecoderResult &r); - OnlineTransducerDecoderResult &GetResult(); - - void SetKeywordResult(const TransducerKeywordResult &r); - TransducerKeywordResult &GetKeywordResult(bool remove_duplicates = false); - - void SetCtcResult(const OnlineCtcDecoderResult &r); - OnlineCtcDecoderResult &GetCtcResult(); - - void SetParaformerResult(const OnlineParaformerDecoderResult &r); - OnlineParaformerDecoderResult &GetParaformerResult(); - - void SetStates(std::vector states); - std::vector &GetStates(); - - void SetNeMoDecoderStates(std::vector decoder_states); - std::vector &GetNeMoDecoderStates(); - - /** - * Get the context graph corresponding to this stream. - * - * @return Return the context graph for this stream. - */ - const ContextGraphPtr &GetContextGraph() const; - - // for online ctc decoder - void SetFasterDecoder(std::unique_ptr decoder); - kaldi_decoder::FasterDecoder *GetFasterDecoder() const; - int32_t &GetFasterDecoderProcessedFrames(); - - // for streaming paraformer - std::vector &GetParaformerFeatCache(); - std::vector &GetParaformerEncoderOutCache(); - std::vector &GetParaformerAlphaCache(); - - private: - class Impl; - std::unique_ptr impl_; -}; - -} // namespace sherpa_onnx - -#endif // SHERPA_ONNX_CSRC_ONLINE_STREAM_H_ diff --git a/audio_processing/sherpa-onnx/csrc/online-transducer-model-config.cc b/audio_processing/sherpa-onnx/csrc/online-transducer-model-config.cc deleted file mode 100644 index dd7572717..000000000 --- a/audio_processing/sherpa-onnx/csrc/online-transducer-model-config.cc +++ /dev/null @@ -1,51 +0,0 @@ -// sherpa-onnx/csrc/online-transducer-model-config.cc -// -// Copyright (c) 2023 Xiaomi Corporation -#include "sherpa-onnx/csrc/online-transducer-model-config.h" - -#include - -#include "sherpa-onnx/csrc/file-utils.h" -#include "sherpa-onnx/csrc/macros.h" - -namespace sherpa_onnx { - -void OnlineTransducerModelConfig::Register(ParseOptions *po) { - po->Register("encoder", &encoder, "Path to encoder.onnx"); - po->Register("decoder", &decoder, "Path to decoder.onnx"); - po->Register("joiner", &joiner, "Path to joiner.onnx"); -} - -bool OnlineTransducerModelConfig::Validate() const { - if (!FileExists(encoder)) { - SHERPA_ONNX_LOGE("transducer encoder: '%s' does not exist", - encoder.c_str()); - return false; - } - - if (!FileExists(decoder)) { - SHERPA_ONNX_LOGE("transducer decoder: '%s' does not exist", - decoder.c_str()); - return false; - } - - if (!FileExists(joiner)) { - SHERPA_ONNX_LOGE("joiner: '%s' does not exist", joiner.c_str()); - return false; - } - - return true; -} - -std::string OnlineTransducerModelConfig::ToString() const { - std::ostringstream os; - - os << "OnlineTransducerModelConfig("; - os << "encoder=\"" << encoder << "\", "; - os << "decoder=\"" << decoder << "\", "; - os << "joiner=\"" << joiner << "\")"; - - return os.str(); -} - -} // namespace sherpa_onnx diff --git a/audio_processing/sherpa-onnx/csrc/online-transducer-model-config.h b/audio_processing/sherpa-onnx/csrc/online-transducer-model-config.h deleted file mode 100644 index 5d79e25bf..000000000 --- a/audio_processing/sherpa-onnx/csrc/online-transducer-model-config.h +++ /dev/null @@ -1,32 +0,0 @@ -// sherpa-onnx/csrc/online-transducer-model-config.h -// -// Copyright (c) 2023 Xiaomi Corporation -#ifndef SHERPA_ONNX_CSRC_ONLINE_TRANSDUCER_MODEL_CONFIG_H_ -#define SHERPA_ONNX_CSRC_ONLINE_TRANSDUCER_MODEL_CONFIG_H_ - -#include - -#include "sherpa-onnx/csrc/parse-options.h" - -namespace sherpa_onnx { - -struct OnlineTransducerModelConfig { - std::string encoder; - std::string decoder; - std::string joiner; - - OnlineTransducerModelConfig() = default; - OnlineTransducerModelConfig(const std::string &encoder, - const std::string &decoder, - const std::string &joiner) - : encoder(encoder), decoder(decoder), joiner(joiner) {} - - void Register(ParseOptions *po); - bool Validate() const; - - std::string ToString() const; -}; - -} // namespace sherpa_onnx - -#endif // SHERPA_ONNX_CSRC_ONLINE_TRANSDUCER_MODEL_CONFIG_H_ diff --git a/audio_processing/sherpa-onnx/csrc/online-transducer-model.cc b/audio_processing/sherpa-onnx/csrc/online-transducer-model.cc deleted file mode 100644 index 286fd9cd1..000000000 --- a/audio_processing/sherpa-onnx/csrc/online-transducer-model.cc +++ /dev/null @@ -1,230 +0,0 @@ -// sherpa-onnx/csrc/online-transducer-model.cc -// -// Copyright (c) 2023 Xiaomi Corporation -// Copyright (c) 2023 Pingfeng Luo -#include "sherpa-onnx/csrc/online-transducer-model.h" - -#if __ANDROID_API__ >= 9 -#include "android/asset_manager.h" -#include "android/asset_manager_jni.h" -#endif - -#if __OHOS__ -#include "rawfile/raw_file_manager.h" -#endif - -#include -#include -#include -#include - -#include "sherpa-onnx/csrc/file-utils.h" -#include "sherpa-onnx/csrc/macros.h" -#include "sherpa-onnx/csrc/online-conformer-transducer-model.h" -#include "sherpa-onnx/csrc/online-ebranchformer-transducer-model.h" -#include "sherpa-onnx/csrc/online-lstm-transducer-model.h" -#include "sherpa-onnx/csrc/online-zipformer-transducer-model.h" -#include "sherpa-onnx/csrc/online-zipformer2-transducer-model.h" -#include "sherpa-onnx/csrc/onnx-utils.h" - -namespace { - -enum class ModelType : std::uint8_t { - kConformer, - kEbranchformer, - kLstm, - kZipformer, - kZipformer2, - kUnknown, -}; - -} // namespace - -namespace sherpa_onnx { - -static ModelType GetModelType(char *model_data, size_t model_data_length, - bool debug) { - Ort::Env env(ORT_LOGGING_LEVEL_ERROR); - Ort::SessionOptions sess_opts; - sess_opts.SetIntraOpNumThreads(1); - sess_opts.SetInterOpNumThreads(1); - - auto sess = std::make_unique(env, model_data, model_data_length, - sess_opts); - - Ort::ModelMetadata meta_data = sess->GetModelMetadata(); - if (debug) { - std::ostringstream os; - PrintModelMetadata(os, meta_data); -#if __OHOS__ - SHERPA_ONNX_LOGE("%{public}s", os.str().c_str()); -#else - SHERPA_ONNX_LOGE("%s", os.str().c_str()); -#endif - } - - Ort::AllocatorWithDefaultOptions allocator; - auto model_type = - LookupCustomModelMetaData(meta_data, "model_type", allocator); - if (model_type.empty()) { - SHERPA_ONNX_LOGE( - "No model_type in the metadata!\n" - "Please make sure you are using the latest export-onnx.py from icefall " - "to export your transducer models"); - return ModelType::kUnknown; - } - - if (model_type == "conformer") { - return ModelType::kConformer; - } else if (model_type == "ebranchformer") { - return ModelType::kEbranchformer; - } else if (model_type == "lstm") { - return ModelType::kLstm; - } else if (model_type == "zipformer") { - return ModelType::kZipformer; - } else if (model_type == "zipformer2") { - return ModelType::kZipformer2; - } else { - SHERPA_ONNX_LOGE("Unsupported model_type: %s", model_type.c_str()); - return ModelType::kUnknown; - } -} - -std::unique_ptr OnlineTransducerModel::Create( - const OnlineModelConfig &config) { - if (!config.model_type.empty()) { - const auto &model_type = config.model_type; - if (model_type == "conformer") { - return std::make_unique(config); - } else if (model_type == "ebranchformer") { - return std::make_unique(config); - } else if (model_type == "lstm") { - return std::make_unique(config); - } else if (model_type == "zipformer") { - return std::make_unique(config); - } else if (model_type == "zipformer2") { - return std::make_unique(config); - } else { - SHERPA_ONNX_LOGE( - "Invalid model_type: %s. Trying to load the model to get its type", - model_type.c_str()); - } - } - ModelType model_type = ModelType::kUnknown; - - { - auto buffer = ReadFile(config.transducer.encoder); - - model_type = GetModelType(buffer.data(), buffer.size(), config.debug); - } - - switch (model_type) { - case ModelType::kConformer: - return std::make_unique(config); - case ModelType::kEbranchformer: - return std::make_unique(config); - case ModelType::kLstm: - return std::make_unique(config); - case ModelType::kZipformer: - return std::make_unique(config); - case ModelType::kZipformer2: - return std::make_unique(config); - case ModelType::kUnknown: - SHERPA_ONNX_LOGE("Unknown model type in online transducer!"); - return nullptr; - } - - // unreachable code - return nullptr; -} - -Ort::Value OnlineTransducerModel::BuildDecoderInput( - const std::vector &results) { - int32_t batch_size = static_cast(results.size()); - int32_t context_size = ContextSize(); - std::array shape{batch_size, context_size}; - Ort::Value decoder_input = Ort::Value::CreateTensor( - Allocator(), shape.data(), shape.size()); - int64_t *p = decoder_input.GetTensorMutableData(); - - for (const auto &r : results) { - const int64_t *begin = r.tokens.data() + r.tokens.size() - context_size; - const int64_t *end = r.tokens.data() + r.tokens.size(); - std::copy(begin, end, p); - p += context_size; - } - return decoder_input; -} - -Ort::Value OnlineTransducerModel::BuildDecoderInput( - const std::vector &hyps) { - int32_t batch_size = static_cast(hyps.size()); - int32_t context_size = ContextSize(); - std::array shape{batch_size, context_size}; - Ort::Value decoder_input = Ort::Value::CreateTensor( - Allocator(), shape.data(), shape.size()); - int64_t *p = decoder_input.GetTensorMutableData(); - - for (const auto &h : hyps) { - std::copy(h.ys.end() - context_size, h.ys.end(), p); - p += context_size; - } - return decoder_input; -} - -template -std::unique_ptr OnlineTransducerModel::Create( - Manager *mgr, const OnlineModelConfig &config) { - if (!config.model_type.empty()) { - const auto &model_type = config.model_type; - if (model_type == "conformer") { - return std::make_unique(mgr, config); - } else if (model_type == "ebranchformer") { - return std::make_unique(mgr, config); - } else if (model_type == "lstm") { - return std::make_unique(mgr, config); - } else if (model_type == "zipformer") { - return std::make_unique(mgr, config); - } else if (model_type == "zipformer2") { - return std::make_unique(mgr, config); - } else { - SHERPA_ONNX_LOGE( - "Invalid model_type: %s. Trying to load the model to get its type", - model_type.c_str()); - } - } - - auto buffer = ReadFile(mgr, config.transducer.encoder); - auto model_type = GetModelType(buffer.data(), buffer.size(), config.debug); - - switch (model_type) { - case ModelType::kConformer: - return std::make_unique(mgr, config); - case ModelType::kEbranchformer: - return std::make_unique(mgr, config); - case ModelType::kLstm: - return std::make_unique(mgr, config); - case ModelType::kZipformer: - return std::make_unique(mgr, config); - case ModelType::kZipformer2: - return std::make_unique(mgr, config); - case ModelType::kUnknown: - SHERPA_ONNX_LOGE("Unknown model type in online transducer!"); - return nullptr; - } - - // unreachable code - return nullptr; -} - -#if __ANDROID_API__ >= 9 -template std::unique_ptr OnlineTransducerModel::Create( - AAssetManager *mgr, const OnlineModelConfig &config); -#endif - -#if __OHOS__ -template std::unique_ptr OnlineTransducerModel::Create( - NativeResourceManager *mgr, const OnlineModelConfig &config); -#endif - -} // namespace sherpa_onnx diff --git a/audio_processing/sherpa-onnx/csrc/online-transducer-model.h b/audio_processing/sherpa-onnx/csrc/online-transducer-model.h deleted file mode 100644 index a568c1760..000000000 --- a/audio_processing/sherpa-onnx/csrc/online-transducer-model.h +++ /dev/null @@ -1,147 +0,0 @@ -// sherpa-onnx/csrc/online-transducer-model.h -// -// Copyright (c) 2023 Xiaomi Corporation -#ifndef SHERPA_ONNX_CSRC_ONLINE_TRANSDUCER_MODEL_H_ -#define SHERPA_ONNX_CSRC_ONLINE_TRANSDUCER_MODEL_H_ - -#include -#include -#include - -#include "onnxruntime_cxx_api.h" // NOLINT -#include "sherpa-onnx/csrc/hypothesis.h" -#include "sherpa-onnx/csrc/online-model-config.h" -#include "sherpa-onnx/csrc/online-transducer-decoder.h" -#include "sherpa-onnx/csrc/online-transducer-model-config.h" - -namespace sherpa_onnx { - -struct OnlineTransducerDecoderResult; - -class OnlineTransducerModel { - public: - virtual ~OnlineTransducerModel() = default; - - static std::unique_ptr Create( - const OnlineModelConfig &config); - - template - static std::unique_ptr Create( - Manager *mgr, const OnlineModelConfig &config); - - /** Stack a list of individual states into a batch. - * - * It is the inverse operation of `UnStackStates`. - * - * @param states states[i] contains the state for the i-th utterance. - * @return Return a single value representing the batched state. - */ - virtual std::vector StackStates( - const std::vector> &states) const = 0; - - /** Unstack a batch state into a list of individual states. - * - * It is the inverse operation of `StackStates`. - * - * @param states A batched state. - * @return ans[i] contains the state for the i-th utterance. - */ - virtual std::vector> UnStackStates( - const std::vector &states) const = 0; - - /** Get the initial encoder states. - * - * @return Return the initial encoder state. - */ - virtual std::vector GetEncoderInitStates() = 0; - - /** Set feature dim. - * - * This is used in `OnlineZipformer2TransducerModel`, - * to pass `feature_dim` for `GetEncoderInitStates()`. - * - * This has to be called before GetEncoderInitStates(), so the `encoder_embed` - * init state has the correct `embed_dim` of its output. - */ - virtual void SetFeatureDim(int32_t /*feature_dim*/) {} - - /** Run the encoder. - * - * @param features A tensor of shape (N, T, C). It is changed in-place. - * @param states Encoder state of the previous chunk. It is changed in-place. - * @param processed_frames Processed frames before subsampling. It is a 1-D - * tensor with data type int64_t. - * - * @return Return a tuple containing: - * - encoder_out, a tensor of shape (N, T', encoder_out_dim) - * - next_states Encoder state for the next chunk. - */ - virtual std::pair> RunEncoder( - Ort::Value features, std::vector states, - Ort::Value processed_frames) = 0; // NOLINT - - /** Run the decoder network. - * - * Caution: We assume there are no recurrent connections in the decoder and - * the decoder is stateless. See - * https://github.com/k2-fsa/icefall/blob/master/egs/librispeech/ASR/pruned_transducer_stateless2/decoder.py - * for an example - * - * @param decoder_input It is usually of shape (N, context_size) - * @return Return a tensor of shape (N, decoder_dim). - */ - virtual Ort::Value RunDecoder(Ort::Value decoder_input) = 0; - - /** Run the joint network. - * - * @param encoder_out Output of the encoder network. A tensor of shape - * (N, joiner_dim). - * @param decoder_out Output of the decoder network. A tensor of shape - * (N, joiner_dim). - * @return Return a tensor of shape (N, vocab_size). In icefall, the last - * last layer of the joint network is `nn.Linear`, - * not `nn.LogSoftmax`. - */ - virtual Ort::Value RunJoiner(Ort::Value encoder_out, - Ort::Value decoder_out) = 0; - - /** If we are using a stateless decoder and if it contains a - * Conv1D, this function returns the kernel size of the convolution layer. - */ - virtual int32_t ContextSize() const = 0; - - /** We send this number of feature frames to the encoder at a time. */ - virtual int32_t ChunkSize() const = 0; - - /** Number of input frames to discard after each call to RunEncoder. - * - * For instance, if we have 30 frames, chunk_size=8, chunk_shift=6. - * - * In the first call of RunEncoder, we use frames 0~7 since chunk_size is 8. - * Then we discard frame 0~5 since chunk_shift is 6. - * In the second call of RunEncoder, we use frames 6~13; and then we discard - * frames 6~11. - * In the third call of RunEncoder, we use frames 12~19; and then we discard - * frames 12~16. - * - * Note: ChunkSize() - ChunkShift() == right context size - */ - virtual int32_t ChunkShift() const = 0; - - virtual int32_t VocabSize() const = 0; - - virtual int32_t SubsamplingFactor() const { return 4; } - - virtual bool UseWhisperFeature() const { return false; } - - virtual OrtAllocator *Allocator() = 0; - - Ort::Value BuildDecoderInput( - const std::vector &results); - - Ort::Value BuildDecoderInput(const std::vector &hyps); -}; - -} // namespace sherpa_onnx - -#endif // SHERPA_ONNX_CSRC_ONLINE_TRANSDUCER_MODEL_H_ diff --git a/audio_processing/sherpa-onnx/csrc/online-zipformer-transducer-model.cc b/audio_processing/sherpa-onnx/csrc/online-zipformer-transducer-model.cc deleted file mode 100644 index 7dfaa30ac..000000000 --- a/audio_processing/sherpa-onnx/csrc/online-zipformer-transducer-model.cc +++ /dev/null @@ -1,518 +0,0 @@ -// sherpa-onnx/csrc/online-zipformer-transducer-model.cc -// -// Copyright (c) 2023 Xiaomi Corporation - -#include "sherpa-onnx/csrc/online-zipformer-transducer-model.h" - -#include -#include -#include -#include -#include -#include -#include - -#if __ANDROID_API__ >= 9 -#include "android/asset_manager.h" -#include "android/asset_manager_jni.h" -#endif - -#if __OHOS__ -#include "rawfile/raw_file_manager.h" -#endif - -#include "onnxruntime_cxx_api.h" // NOLINT -#include "sherpa-onnx/csrc/cat.h" -#include "sherpa-onnx/csrc/file-utils.h" -#include "sherpa-onnx/csrc/macros.h" -#include "sherpa-onnx/csrc/online-transducer-decoder.h" -#include "sherpa-onnx/csrc/onnx-utils.h" -#include "sherpa-onnx/csrc/session.h" -#include "sherpa-onnx/csrc/text-utils.h" -#include "sherpa-onnx/csrc/unbind.h" - -namespace sherpa_onnx { - -OnlineZipformerTransducerModel::OnlineZipformerTransducerModel( - const OnlineModelConfig &config) - : env_(ORT_LOGGING_LEVEL_ERROR), - config_(config), - sess_opts_(GetSessionOptions(config)), - allocator_{} { - { - auto buf = ReadFile(config.transducer.encoder); - InitEncoder(buf.data(), buf.size()); - } - - { - auto buf = ReadFile(config.transducer.decoder); - InitDecoder(buf.data(), buf.size()); - } - - { - auto buf = ReadFile(config.transducer.joiner); - InitJoiner(buf.data(), buf.size()); - } -} - -template -OnlineZipformerTransducerModel::OnlineZipformerTransducerModel( - Manager *mgr, const OnlineModelConfig &config) - : env_(ORT_LOGGING_LEVEL_ERROR), - config_(config), - sess_opts_(GetSessionOptions(config)), - allocator_{} { - { - auto buf = ReadFile(mgr, config.transducer.encoder); - InitEncoder(buf.data(), buf.size()); - } - - { - auto buf = ReadFile(mgr, config.transducer.decoder); - InitDecoder(buf.data(), buf.size()); - } - - { - auto buf = ReadFile(mgr, config.transducer.joiner); - InitJoiner(buf.data(), buf.size()); - } -} - -void OnlineZipformerTransducerModel::InitEncoder(void *model_data, - size_t model_data_length) { - encoder_sess_ = std::make_unique(env_, model_data, - model_data_length, sess_opts_); - - GetInputNames(encoder_sess_.get(), &encoder_input_names_, - &encoder_input_names_ptr_); - - GetOutputNames(encoder_sess_.get(), &encoder_output_names_, - &encoder_output_names_ptr_); - - // get meta data - Ort::ModelMetadata meta_data = encoder_sess_->GetModelMetadata(); - if (config_.debug) { - std::ostringstream os; - os << "---encoder---\n"; - PrintModelMetadata(os, meta_data); -#if __OHOS__ - SHERPA_ONNX_LOGE("%{public}s", os.str().c_str()); -#else - SHERPA_ONNX_LOGE("%s", os.str().c_str()); -#endif - } - - Ort::AllocatorWithDefaultOptions allocator; // used in the macro below - SHERPA_ONNX_READ_META_DATA_VEC(encoder_dims_, "encoder_dims"); - SHERPA_ONNX_READ_META_DATA_VEC(attention_dims_, "attention_dims"); - SHERPA_ONNX_READ_META_DATA_VEC(num_encoder_layers_, "num_encoder_layers"); - SHERPA_ONNX_READ_META_DATA_VEC(cnn_module_kernels_, "cnn_module_kernels"); - SHERPA_ONNX_READ_META_DATA_VEC(left_context_len_, "left_context_len"); - - SHERPA_ONNX_READ_META_DATA(T_, "T"); - SHERPA_ONNX_READ_META_DATA(decode_chunk_len_, "decode_chunk_len"); - - if (config_.debug) { - auto print = [](const std::vector &v, const char *name) { - std::ostringstream os; - os << name << ": "; - for (auto i : v) { - os << i << " "; - } -#if __OHOS__ - SHERPA_ONNX_LOGE("%{public}s\n", os.str().c_str()); -#else - SHERPA_ONNX_LOGE("%s\n", os.str().c_str()); -#endif - }; - print(encoder_dims_, "encoder_dims"); - print(attention_dims_, "attention_dims"); - print(num_encoder_layers_, "num_encoder_layers"); - print(cnn_module_kernels_, "cnn_module_kernels"); - print(left_context_len_, "left_context_len"); -#if __OHOS__ - SHERPA_ONNX_LOGE("T: %{public}d", T_); - SHERPA_ONNX_LOGE("decode_chunk_len_: %{public}d", decode_chunk_len_); -#else - SHERPA_ONNX_LOGE("T: %d", T_); - SHERPA_ONNX_LOGE("decode_chunk_len_: %d", decode_chunk_len_); -#endif - } -} - -void OnlineZipformerTransducerModel::InitDecoder(void *model_data, - size_t model_data_length) { - decoder_sess_ = std::make_unique(env_, model_data, - model_data_length, sess_opts_); - - GetInputNames(decoder_sess_.get(), &decoder_input_names_, - &decoder_input_names_ptr_); - - GetOutputNames(decoder_sess_.get(), &decoder_output_names_, - &decoder_output_names_ptr_); - - // get meta data - Ort::ModelMetadata meta_data = decoder_sess_->GetModelMetadata(); - if (config_.debug) { - std::ostringstream os; - os << "---decoder---\n"; - PrintModelMetadata(os, meta_data); -#if __OHOS__ - SHERPA_ONNX_LOGE("%{public}s", os.str().c_str()); -#else - SHERPA_ONNX_LOGE("%s", os.str().c_str()); -#endif - } - - Ort::AllocatorWithDefaultOptions allocator; // used in the macro below - SHERPA_ONNX_READ_META_DATA(vocab_size_, "vocab_size"); - SHERPA_ONNX_READ_META_DATA(context_size_, "context_size"); -} - -void OnlineZipformerTransducerModel::InitJoiner(void *model_data, - size_t model_data_length) { - joiner_sess_ = std::make_unique(env_, model_data, - model_data_length, sess_opts_); - - GetInputNames(joiner_sess_.get(), &joiner_input_names_, - &joiner_input_names_ptr_); - - GetOutputNames(joiner_sess_.get(), &joiner_output_names_, - &joiner_output_names_ptr_); - - // get meta data - Ort::ModelMetadata meta_data = joiner_sess_->GetModelMetadata(); - if (config_.debug) { - std::ostringstream os; - os << "---joiner---\n"; - PrintModelMetadata(os, meta_data); -#if __OHOS__ - SHERPA_ONNX_LOGE("%{public}s", os.str().c_str()); -#else - SHERPA_ONNX_LOGE("%s", os.str().c_str()); -#endif - } -} - -std::vector OnlineZipformerTransducerModel::StackStates( - const std::vector> &states) const { - int32_t batch_size = static_cast(states.size()); - int32_t num_encoders = static_cast(num_encoder_layers_.size()); - - std::vector buf(batch_size); - - std::vector ans; - ans.reserve(states[0].size()); - - auto allocator = - const_cast(this)->allocator_; - - // cached_len - for (int32_t i = 0; i != num_encoders; ++i) { - for (int32_t n = 0; n != batch_size; ++n) { - buf[n] = &states[n][i]; - } - auto v = Cat(allocator, buf, 1); // (num_layers, 1) - ans.push_back(std::move(v)); - } - - // cached_avg - for (int32_t i = 0; i != num_encoders; ++i) { - for (int32_t n = 0; n != batch_size; ++n) { - buf[n] = &states[n][num_encoders + i]; - } - auto v = Cat(allocator, buf, 1); // (num_layers, 1, encoder_dims) - ans.push_back(std::move(v)); - } - - // cached_key - for (int32_t i = 0; i != num_encoders; ++i) { - for (int32_t n = 0; n != batch_size; ++n) { - buf[n] = &states[n][num_encoders * 2 + i]; - } - // (num_layers, left_context_len, 1, attention_dims) - auto v = Cat(allocator, buf, 2); - ans.push_back(std::move(v)); - } - - // cached_val - for (int32_t i = 0; i != num_encoders; ++i) { - for (int32_t n = 0; n != batch_size; ++n) { - buf[n] = &states[n][num_encoders * 3 + i]; - } - // (num_layers, left_context_len, 1, attention_dims/2) - auto v = Cat(allocator, buf, 2); - ans.push_back(std::move(v)); - } - - // cached_val2 - for (int32_t i = 0; i != num_encoders; ++i) { - for (int32_t n = 0; n != batch_size; ++n) { - buf[n] = &states[n][num_encoders * 4 + i]; - } - // (num_layers, left_context_len, 1, attention_dims/2) - auto v = Cat(allocator, buf, 2); - ans.push_back(std::move(v)); - } - - // cached_conv1 - for (int32_t i = 0; i != num_encoders; ++i) { - for (int32_t n = 0; n != batch_size; ++n) { - buf[n] = &states[n][num_encoders * 5 + i]; - } - // (num_layers, 1, encoder_dims, cnn_module_kernels-1) - auto v = Cat(allocator, buf, 1); - ans.push_back(std::move(v)); - } - - // cached_conv2 - for (int32_t i = 0; i != num_encoders; ++i) { - for (int32_t n = 0; n != batch_size; ++n) { - buf[n] = &states[n][num_encoders * 6 + i]; - } - // (num_layers, 1, encoder_dims, cnn_module_kernels-1) - auto v = Cat(allocator, buf, 1); - ans.push_back(std::move(v)); - } - - return ans; -} - -std::vector> -OnlineZipformerTransducerModel::UnStackStates( - const std::vector &states) const { - assert(states.size() == num_encoder_layers_.size() * 7); - - int32_t batch_size = states[0].GetTensorTypeAndShapeInfo().GetShape()[1]; - int32_t num_encoders = num_encoder_layers_.size(); - - auto allocator = - const_cast(this)->allocator_; - - std::vector> ans; - ans.resize(batch_size); - - // cached_len - for (int32_t i = 0; i != num_encoders; ++i) { - auto v = Unbind(allocator, &states[i], 1); - assert(v.size() == batch_size); - - for (int32_t n = 0; n != batch_size; ++n) { - ans[n].push_back(std::move(v[n])); - } - } - - // cached_avg - for (int32_t i = num_encoders; i != 2 * num_encoders; ++i) { - auto v = Unbind(allocator, &states[i], 1); - assert(v.size() == batch_size); - - for (int32_t n = 0; n != batch_size; ++n) { - ans[n].push_back(std::move(v[n])); - } - } - - // cached_key - for (int32_t i = 2 * num_encoders; i != 3 * num_encoders; ++i) { - auto v = Unbind(allocator, &states[i], 2); - assert(v.size() == batch_size); - - for (int32_t n = 0; n != batch_size; ++n) { - ans[n].push_back(std::move(v[n])); - } - } - - // cached_val - for (int32_t i = 3 * num_encoders; i != 4 * num_encoders; ++i) { - auto v = Unbind(allocator, &states[i], 2); - assert(v.size() == batch_size); - - for (int32_t n = 0; n != batch_size; ++n) { - ans[n].push_back(std::move(v[n])); - } - } - - // cached_val2 - for (int32_t i = 4 * num_encoders; i != 5 * num_encoders; ++i) { - auto v = Unbind(allocator, &states[i], 2); - assert(v.size() == batch_size); - - for (int32_t n = 0; n != batch_size; ++n) { - ans[n].push_back(std::move(v[n])); - } - } - - // cached_conv1 - for (int32_t i = 5 * num_encoders; i != 6 * num_encoders; ++i) { - auto v = Unbind(allocator, &states[i], 1); - assert(v.size() == batch_size); - - for (int32_t n = 0; n != batch_size; ++n) { - ans[n].push_back(std::move(v[n])); - } - } - - // cached_conv2 - for (int32_t i = 6 * num_encoders; i != 7 * num_encoders; ++i) { - auto v = Unbind(allocator, &states[i], 1); - assert(v.size() == batch_size); - - for (int32_t n = 0; n != batch_size; ++n) { - ans[n].push_back(std::move(v[n])); - } - } - - return ans; -} - -std::vector OnlineZipformerTransducerModel::GetEncoderInitStates() { - // Please see - // https://github.com/k2-fsa/icefall/blob/master/egs/librispeech/ASR/pruned_transducer_stateless7_streaming/zipformer.py#L673 - // for details - - int32_t n = static_cast(encoder_dims_.size()); - std::vector cached_len_vec; - std::vector cached_avg_vec; - std::vector cached_key_vec; - std::vector cached_val_vec; - std::vector cached_val2_vec; - std::vector cached_conv1_vec; - std::vector cached_conv2_vec; - - cached_len_vec.reserve(n); - cached_avg_vec.reserve(n); - cached_key_vec.reserve(n); - cached_val_vec.reserve(n); - cached_val2_vec.reserve(n); - cached_conv1_vec.reserve(n); - cached_conv2_vec.reserve(n); - - for (int32_t i = 0; i != n; ++i) { - { - std::array s{num_encoder_layers_[i], 1}; - auto v = - Ort::Value::CreateTensor(allocator_, s.data(), s.size()); - Fill(&v, 0); - cached_len_vec.push_back(std::move(v)); - } - - { - std::array s{num_encoder_layers_[i], 1, encoder_dims_[i]}; - auto v = Ort::Value::CreateTensor(allocator_, s.data(), s.size()); - Fill(&v, 0); - cached_avg_vec.push_back(std::move(v)); - } - - { - std::array s{num_encoder_layers_[i], left_context_len_[i], 1, - attention_dims_[i]}; - auto v = Ort::Value::CreateTensor(allocator_, s.data(), s.size()); - Fill(&v, 0); - cached_key_vec.push_back(std::move(v)); - } - - { - std::array s{num_encoder_layers_[i], left_context_len_[i], 1, - attention_dims_[i] / 2}; - auto v = Ort::Value::CreateTensor(allocator_, s.data(), s.size()); - Fill(&v, 0); - cached_val_vec.push_back(std::move(v)); - } - - { - std::array s{num_encoder_layers_[i], left_context_len_[i], 1, - attention_dims_[i] / 2}; - auto v = Ort::Value::CreateTensor(allocator_, s.data(), s.size()); - Fill(&v, 0); - cached_val2_vec.push_back(std::move(v)); - } - - { - std::array s{num_encoder_layers_[i], 1, encoder_dims_[i], - cnn_module_kernels_[i] - 1}; - auto v = Ort::Value::CreateTensor(allocator_, s.data(), s.size()); - Fill(&v, 0); - cached_conv1_vec.push_back(std::move(v)); - } - - { - std::array s{num_encoder_layers_[i], 1, encoder_dims_[i], - cnn_module_kernels_[i] - 1}; - auto v = Ort::Value::CreateTensor(allocator_, s.data(), s.size()); - Fill(&v, 0); - cached_conv2_vec.push_back(std::move(v)); - } - } - - std::vector ans; - ans.reserve(n * 7); - - for (auto &v : cached_len_vec) ans.push_back(std::move(v)); - for (auto &v : cached_avg_vec) ans.push_back(std::move(v)); - for (auto &v : cached_key_vec) ans.push_back(std::move(v)); - for (auto &v : cached_val_vec) ans.push_back(std::move(v)); - for (auto &v : cached_val2_vec) ans.push_back(std::move(v)); - for (auto &v : cached_conv1_vec) ans.push_back(std::move(v)); - for (auto &v : cached_conv2_vec) ans.push_back(std::move(v)); - - return ans; -} - -std::pair> -OnlineZipformerTransducerModel::RunEncoder(Ort::Value features, - std::vector states, - Ort::Value /* processed_frames */) { - std::vector encoder_inputs; - encoder_inputs.reserve(1 + states.size()); - - encoder_inputs.push_back(std::move(features)); - for (auto &v : states) { - encoder_inputs.push_back(std::move(v)); - } - - auto encoder_out = encoder_sess_->Run( - {}, encoder_input_names_ptr_.data(), encoder_inputs.data(), - encoder_inputs.size(), encoder_output_names_ptr_.data(), - encoder_output_names_ptr_.size()); - - std::vector next_states; - next_states.reserve(states.size()); - - for (int32_t i = 1; i != static_cast(encoder_out.size()); ++i) { - next_states.push_back(std::move(encoder_out[i])); - } - - return {std::move(encoder_out[0]), std::move(next_states)}; -} - -Ort::Value OnlineZipformerTransducerModel::RunDecoder( - Ort::Value decoder_input) { - auto decoder_out = decoder_sess_->Run( - {}, decoder_input_names_ptr_.data(), &decoder_input, 1, - decoder_output_names_ptr_.data(), decoder_output_names_ptr_.size()); - return std::move(decoder_out[0]); -} - -Ort::Value OnlineZipformerTransducerModel::RunJoiner(Ort::Value encoder_out, - Ort::Value decoder_out) { - std::array joiner_input = {std::move(encoder_out), - std::move(decoder_out)}; - auto logit = - joiner_sess_->Run({}, joiner_input_names_ptr_.data(), joiner_input.data(), - joiner_input.size(), joiner_output_names_ptr_.data(), - joiner_output_names_ptr_.size()); - - return std::move(logit[0]); -} - -#if __ANDROID_API__ >= 9 -template OnlineZipformerTransducerModel::OnlineZipformerTransducerModel( - AAssetManager *mgr, const OnlineModelConfig &config); -#endif - -#if __OHOS__ -template OnlineZipformerTransducerModel::OnlineZipformerTransducerModel( - NativeResourceManager *mgr, const OnlineModelConfig &config); -#endif - -} // namespace sherpa_onnx diff --git a/audio_processing/sherpa-onnx/csrc/online-zipformer-transducer-model.h b/audio_processing/sherpa-onnx/csrc/online-zipformer-transducer-model.h deleted file mode 100644 index 9e4368a69..000000000 --- a/audio_processing/sherpa-onnx/csrc/online-zipformer-transducer-model.h +++ /dev/null @@ -1,99 +0,0 @@ -// sherpa-onnx/csrc/online-zipformer-transducer-model.h -// -// Copyright (c) 2023 Xiaomi Corporation -#ifndef SHERPA_ONNX_CSRC_ONLINE_ZIPFORMER_TRANSDUCER_MODEL_H_ -#define SHERPA_ONNX_CSRC_ONLINE_ZIPFORMER_TRANSDUCER_MODEL_H_ - -#include -#include -#include -#include - -#include "onnxruntime_cxx_api.h" // NOLINT -#include "sherpa-onnx/csrc/online-model-config.h" -#include "sherpa-onnx/csrc/online-transducer-model.h" - -namespace sherpa_onnx { - -class OnlineZipformerTransducerModel : public OnlineTransducerModel { - public: - explicit OnlineZipformerTransducerModel(const OnlineModelConfig &config); - - template - OnlineZipformerTransducerModel(Manager *mgr, const OnlineModelConfig &config); - - std::vector StackStates( - const std::vector> &states) const override; - - std::vector> UnStackStates( - const std::vector &states) const override; - - std::vector GetEncoderInitStates() override; - - std::pair> RunEncoder( - Ort::Value features, std::vector states, - Ort::Value processed_frames) override; - - Ort::Value RunDecoder(Ort::Value decoder_input) override; - - Ort::Value RunJoiner(Ort::Value encoder_out, Ort::Value decoder_out) override; - - int32_t ContextSize() const override { return context_size_; } - - int32_t ChunkSize() const override { return T_; } - - int32_t ChunkShift() const override { return decode_chunk_len_; } - - int32_t VocabSize() const override { return vocab_size_; } - OrtAllocator *Allocator() override { return allocator_; } - - private: - void InitEncoder(void *model_data, size_t model_data_length); - void InitDecoder(void *model_data, size_t model_data_length); - void InitJoiner(void *model_data, size_t model_data_length); - - private: - Ort::Env env_; - Ort::SessionOptions sess_opts_; - Ort::AllocatorWithDefaultOptions allocator_; - - std::unique_ptr encoder_sess_; - std::unique_ptr decoder_sess_; - std::unique_ptr joiner_sess_; - - std::vector encoder_input_names_; - std::vector encoder_input_names_ptr_; - - std::vector encoder_output_names_; - std::vector encoder_output_names_ptr_; - - std::vector decoder_input_names_; - std::vector decoder_input_names_ptr_; - - std::vector decoder_output_names_; - std::vector decoder_output_names_ptr_; - - std::vector joiner_input_names_; - std::vector joiner_input_names_ptr_; - - std::vector joiner_output_names_; - std::vector joiner_output_names_ptr_; - - OnlineModelConfig config_; - - std::vector encoder_dims_; - std::vector attention_dims_; - std::vector num_encoder_layers_; - std::vector cnn_module_kernels_; - std::vector left_context_len_; - - int32_t T_ = 0; - int32_t decode_chunk_len_ = 0; - - int32_t context_size_ = 0; - int32_t vocab_size_ = 0; -}; - -} // namespace sherpa_onnx - -#endif // SHERPA_ONNX_CSRC_ONLINE_ZIPFORMER_TRANSDUCER_MODEL_H_ diff --git a/audio_processing/sherpa-onnx/csrc/online-zipformer2-ctc-model-config.cc b/audio_processing/sherpa-onnx/csrc/online-zipformer2-ctc-model-config.cc deleted file mode 100644 index ed9e7b8a9..000000000 --- a/audio_processing/sherpa-onnx/csrc/online-zipformer2-ctc-model-config.cc +++ /dev/null @@ -1,42 +0,0 @@ -// sherpa-onnx/csrc/online-zipformer2-ctc-model-config.cc -// -// Copyright (c) 2023 Xiaomi Corporation - -#include "sherpa-onnx/csrc/online-zipformer2-ctc-model-config.h" - -#include "sherpa-onnx/csrc/file-utils.h" -#include "sherpa-onnx/csrc/macros.h" - -namespace sherpa_onnx { - -void OnlineZipformer2CtcModelConfig::Register(ParseOptions *po) { - po->Register("zipformer2-ctc-model", &model, - "Path to CTC model.onnx. See also " - "https://github.com/k2-fsa/icefall/pull/1413"); -} - -bool OnlineZipformer2CtcModelConfig::Validate() const { - if (model.empty()) { - SHERPA_ONNX_LOGE("--zipformer2-ctc-model is empty!"); - return false; - } - - if (!FileExists(model)) { - SHERPA_ONNX_LOGE("--zipformer2-ctc-model '%s' does not exist", - model.c_str()); - return false; - } - - return true; -} - -std::string OnlineZipformer2CtcModelConfig::ToString() const { - std::ostringstream os; - - os << "OnlineZipformer2CtcModelConfig("; - os << "model=\"" << model << "\")"; - - return os.str(); -} - -} // namespace sherpa_onnx diff --git a/audio_processing/sherpa-onnx/csrc/online-zipformer2-ctc-model-config.h b/audio_processing/sherpa-onnx/csrc/online-zipformer2-ctc-model-config.h deleted file mode 100644 index 18115c8fe..000000000 --- a/audio_processing/sherpa-onnx/csrc/online-zipformer2-ctc-model-config.h +++ /dev/null @@ -1,29 +0,0 @@ -// sherpa-onnx/csrc/online-zipformer2-ctc-model-config.h -// -// Copyright (c) 2023 Xiaomi Corporation -#ifndef SHERPA_ONNX_CSRC_ONLINE_ZIPFORMER2_CTC_MODEL_CONFIG_H_ -#define SHERPA_ONNX_CSRC_ONLINE_ZIPFORMER2_CTC_MODEL_CONFIG_H_ - -#include - -#include "sherpa-onnx/csrc/parse-options.h" - -namespace sherpa_onnx { - -struct OnlineZipformer2CtcModelConfig { - std::string model; - - OnlineZipformer2CtcModelConfig() = default; - - explicit OnlineZipformer2CtcModelConfig(const std::string &model) - : model(model) {} - - void Register(ParseOptions *po); - bool Validate() const; - - std::string ToString() const; -}; - -} // namespace sherpa_onnx - -#endif // SHERPA_ONNX_CSRC_ONLINE_ZIPFORMER2_CTC_MODEL_CONFIG_H_ diff --git a/audio_processing/sherpa-onnx/csrc/online-zipformer2-ctc-model.cc b/audio_processing/sherpa-onnx/csrc/online-zipformer2-ctc-model.cc deleted file mode 100644 index f7cccc434..000000000 --- a/audio_processing/sherpa-onnx/csrc/online-zipformer2-ctc-model.cc +++ /dev/null @@ -1,494 +0,0 @@ -// sherpa-onnx/csrc/online-zipformer2-ctc-model.cc -// -// Copyright (c) 2023 Xiaomi Corporation - -#include "sherpa-onnx/csrc/online-zipformer2-ctc-model.h" - -#include -#include -#include -#include -#include - -#if __ANDROID_API__ >= 9 -#include "android/asset_manager.h" -#include "android/asset_manager_jni.h" -#endif - -#if __OHOS__ -#include "rawfile/raw_file_manager.h" -#endif - -#include "sherpa-onnx/csrc/cat.h" -#include "sherpa-onnx/csrc/file-utils.h" -#include "sherpa-onnx/csrc/macros.h" -#include "sherpa-onnx/csrc/onnx-utils.h" -#include "sherpa-onnx/csrc/session.h" -#include "sherpa-onnx/csrc/text-utils.h" -#include "sherpa-onnx/csrc/unbind.h" - -namespace sherpa_onnx { - -class OnlineZipformer2CtcModel::Impl { - public: - explicit Impl(const OnlineModelConfig &config) - : config_(config), - env_(ORT_LOGGING_LEVEL_ERROR), - sess_opts_(GetSessionOptions(config)), - allocator_{} { - { - auto buf = ReadFile(config.zipformer2_ctc.model); - Init(buf.data(), buf.size()); - } - } - - template - Impl(Manager *mgr, const OnlineModelConfig &config) - : config_(config), - env_(ORT_LOGGING_LEVEL_ERROR), - sess_opts_(GetSessionOptions(config)), - allocator_{} { - { - auto buf = ReadFile(mgr, config.zipformer2_ctc.model); - Init(buf.data(), buf.size()); - } - } - - std::vector Forward(Ort::Value features, - std::vector states) { - std::vector inputs; - inputs.reserve(1 + states.size()); - - inputs.push_back(std::move(features)); - for (auto &v : states) { - inputs.push_back(std::move(v)); - } - - return sess_->Run({}, input_names_ptr_.data(), inputs.data(), inputs.size(), - output_names_ptr_.data(), output_names_ptr_.size()); - } - - int32_t VocabSize() const { return vocab_size_; } - - int32_t ChunkLength() const { return T_; } - - int32_t ChunkShift() const { return decode_chunk_len_; } - - bool UseWhisperFeature() const { return use_whisper_feature_; } - - OrtAllocator *Allocator() { return allocator_; } - - // Return a vector containing 3 tensors - // - attn_cache - // - conv_cache - // - offset - std::vector GetInitStates() { - std::vector ans; - ans.reserve(initial_states_.size()); - for (auto &s : initial_states_) { - ans.push_back(View(&s)); - } - return ans; - } - - std::vector StackStates( - std::vector> states) { - int32_t batch_size = static_cast(states.size()); - - std::vector buf(batch_size); - - std::vector ans; - int32_t num_states = static_cast(states[0].size()); - ans.reserve(num_states); - - for (int32_t i = 0; i != (num_states - 2) / 6; ++i) { - { - for (int32_t n = 0; n != batch_size; ++n) { - buf[n] = &states[n][6 * i]; - } - auto v = Cat(allocator_, buf, 1); - ans.push_back(std::move(v)); - } - { - for (int32_t n = 0; n != batch_size; ++n) { - buf[n] = &states[n][6 * i + 1]; - } - auto v = Cat(allocator_, buf, 1); - ans.push_back(std::move(v)); - } - { - for (int32_t n = 0; n != batch_size; ++n) { - buf[n] = &states[n][6 * i + 2]; - } - auto v = Cat(allocator_, buf, 1); - ans.push_back(std::move(v)); - } - { - for (int32_t n = 0; n != batch_size; ++n) { - buf[n] = &states[n][6 * i + 3]; - } - auto v = Cat(allocator_, buf, 1); - ans.push_back(std::move(v)); - } - { - for (int32_t n = 0; n != batch_size; ++n) { - buf[n] = &states[n][6 * i + 4]; - } - auto v = Cat(allocator_, buf, 0); - ans.push_back(std::move(v)); - } - { - for (int32_t n = 0; n != batch_size; ++n) { - buf[n] = &states[n][6 * i + 5]; - } - auto v = Cat(allocator_, buf, 0); - ans.push_back(std::move(v)); - } - } - - { - for (int32_t n = 0; n != batch_size; ++n) { - buf[n] = &states[n][num_states - 2]; - } - auto v = Cat(allocator_, buf, 0); - ans.push_back(std::move(v)); - } - - { - for (int32_t n = 0; n != batch_size; ++n) { - buf[n] = &states[n][num_states - 1]; - } - auto v = Cat(allocator_, buf, 0); - ans.push_back(std::move(v)); - } - return ans; - } - - std::vector> UnStackStates( - std::vector states) { - int32_t m = std::accumulate(num_encoder_layers_.begin(), - num_encoder_layers_.end(), 0); - assert(states.size() == m * 6 + 2); - - int32_t batch_size = states[0].GetTensorTypeAndShapeInfo().GetShape()[1]; - - std::vector> ans; - ans.resize(batch_size); - - for (int32_t i = 0; i != m; ++i) { - { - auto v = Unbind(allocator_, &states[i * 6], 1); - assert(v.size() == batch_size); - - for (int32_t n = 0; n != batch_size; ++n) { - ans[n].push_back(std::move(v[n])); - } - } - { - auto v = Unbind(allocator_, &states[i * 6 + 1], 1); - assert(v.size() == batch_size); - - for (int32_t n = 0; n != batch_size; ++n) { - ans[n].push_back(std::move(v[n])); - } - } - { - auto v = Unbind(allocator_, &states[i * 6 + 2], 1); - assert(v.size() == batch_size); - - for (int32_t n = 0; n != batch_size; ++n) { - ans[n].push_back(std::move(v[n])); - } - } - { - auto v = Unbind(allocator_, &states[i * 6 + 3], 1); - assert(v.size() == batch_size); - - for (int32_t n = 0; n != batch_size; ++n) { - ans[n].push_back(std::move(v[n])); - } - } - { - auto v = Unbind(allocator_, &states[i * 6 + 4], 0); - assert(v.size() == batch_size); - - for (int32_t n = 0; n != batch_size; ++n) { - ans[n].push_back(std::move(v[n])); - } - } - { - auto v = Unbind(allocator_, &states[i * 6 + 5], 0); - assert(v.size() == batch_size); - - for (int32_t n = 0; n != batch_size; ++n) { - ans[n].push_back(std::move(v[n])); - } - } - } - - { - auto v = Unbind(allocator_, &states[m * 6], 0); - assert(v.size() == batch_size); - - for (int32_t n = 0; n != batch_size; ++n) { - ans[n].push_back(std::move(v[n])); - } - } - { - auto v = Unbind(allocator_, &states[m * 6 + 1], 0); - assert(v.size() == batch_size); - - for (int32_t n = 0; n != batch_size; ++n) { - ans[n].push_back(std::move(v[n])); - } - } - - return ans; - } - - private: - void Init(void *model_data, size_t model_data_length) { - sess_ = std::make_unique(env_, model_data, model_data_length, - sess_opts_); - - GetInputNames(sess_.get(), &input_names_, &input_names_ptr_); - - GetOutputNames(sess_.get(), &output_names_, &output_names_ptr_); - - // get meta data - Ort::ModelMetadata meta_data = sess_->GetModelMetadata(); - if (config_.debug) { - std::ostringstream os; - os << "---zipformer2_ctc---\n"; - PrintModelMetadata(os, meta_data); -#if __OHOS__ - SHERPA_ONNX_LOGE("%{public}s", os.str().c_str()); -#else - SHERPA_ONNX_LOGE("%s", os.str().c_str()); -#endif - } - - Ort::AllocatorWithDefaultOptions allocator; // used in the macro below - SHERPA_ONNX_READ_META_DATA_VEC(encoder_dims_, "encoder_dims"); - SHERPA_ONNX_READ_META_DATA_VEC(query_head_dims_, "query_head_dims"); - SHERPA_ONNX_READ_META_DATA_VEC(value_head_dims_, "value_head_dims"); - SHERPA_ONNX_READ_META_DATA_VEC(num_heads_, "num_heads"); - SHERPA_ONNX_READ_META_DATA_VEC(num_encoder_layers_, "num_encoder_layers"); - SHERPA_ONNX_READ_META_DATA_VEC(cnn_module_kernels_, "cnn_module_kernels"); - SHERPA_ONNX_READ_META_DATA_VEC(left_context_len_, "left_context_len"); - - SHERPA_ONNX_READ_META_DATA(T_, "T"); - SHERPA_ONNX_READ_META_DATA(decode_chunk_len_, "decode_chunk_len"); - - std::string feature_type; - SHERPA_ONNX_READ_META_DATA_STR_WITH_DEFAULT(feature_type, "feature", ""); - if (feature_type == "whisper") { - use_whisper_feature_ = true; - } - - { - auto shape = - sess_->GetOutputTypeInfo(0).GetTensorTypeAndShapeInfo().GetShape(); - vocab_size_ = shape[2]; - } - - if (config_.debug) { - auto print = [](const std::vector &v, const char *name) { - std::ostringstream os; - os << name << ": "; - for (auto i : v) { - os << i << " "; - } - SHERPA_ONNX_LOGE("%s\n", os.str().c_str()); - }; - print(encoder_dims_, "encoder_dims"); - print(query_head_dims_, "query_head_dims"); - print(value_head_dims_, "value_head_dims"); - print(num_heads_, "num_heads"); - print(num_encoder_layers_, "num_encoder_layers"); - print(cnn_module_kernels_, "cnn_module_kernels"); - print(left_context_len_, "left_context_len"); - SHERPA_ONNX_LOGE("T: %d", T_); - SHERPA_ONNX_LOGE("decode_chunk_len_: %d", decode_chunk_len_); - SHERPA_ONNX_LOGE("vocab_size_: %d", vocab_size_); - } - - InitStates(); - } - - void InitStates() { - int32_t n = static_cast(encoder_dims_.size()); - int32_t m = std::accumulate(num_encoder_layers_.begin(), - num_encoder_layers_.end(), 0); - initial_states_.reserve(m * 6 + 2); - - for (int32_t i = 0; i != n; ++i) { - int32_t num_layers = num_encoder_layers_[i]; - int32_t key_dim = query_head_dims_[i] * num_heads_[i]; - int32_t value_dim = value_head_dims_[i] * num_heads_[i]; - int32_t nonlin_attn_head_dim = 3 * encoder_dims_[i] / 4; - - for (int32_t j = 0; j != num_layers; ++j) { - { - std::array s{left_context_len_[i], 1, key_dim}; - auto v = - Ort::Value::CreateTensor(allocator_, s.data(), s.size()); - Fill(&v, 0); - initial_states_.push_back(std::move(v)); - } - - { - std::array s{1, 1, left_context_len_[i], - nonlin_attn_head_dim}; - auto v = - Ort::Value::CreateTensor(allocator_, s.data(), s.size()); - Fill(&v, 0); - initial_states_.push_back(std::move(v)); - } - - { - std::array s{left_context_len_[i], 1, value_dim}; - auto v = - Ort::Value::CreateTensor(allocator_, s.data(), s.size()); - Fill(&v, 0); - initial_states_.push_back(std::move(v)); - } - - { - std::array s{left_context_len_[i], 1, value_dim}; - auto v = - Ort::Value::CreateTensor(allocator_, s.data(), s.size()); - Fill(&v, 0); - initial_states_.push_back(std::move(v)); - } - - { - std::array s{1, encoder_dims_[i], - cnn_module_kernels_[i] / 2}; - auto v = - Ort::Value::CreateTensor(allocator_, s.data(), s.size()); - Fill(&v, 0); - initial_states_.push_back(std::move(v)); - } - - { - std::array s{1, encoder_dims_[i], - cnn_module_kernels_[i] / 2}; - auto v = - Ort::Value::CreateTensor(allocator_, s.data(), s.size()); - Fill(&v, 0); - initial_states_.push_back(std::move(v)); - } - } - } - - { - std::array s{1, 128, 3, 19}; - auto v = Ort::Value::CreateTensor(allocator_, s.data(), s.size()); - Fill(&v, 0); - initial_states_.push_back(std::move(v)); - } - - { - std::array s{1}; - auto v = - Ort::Value::CreateTensor(allocator_, s.data(), s.size()); - Fill(&v, 0); - initial_states_.push_back(std::move(v)); - } - } - - private: - OnlineModelConfig config_; - Ort::Env env_; - Ort::SessionOptions sess_opts_; - Ort::AllocatorWithDefaultOptions allocator_; - - std::unique_ptr sess_; - - std::vector input_names_; - std::vector input_names_ptr_; - - std::vector output_names_; - std::vector output_names_ptr_; - - std::vector initial_states_; - - std::vector encoder_dims_; - std::vector query_head_dims_; - std::vector value_head_dims_; - std::vector num_heads_; - std::vector num_encoder_layers_; - std::vector cnn_module_kernels_; - std::vector left_context_len_; - - int32_t T_ = 0; - int32_t decode_chunk_len_ = 0; - int32_t vocab_size_ = 0; - - // for models from - // https://github.com/k2-fsa/icefall/blob/master/egs/multi_zh-hans/ASR/RESULTS.md#streaming-with-ctc-head - bool use_whisper_feature_ = false; -}; - -OnlineZipformer2CtcModel::OnlineZipformer2CtcModel( - const OnlineModelConfig &config) - : impl_(std::make_unique(config)) {} - -template -OnlineZipformer2CtcModel::OnlineZipformer2CtcModel( - Manager *mgr, const OnlineModelConfig &config) - : impl_(std::make_unique(mgr, config)) {} - -OnlineZipformer2CtcModel::~OnlineZipformer2CtcModel() = default; - -std::vector OnlineZipformer2CtcModel::Forward( - Ort::Value x, std::vector states) const { - return impl_->Forward(std::move(x), std::move(states)); -} - -int32_t OnlineZipformer2CtcModel::VocabSize() const { - return impl_->VocabSize(); -} - -int32_t OnlineZipformer2CtcModel::ChunkLength() const { - return impl_->ChunkLength(); -} - -int32_t OnlineZipformer2CtcModel::ChunkShift() const { - return impl_->ChunkShift(); -} - -bool OnlineZipformer2CtcModel::UseWhisperFeature() const { - return impl_->UseWhisperFeature(); -} - -OrtAllocator *OnlineZipformer2CtcModel::Allocator() const { - return impl_->Allocator(); -} - -std::vector OnlineZipformer2CtcModel::GetInitStates() const { - return impl_->GetInitStates(); -} - -std::vector OnlineZipformer2CtcModel::StackStates( - std::vector> states) const { - return impl_->StackStates(std::move(states)); -} - -std::vector> OnlineZipformer2CtcModel::UnStackStates( - std::vector states) const { - return impl_->UnStackStates(std::move(states)); -} - -#if __ANDROID_API__ >= 9 -template OnlineZipformer2CtcModel::OnlineZipformer2CtcModel( - AAssetManager *mgr, const OnlineModelConfig &config); -#endif - -#if __OHOS__ -template OnlineZipformer2CtcModel::OnlineZipformer2CtcModel( - NativeResourceManager *mgr, const OnlineModelConfig &config); -#endif - -} // namespace sherpa_onnx diff --git a/audio_processing/sherpa-onnx/csrc/online-zipformer2-ctc-model.h b/audio_processing/sherpa-onnx/csrc/online-zipformer2-ctc-model.h deleted file mode 100644 index 3cbd4cc7a..000000000 --- a/audio_processing/sherpa-onnx/csrc/online-zipformer2-ctc-model.h +++ /dev/null @@ -1,76 +0,0 @@ -// sherpa-onnx/csrc/online-zipformer2-ctc-model.h -// -// Copyright (c) 2023 Xiaomi Corporation -#ifndef SHERPA_ONNX_CSRC_ONLINE_ZIPFORMER2_CTC_MODEL_H_ -#define SHERPA_ONNX_CSRC_ONLINE_ZIPFORMER2_CTC_MODEL_H_ - -#include -#include -#include - -#include "onnxruntime_cxx_api.h" // NOLINT -#include "sherpa-onnx/csrc/online-ctc-model.h" -#include "sherpa-onnx/csrc/online-model-config.h" - -namespace sherpa_onnx { - -class OnlineZipformer2CtcModel : public OnlineCtcModel { - public: - explicit OnlineZipformer2CtcModel(const OnlineModelConfig &config); - - template - OnlineZipformer2CtcModel(Manager *mgr, const OnlineModelConfig &config); - - ~OnlineZipformer2CtcModel() override; - - // A list of tensors. - // See also - // https://github.com/k2-fsa/icefall/pull/1413 - // and - // https://github.com/k2-fsa/icefall/pull/1415 - std::vector GetInitStates() const override; - - std::vector StackStates( - std::vector> states) const override; - - std::vector> UnStackStates( - std::vector states) const override; - - /** - * - * @param x A 3-D tensor of shape (N, T, C). N has to be 1. - * @param states It is from GetInitStates() or returned from this method. - * - * @return Return a list of tensors - * - ans[0] contains log_probs, of shape (N, T, C) - * - ans[1:] contains next_states - */ - std::vector Forward( - Ort::Value x, std::vector states) const override; - - /** Return the vocabulary size of the model - */ - int32_t VocabSize() const override; - - /** Return an allocator for allocating memory - */ - OrtAllocator *Allocator() const override; - - // The model accepts this number of frames before subsampling as input - int32_t ChunkLength() const override; - - // Similar to frame_shift in feature extractor, after processing - // ChunkLength() frames, we advance by ChunkShift() frames - // before we process the next chunk. - int32_t ChunkShift() const override; - - bool UseWhisperFeature() const override; - - private: - class Impl; - std::unique_ptr impl_; -}; - -} // namespace sherpa_onnx - -#endif // SHERPA_ONNX_CSRC_ONLINE_ZIPFORMER2_CTC_MODEL_H_