diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index 75651b690..26a47c478 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -29,10 +29,10 @@ jobs:
cp -r docs/_build/html/* public/en/
mkdir public/m2met2
touch public/m2met2/.nojekyll
- cp -r docs_m2met2/_build/html/* public/m2met2/
+ cp -r docs/m2met2/_build/html/* public/m2met2/
mkdir public/m2met2_cn
touch public/m2met2_cn/.nojekyll
- cp -r docs_m2met2_cn/_build/html/* public/m2met2_cn/
+ cp -r docs/m2met2_cn/_build/html/* public/m2met2_cn/
- name: deploy github.io pages
if: github.ref == 'refs/heads/main' || github.ref == 'refs/heads/dev_wjm' || github.ref == 'refs/heads/dev_lyh'
diff --git a/README.md b/README.md
index 48b5ccdf8..665f42592 100644
--- a/README.md
+++ b/README.md
@@ -18,14 +18,12 @@
| [**Runtime**](https://github.com/alibaba-damo-academy/FunASR/tree/main/funasr/runtime)
| [**Model Zoo**](https://github.com/alibaba-damo-academy/FunASR/blob/main/docs/modelscope_models.md)
| [**Contact**](#contact)
-|
-[**M2MET2.0 Guidence_CN**](https://alibaba-damo-academy.github.io/FunASR/m2met2_cn/index.html)
-| [**M2MET2.0 Guidence_EN**](https://alibaba-damo-academy.github.io/FunASR/m2met2/index.html)
+| [**M2MET2.0 Challenge**](https://github.com/alibaba-damo-academy/FunASR#multi-channel-multi-party-meeting-transcription-20-m2met20-challenge)
-## Multi-Channel Multi-Party Meeting Transcription 2.0 (M2MET2.0) Challenge
-We are pleased to announce that the M2MeT2.0 challenge will be held in the near future. The baseline system is conducted on FunASR and is provided as a receipe of AliMeeting corpus. For more details you can see the guidence of M2MET2.0 ([CN](https://alibaba-damo-academy.github.io/FunASR/m2met2_cn/index.html)/[EN](https://alibaba-damo-academy.github.io/FunASR/m2met2/index.html)).
## What's new:
-
+### Multi-Channel Multi-Party Meeting Transcription 2.0 (M2MET2.0) Challenge
+We are pleased to announce that the M2MeT2.0 challenge will be held in the near future. The baseline system is conducted on FunASR and is provided as a receipe of AliMeeting corpus. For more details you can see the guidence of M2MET2.0 ([CN](https://alibaba-damo-academy.github.io/FunASR/m2met2_cn/index.html)/[EN](https://alibaba-damo-academy.github.io/FunASR/m2met2/index.html)).
+### Release notes
For the release notes, please ref to [news](https://github.com/alibaba-damo-academy/FunASR/releases)
## Highlights
diff --git a/docs_m2met2/Baseline.md b/docs/m2met2/Baseline.md
similarity index 100%
rename from docs_m2met2/Baseline.md
rename to docs/m2met2/Baseline.md
diff --git a/docs_m2met2/Contact.md b/docs/m2met2/Contact.md
similarity index 100%
rename from docs_m2met2/Contact.md
rename to docs/m2met2/Contact.md
diff --git a/docs_m2met2/Dataset.md b/docs/m2met2/Dataset.md
similarity index 92%
rename from docs_m2met2/Dataset.md
rename to docs/m2met2/Dataset.md
index c987acac9..a897d673b 100644
--- a/docs_m2met2/Dataset.md
+++ b/docs/m2met2/Dataset.md
@@ -2,7 +2,7 @@
## Overview of training data
In the fixed training condition, the training dataset is restricted to three publicly available corpora, namely, AliMeeting, AISHELL-4, and CN-Celeb. To evaluate the performance of the models trained on these datasets, we will release a new Test set called Test-2023 for scoring and ranking. We will describe the AliMeeting dataset and the Test-2023 set in detail.
## Detail of AliMeeting corpus
-AliMeeting contains 118.75 hours of speech data in total. The dataset is divided into 104.75 hours for training (Train), 4 hours for evaluation (Eval) and 10 hours as test set (Test) for scoring and ranking. Specifically, the Train and Eval sets contain 212 and 8 sessions, respectively. Each session consists of a 15 to 30-minute discussion by a group of participants. The total number of participants in Train and Eval sets is 456 and 25, respectively, with balanced gender coverage.
+AliMeeting contains 118.75 hours of speech data in total. The dataset is divided into 104.75 hours for training (Train), 4 hours for evaluation (Eval) and 10 hours as test set (Test) for scoring and ranking. Specifically, the Train, Eval and Test sets contain 212, 8 and 20 sessions, respectively. Each session consists of a 15 to 30-minute discussion by a group of participants. The total number of participants in Train, Eval and Test sets is 456, 25 and 60, respectively, with balanced gender coverage.
The dataset is collected in 13 meeting venues, which are categorized into three types: small, medium, and large rooms with sizes ranging from 8 m$^{2}$ to 55 m$^{2}$. Different rooms give us a variety of acoustic properties and layouts. The detailed parameters of each meeting venue will be released together with the Train data. The type of wall material of the meeting venues covers cement, glass, etc. Other furnishings in meeting venues include sofa, TV, blackboard, fan, air conditioner, plants, etc. During recording, the participants of the meeting sit around the microphone array which is placed on the table and conduct a natural conversation. The microphone-speaker distance ranges from 0.3 m to 5.0 m. All participants are native Chinese speakers speaking Mandarin without strong accents. During the meeting, various kinds of indoor noise including but not limited to clicking, keyboard, door opening/closing, fan, bubble noise, etc., are made naturally. For both Train and Eval sets, the participants are required to remain in the same position during recording. There is no speaker overlap between the Train and Eval set. An example of the recording venue from the Train set is shown in Fig 1.
diff --git a/docs_m2met2/Introduction.md b/docs/m2met2/Introduction.md
similarity index 82%
rename from docs_m2met2/Introduction.md
rename to docs/m2met2/Introduction.md
index e1f9fc792..eac9eb6b5 100644
--- a/docs_m2met2/Introduction.md
+++ b/docs/m2met2/Introduction.md
@@ -9,17 +9,20 @@ The ICASSP2022 M2MeT challenge focuses on meeting scenarios, and it comprises tw
Building on the success of the previous M2MeT challenge, we are excited to propose the M2MeT2.0 challenge as an ASRU2023 challenge special session. In the original M2MeT challenge, the evaluation metric was speaker-independent, which meant that the transcription could be determined, but not the corresponding speaker. To address this limitation and further advance the current multi-talker ASR system towards practicality, the M2MeT2.0 challenge proposes the speaker-attributed ASR task with two sub-tracks: fixed and open training conditions. The speaker-attribute automatic speech recognition (ASR) task aims to tackle the practical and challenging problem of identifying "who spoke what at when". To facilitate reproducible research in this field, we offer a comprehensive overview of the dataset, rules, evaluation metrics, and baseline systems. Furthermore, we will release a carefully curated test set, comprising approximately 10 hours of audio, according to the timeline. The new test set is designed to enable researchers to validate and compare their models' performance and advance the state of the art in this area.
## Timeline(AOE Time)
-
-- $ May~5^{th}, 2023: $ Registration deadline, the due date for participants to join the Challenge.
-- $ June~9^{th}, 2023: $ Test data release.
-- $ June~13^{rd}, 2023: $ Final submission deadline.
-- $ June~19^{th}, 2023: $ Evaluation result and ranking release.
-- $ July~3^{rd}, 2023: $ Deadline for paper submission.
-- $ July~10^{th}, 2023: $ Deadline for final paper submission.
-- $ December~12^{nd}\ to\ 16^{th}, 2023: $ ASRU Workshop
+- $ April~29, 2023: $ Challenge and registration open.
+- $ May~8, 2023: $ Baseline release.
+- $ May~15, 2023: $ Registration deadline, the due date for participants to join the Challenge.
+- $ June~9, 2023: $ Test data release and leaderboard open.
+- $ June~13, 2023: $ Final submission deadline.
+- $ June~19, 2023: $ Evaluation result and ranking release.
+- $ July~3, 2023: $ Deadline for paper submission.
+- $ July~10, 2023: $ Deadline for final paper submission.
+- $ December~12\ to\ 16, 2023: $ ASRU Workshop and challenge session
## Guidelines
-Interested participants, whether from academia or industry, must register for the challenge by completing a Google form, which will be available here. The deadline for registration is May 5, 2023.
+Interested participants, whether from academia or industry, must register for the challenge by completing the Google form below. The deadline for registration is May 15, 2023.
+
+[M2MET2.0 Registration](https://docs.google.com/forms/d/e/1FAIpQLSf77T9vAl7Ym-u5g8gXu18SBofoWRaFShBo26Ym0-HDxHW9PQ/viewform?usp=sf_link)
Within three working days, the challenge organizer will send email invitations to eligible teams to participate in the challenge. All qualified teams are required to adhere to the challenge rules, which will be published on the challenge page. Prior to the ranking release time, each participant must submit a system description document detailing their approach and methods. The organizer will select the top three submissions to be included in the ASRU2023 Proceedings.
diff --git a/docs_m2met2/Makefile b/docs/m2met2/Makefile
similarity index 100%
rename from docs_m2met2/Makefile
rename to docs/m2met2/Makefile
diff --git a/docs_m2met2/Organizers.md b/docs/m2met2/Organizers.md
similarity index 100%
rename from docs_m2met2/Organizers.md
rename to docs/m2met2/Organizers.md
diff --git a/docs_m2met2/Rules.md b/docs/m2met2/Rules.md
similarity index 92%
rename from docs_m2met2/Rules.md
rename to docs/m2met2/Rules.md
index 8bc1a1900..340c2f50d 100644
--- a/docs_m2met2/Rules.md
+++ b/docs/m2met2/Rules.md
@@ -4,8 +4,6 @@ All participants should adhere to the following rules to be eligible for the cha
- Data augmentation is allowed on the original training dataset, including, but not limited to, adding noise or reverberation, speed perturbation and tone change.
- Participants are permitted to use the Eval set for model training, but it is not allowed to use the Test set for this purpose. Instead, the Test set should only be utilized for parameter tuning and model selection. Any use of the Test-2023 dataset that violates these rules is strictly prohibited, including but not limited to the use of the Test set for fine-tuning or training the model.
-
-- Multi-system fusion is allowed, but the systems with same structure and different parameters is not encouraged.
- If the cpCER of the two systems on the Test dataset are the same, the system with lower computation complexity will be judged as the superior one.
diff --git a/docs_m2met2/Track_setting_and_evaluation.md b/docs/m2met2/Track_setting_and_evaluation.md
similarity index 95%
rename from docs_m2met2/Track_setting_and_evaluation.md
rename to docs/m2met2/Track_setting_and_evaluation.md
index b90c17af1..2b75fcac5 100644
--- a/docs_m2met2/Track_setting_and_evaluation.md
+++ b/docs/m2met2/Track_setting_and_evaluation.md
@@ -1,6 +1,6 @@
# Track & Evaluation
-## Speaker-Attributed ASR (Main Track)
-The speaker-attributed ASR task poses a unique challenge of transcribing speech from multiple speakers and assigning a speaker label to the transcription. Figure 2 illustrates the difference between the speaker-attributed ASR task and the multi-speaker ASR task. This track allows for the use of the AliMeeting, Aishell4, and Cn-Celeb datasets as constrained data sources during both training and evaluation. The AliMeeting dataset, which was used in the M2MeT challenge, includes Train, Eval, and Test sets. Additionally, a new Test-2023 set, consisting of approximately 10 hours of meeting data recorded in an identical acoustic setting as the AliMeeting corpus, will be released soon for challenge scoring and ranking. It's worth noting that the organizers will not provide the near-field audio, transcriptions, or oracle timestamps. Instead, segments containing multiple speakers will be provided on the Test-2023 set, which can be obtained using a simple voice activity detection (VAD) model.
+## Speaker-Attributed ASR
+The speaker-attributed ASR task poses a unique challenge of transcribing speech from multiple speakers and assigning a speaker label to the transcription. Figure 2 illustrates the difference between the speaker-attributed ASR task and the multi-speaker ASR task. This track allows for the use of the AliMeeting, Aishell4, and Cn-Celeb datasets as constrained data sources during both training and evaluation. The AliMeeting dataset, which was used in the M2MeT challenge, includes Train, Eval, and Test sets. Additionally, a new Test-2023 set, consisting of approximately 10 hours of meeting data recorded in an identical acoustic setting as the AliMeeting corpus, will be released soon for challenge scoring and ranking. It's worth noting that the organizers will not provide the near-field audio, transcriptions, or oracle timestamps of the Test-2023 set. Instead, segments containing multiple speakers will be provided, which can be obtained using a simple voice activity detection (VAD) model.

diff --git a/docs_m2met2/_build/doctrees/Baseline.doctree b/docs/m2met2/_build/doctrees/Baseline.doctree
similarity index 50%
rename from docs_m2met2/_build/doctrees/Baseline.doctree
rename to docs/m2met2/_build/doctrees/Baseline.doctree
index c30687bab..9fc7c50bc 100644
Binary files a/docs_m2met2/_build/doctrees/Baseline.doctree and b/docs/m2met2/_build/doctrees/Baseline.doctree differ
diff --git a/docs_m2met2/_build/doctrees/Contact.doctree b/docs/m2met2/_build/doctrees/Contact.doctree
similarity index 62%
rename from docs_m2met2/_build/doctrees/Contact.doctree
rename to docs/m2met2/_build/doctrees/Contact.doctree
index bed2f74c5..e3f579ff5 100644
Binary files a/docs_m2met2/_build/doctrees/Contact.doctree and b/docs/m2met2/_build/doctrees/Contact.doctree differ
diff --git a/docs_m2met2/_build/doctrees/Dataset.doctree b/docs/m2met2/_build/doctrees/Dataset.doctree
similarity index 63%
rename from docs_m2met2/_build/doctrees/Dataset.doctree
rename to docs/m2met2/_build/doctrees/Dataset.doctree
index 841452cfb..47c8bb491 100644
Binary files a/docs_m2met2/_build/doctrees/Dataset.doctree and b/docs/m2met2/_build/doctrees/Dataset.doctree differ
diff --git a/docs/m2met2/_build/doctrees/Introduction.doctree b/docs/m2met2/_build/doctrees/Introduction.doctree
new file mode 100644
index 000000000..84f1baaa6
Binary files /dev/null and b/docs/m2met2/_build/doctrees/Introduction.doctree differ
diff --git a/docs/m2met2/_build/doctrees/Organizers.doctree b/docs/m2met2/_build/doctrees/Organizers.doctree
new file mode 100644
index 000000000..0f571a3b7
Binary files /dev/null and b/docs/m2met2/_build/doctrees/Organizers.doctree differ
diff --git a/docs/m2met2/_build/doctrees/Rules.doctree b/docs/m2met2/_build/doctrees/Rules.doctree
new file mode 100644
index 000000000..5b7655f68
Binary files /dev/null and b/docs/m2met2/_build/doctrees/Rules.doctree differ
diff --git a/docs_m2met2/_build/doctrees/Track_setting_and_evaluation.doctree b/docs/m2met2/_build/doctrees/Track_setting_and_evaluation.doctree
similarity index 76%
rename from docs_m2met2/_build/doctrees/Track_setting_and_evaluation.doctree
rename to docs/m2met2/_build/doctrees/Track_setting_and_evaluation.doctree
index 12d3c2bc1..8770fba7c 100644
Binary files a/docs_m2met2/_build/doctrees/Track_setting_and_evaluation.doctree and b/docs/m2met2/_build/doctrees/Track_setting_and_evaluation.doctree differ
diff --git a/docs_m2met2/_build/doctrees/environment.pickle b/docs/m2met2/_build/doctrees/environment.pickle
similarity index 71%
rename from docs_m2met2/_build/doctrees/environment.pickle
rename to docs/m2met2/_build/doctrees/environment.pickle
index 57b88c870..ea9c740c1 100644
Binary files a/docs_m2met2/_build/doctrees/environment.pickle and b/docs/m2met2/_build/doctrees/environment.pickle differ
diff --git a/docs/m2met2/_build/doctrees/index.doctree b/docs/m2met2/_build/doctrees/index.doctree
new file mode 100644
index 000000000..f40d4fe78
Binary files /dev/null and b/docs/m2met2/_build/doctrees/index.doctree differ
diff --git a/docs_m2met2/_build/html/.buildinfo b/docs/m2met2/_build/html/.buildinfo
similarity index 100%
rename from docs_m2met2/_build/html/.buildinfo
rename to docs/m2met2/_build/html/.buildinfo
diff --git a/docs_m2met2/_build/html/Baseline.html b/docs/m2met2/_build/html/Baseline.html
similarity index 97%
rename from docs_m2met2/_build/html/Baseline.html
rename to docs/m2met2/_build/html/Baseline.html
index 282f23529..e52d32275 100644
--- a/docs_m2met2/_build/html/Baseline.html
+++ b/docs/m2met2/_build/html/Baseline.html
@@ -88,7 +88,7 @@
Track & Evaluation
@@ -135,8 +135,8 @@
Baseline results
-The results of the baseline system are shown in Table 3. The speaker profile adopts the oracle speaker embedding during training. However, due to the lack of oracle speaker label during evaluation, the speaker profile provided by an additional spectral clustering is used. Meanwhile, the results of using the oracle speaker profile on Eval and Test Set are also provided to show the impact of speaker profile accuracy.
-
+The results of the baseline system are shown in Table 3. The speaker profile adopts the oracle speaker embedding during training. However, due to the lack of oracle speaker label during evaluation, the speaker profile provided by an additional spectral clustering is used. Meanwhile, the results of using the oracle speaker profile on Eval and Test Set are also provided to show the impact of speaker profile accuracy.
+
diff --git a/docs_m2met2/_build/html/Contact.html b/docs/m2met2/_build/html/Contact.html
similarity index 98%
rename from docs_m2met2/_build/html/Contact.html
rename to docs/m2met2/_build/html/Contact.html
index 44546d590..eafd2d5b8 100644
--- a/docs_m2met2/_build/html/Contact.html
+++ b/docs/m2met2/_build/html/Contact.html
@@ -84,7 +84,7 @@
Track & Evaluation
diff --git a/docs_m2met2/_build/html/Dataset.html b/docs/m2met2/_build/html/Dataset.html
similarity index 96%
rename from docs_m2met2/_build/html/Dataset.html
rename to docs/m2met2/_build/html/Dataset.html
index 88531f6d0..43bf8a121 100644
--- a/docs_m2met2/_build/html/Dataset.html
+++ b/docs/m2met2/_build/html/Dataset.html
@@ -89,7 +89,7 @@
Track & Evaluation
@@ -131,7 +131,7 @@
Detail of AliMeeting corpus
-AliMeeting contains 118.75 hours of speech data in total. The dataset is divided into 104.75 hours for training (Train), 4 hours for evaluation (Eval) and 10 hours as test set (Test) for scoring and ranking. Specifically, the Train and Eval sets contain 212 and 8 sessions, respectively. Each session consists of a 15 to 30-minute discussion by a group of participants. The total number of participants in Train and Eval sets is 456 and 25, respectively, with balanced gender coverage.
+AliMeeting contains 118.75 hours of speech data in total. The dataset is divided into 104.75 hours for training (Train), 4 hours for evaluation (Eval) and 10 hours as test set (Test) for scoring and ranking. Specifically, the Train, Eval and Test sets contain 212, 8 and 20 sessions, respectively. Each session consists of a 15 to 30-minute discussion by a group of participants. The total number of participants in Train, Eval and Test sets is 456, 25 and 60, respectively, with balanced gender coverage.
The dataset is collected in 13 meeting venues, which are categorized into three types: small, medium, and large rooms with sizes ranging from 8 m\(^{2}\) to 55 m\(^{2}\) . Different rooms give us a variety of acoustic properties and layouts. The detailed parameters of each meeting venue will be released together with the Train data. The type of wall material of the meeting venues covers cement, glass, etc. Other furnishings in meeting venues include sofa, TV, blackboard, fan, air conditioner, plants, etc. During recording, the participants of the meeting sit around the microphone array which is placed on the table and conduct a natural conversation. The microphone-speaker distance ranges from 0.3 m to 5.0 m. All participants are native Chinese speakers speaking Mandarin without strong accents. During the meeting, various kinds of indoor noise including but not limited to clicking, keyboard, door opening/closing, fan, bubble noise, etc., are made naturally. For both Train and Eval sets, the participants are required to remain in the same position during recording. There is no speaker overlap between the Train and Eval set. An example of the recording venue from the Train set is shown in Fig 1.
The number of participants within one meeting session ranges from 2 to 4. To ensure the coverage of different overlap ratios, we select various meeting topics during recording, including medical treatment, education, business, organization management, industrial production and other daily routine meetings. The average speech overlap ratio of Train, Eval and Test sets are 42.27%, 34.76% and 42.8%, respectively. More details of AliMeeting are shown in Table 1. A detailed overlap ratio distribution of meeting sessions with different numbers of speakers in the Train, Eval and Test set is shown in Table 2.
diff --git a/docs_m2met2/_build/html/Introduction.html b/docs/m2met2/_build/html/Introduction.html
similarity index 76%
rename from docs_m2met2/_build/html/Introduction.html
rename to docs/m2met2/_build/html/Introduction.html
index 54de72d3e..2ddafe22c 100644
--- a/docs_m2met2/_build/html/Introduction.html
+++ b/docs/m2met2/_build/html/Introduction.html
@@ -89,7 +89,7 @@
Track & Evaluation
@@ -128,26 +128,28 @@
Call for participation
Automatic speech recognition (ASR) and speaker diarization have made significant strides in recent years, resulting in a surge of speech technology applications across various domains. However, meetings present unique challenges to speech technologies due to their complex acoustic conditions and diverse speaking styles, including overlapping speech, variable numbers of speakers, far-field signals in large conference rooms, and environmental noise and reverberation.
-Over the years, several challenges have been organized to advance the development of meeting transcription, including the Rich Transcription evaluation and Computational Hearing in Multisource Environments (CHIME) challenges. The latest iteration of the CHIME challenge has a particular focus on distant automatic speech recognition (ASR) and developing systems that can generalize across various array topologies and application scenarios. However, while progress has been made in English meeting transcription, language differences remain a significant barrier to achieving comparable results in non-English languages, such as Mandarin.
-The Multimodal Information Based Speech Processing (MISP) and Multi-Channel Multi-Party Meeting Transcription (M2MeT) challenges have been instrumental in advancing Mandarin meeting transcription. The MISP challenge seeks to address the problem of audio-visual distant multi-microphone signal processing in everyday home environments, while the M2MeT challenge focuses on tackling the speech overlap issue in offline meeting rooms.
-The ICASSP2022 M2MeT challenge focuses on meeting scenarios, and it comprises two main tasks: speaker diarization and multi-speaker automatic speech recognition (ASR). The former involves identifying who spoke when in the meeting, while the latter aims to transcribe speech from multiple speakers simultaneously, which poses significant technical difficulties due to overlapping speech and acoustic interferences.
-Building on the success of the previous M2MeT challenge, we are excited to propose the M2MeT2.0 challenge as an ASRU2023 challenge special session. In the original M2MeT challenge, the evaluation metric was speaker-independent, which meant that the transcription could be determined, but not the corresponding speaker. To address this limitation and further advance the current multi-talker ASR system towards practicality, the M2MeT2.0 challenge proposes the speaker-attributed ASR task with two sub-tracks: fixed and open training conditions. By attributing speech to specific speakers, this task aims to improve the accuracy and applicability of multi-talker ASR systems in real-world settings. The challenge provides detailed datasets, rules, evaluation methods, and baseline systems to facilitate reproducible research in this field. The speaker-attribute automatic speech recognition (ASR) task aims to tackle the practical and challenging problem of identifying “who spoke what at when”. To facilitate reproducible research in this field, we offer a comprehensive overview of the dataset, rules, evaluation metrics, and baseline systems. Furthermore, we will release a carefully curated test set, comprising approximately 10 hours of audio, according to the timeline. The new test set is designed to enable researchers to validate and compare their models’ performance and advance the state of the art in this area.
+Over the years, several challenges have been organized to advance the development of meeting transcription, including the Rich Transcription evaluation and Computational Hearing in Multisource Environments (CHIME) challenges. The latest iteration of the CHIME challenge has a particular focus on distant automatic speech recognition and developing systems that can generalize across various array topologies and application scenarios. However, while progress has been made in English meeting transcription, language differences remain a significant barrier to achieving comparable results in non-English languages, such as Mandarin. The Multimodal Information Based Speech Processing (MISP) and Multi-Channel Multi-Party Meeting Transcription (M2MeT) challenges have been instrumental in advancing Mandarin meeting transcription. The MISP challenge seeks to address the problem of audio-visual distant multi-microphone signal processing in everyday home environments, while the M2MeT challenge focuses on tackling the speech overlap issue in offline meeting rooms.
+The ICASSP2022 M2MeT challenge focuses on meeting scenarios, and it comprises two main tasks: speaker diarization and multi-speaker automatic speech recognition. The former involves identifying who spoke when in the meeting, while the latter aims to transcribe speech from multiple speakers simultaneously, which poses significant technical difficulties due to overlapping speech and acoustic interferences.
+Building on the success of the previous M2MeT challenge, we are excited to propose the M2MeT2.0 challenge as an ASRU2023 challenge special session. In the original M2MeT challenge, the evaluation metric was speaker-independent, which meant that the transcription could be determined, but not the corresponding speaker. To address this limitation and further advance the current multi-talker ASR system towards practicality, the M2MeT2.0 challenge proposes the speaker-attributed ASR task with two sub-tracks: fixed and open training conditions. The speaker-attribute automatic speech recognition (ASR) task aims to tackle the practical and challenging problem of identifying “who spoke what at when”. To facilitate reproducible research in this field, we offer a comprehensive overview of the dataset, rules, evaluation metrics, and baseline systems. Furthermore, we will release a carefully curated test set, comprising approximately 10 hours of audio, according to the timeline. The new test set is designed to enable researchers to validate and compare their models’ performance and advance the state of the art in this area.
Timeline(AOE Time)
-\( May~5^{th}, 2023: \) Registration deadline, the due date for participants to join the Challenge.
-\( June~9^{th}, 2023: \) Test data release.
-\( June~13^{rd}, 2023: \) Final submission deadline.
-\( June~19^{th}, 2023: \) Evaluation result and ranking release.
-\( July~3^{rd}, 2023: \) Deadline for paper submission.
-\( July~10^{th}, 2023: \) Deadline for final paper submission.
-\( December~12^{nd}\ to\ 16^{th}, 2023: \) ASRU Workshop
+\( April~29, 2023: \) Challenge and registration open.
+\( May~8, 2023: \) Baseline release.
+\( May~15, 2023: \) Registration deadline, the due date for participants to join the Challenge.
+\( June~9, 2023: \) Test data release and leaderboard open.
+\( June~13, 2023: \) Final submission deadline.
+\( June~19, 2023: \) Evaluation result and ranking release.
+\( July~3, 2023: \) Deadline for paper submission.
+\( July~10, 2023: \) Deadline for final paper submission.
+\( December~12\ to\ 16, 2023: \) ASRU Workshop and challenge session
Guidelines
-Possible improved version: Interested participants, whether from academia or industry, must register for the challenge by completing a Google form, which will be available here. The deadline for registration is May 5, 2023.
+Interested participants, whether from academia or industry, must register for the challenge by completing the Google form below. The deadline for registration is May 15, 2023.
+M2MET2.0 Registration
Within three working days, the challenge organizer will send email invitations to eligible teams to participate in the challenge. All qualified teams are required to adhere to the challenge rules, which will be published on the challenge page. Prior to the ranking release time, each participant must submit a system description document detailing their approach and methods. The organizer will select the top three submissions to be included in the ASRU2023 Proceedings.
diff --git a/docs_m2met2/_build/html/Organizers.html b/docs/m2met2/_build/html/Organizers.html
similarity index 61%
rename from docs_m2met2/_build/html/Organizers.html
rename to docs/m2met2/_build/html/Organizers.html
index e5bb748aa..0a8811e78 100644
--- a/docs_m2met2/_build/html/Organizers.html
+++ b/docs/m2met2/_build/html/Organizers.html
@@ -88,7 +88,7 @@
Track & Evaluation
@@ -127,36 +127,27 @@
Lei Xie, Professor, Northwestern Polytechnical University, China
Email: lxie@ nwpu. edu. cn
-Lei Xie received the Ph.D. degree in computer science from Northwestern Polytechnical University, Xi’an, China, in 2004. From 2001 to 2002, he was with the Department of Electronics and Information Processing, Vrije Universiteit Brussel (VUB), Brussels, Belgium, as a Visiting Scientist. From 2004 to 2006, he was a Senior Research Associate with the Center for Media Technology, School of Creative Media, City University of Hong Kong, Hong Kong, China. From 2006 to 2007, he was a Postdoctoral Fellow with the Human-Computer Communications Laboratory (HCCL), The Chinese University of Hong Kong, Hong Kong, China. He is currently a Professor with School of Computer Science, Northwestern Polytechnical University, Xian, China and leads the Audio, Speech and Language Processing Group (ASLP@NPU). He has published over 200 papers in referred journals and conferences, such as IEEE/ACM Transactions on Audio, Speech and Language Processing, IEEE Transactions on Multimedia, Interspeech, ICASSP, ASRU, ACL and ACM Multimedia. He has achieved several best paper awards in flagship conferences. His current research interests include general topics in speech and language processing, multimedia, and human-computer interaction. Dr. Xie is currently an associate editor (AE) of IEEE/ACM Trans. on Audio, Speech and language Processing. He has actively served as Chairs in many conferences and technical committees. He serves as an IEEE Speech and Language Processing
-Technical Committee Member.
Kong Aik Lee, Senior Scientist at Institute for Infocomm Research, A*Star, Singapore
Email: kongaik. lee@ ieee. org
-Kong Aik Lee started off him career as a researcher, then a team leader and a strategic planning manager, at the Institute Infocomm Research, A*STAR, Singapore, working on speaker and language recognition research. From 2018 to 2020, he spent two and a half years in NEC Corporation, Japan, focusing very much on voice biometrics and multi-modal biometrics products. He is proud to work with a great team on voice biometrics featured on NEC Bio-Idiom platform. He returned to Singapore in July 2020, and now leading the speech and audio analytics research at the Institute for Infocomm Research, as a Senior Scientist and PI. He also serve as an Editor for Elsevier Computer Speech and Language (since 2016), and was an Associate Editor for IEEE/ACM Transactions on Audio, Speech and Language Processing (2017 - 2021), and am an elected member of IEEE Speech and Language Technical Committee (2019 - 2021).
Zhijie Yan, Principal Engineer at Alibaba, China
Email: zhijie. yzj@ alibaba-inc. com
-Zhijie Yan holds a PhD from the University of Science and Technology of China, and is a senior member of the Institute of Electrical and Electronics Engineers (IEEE). He is also an expert reviewer of top academic conferences and journals in the speech field. His research fields include speech recognition, speech synthesis, voiceprints, and speech interaction. His research results are applied in speech services provided by Alibaba Group and Ant Financial. He was awarded the title of “One of the Top 100 Grassroots Scientists” by the China Association for Science and Technology.
Shiliang Zhang, Senior Engineer at Alibaba, China
Email: sly. zsl@ alibaba-inc. com
-Shiliang Zhang graduated with a Ph.D. from the University of Science and Technology of China in 2017. His research areas mainly include speech recognition, natural language understanding, and machine learning. Currently, he has published over 40 papers in mainstream academic journals and conferences in the fields of speech and machine learning, and has applied for dozens of patents. After obtaining his doctorate degree, he joined the Alibaba Intelligent Speech team. He is currently leading the direction of speech recognition and fundamental technology at DAMO Academy’s speech laboratory.
Yanmin Qian, Professor, Shanghai Jiao Tong University, China
Email: yanminqian@ sjtu. edu. cn
-Yanmin Qian received the B.S. degree from the Department of Electronic and Information Engineering,Huazhong University of Science and Technology, Wuhan, China, in 2007, and the Ph.D. degree from the Department of Electronic Engineering, Tsinghua University, Beijing, China, in 2012. Since 2013, he has been with the Department of Computer Science and Engineering, Shanghai Jiao Tong University (SJTU), Shanghai, China, where he is currently an Associate Professor. From 2015 to 2016, he also worked as an Associate Research in the Speech Group, Cambridge University Engineering Department, Cambridge, U.K. He is a senior member of IEEE and a member of ISCA, and one of the founding members of Kaldi Speech Recognition Toolkit. He has published more than 110 papers on speech and language processing with 4000+ citations, including the top conference: ICASSP, INTERSPEECH and ASRU. His current research interests include the acoustic and language modeling in speech recognition, speaker and language recognition, key word spotting, and multimedia signal processing.
Zhuo Chen, Applied Scientist in Microsoft, USA
Email: zhuc@ microsoft. com
-Zhuo Chen received the Ph.D. degree from Columbia University, New York, NY, USA, in 2017. He is currently a Principal Applied Data Scientist with Microsoft. He has authored or coauthored more than 80 papers in peer-reviewed journals and conferences with around 6000 citations. He is a reviewer or technical committee member for more than ten journals and conferences. His research interests include automatic conversation recognition, speech separation, diarisation, and speaker information extraction. He actively participated in the academic events and challenges, and won several awards. Meanwhile, he contributed to open-sourced datasets, such as WSJ0-2mix, LibriCSS, and AISHELL-4, that have been main benchmark datasets for multi-speaker processing research. In 2020, he was the Team Leader in 2020 Jelinek workshop, leading more than 30 researchers and students to push the state of the art in conversation transcription.
Jian Wu, Applied Scientist in Microsoft, USA
Email: wujian@ microsoft. com
-Jian Wu received a master degree from Northwestern Polytechnical University, Xi’an, China, in 2020 and currently he is a Applied Scientist in Microsoft, USA. His research interests cover multi-channel signal processing, robust and multi-talker speech recognition, speech enhancement, dereverberation and separation. He has around 30 conference publications with a total citation over 1200. He participated in several challenges such as CHiME5, DNS 2020 and FFSVC 2020 and contributed to the open-sourced datasets including LibriCSS and AISHELL-4. He is also a reviewer for several journals and conferences such as ICASSP, SLT, TASLP and SPL.
Hui Bu, CEO, AISHELL foundation, China
Email: buhui@ aishelldata. com
-Hui Bu received his master degree in the Artificial Intelligence Laboratory of Korea University in 2014. He is the founder and the CEO of AISHELL and AISHELL foundation. He participated in the release of AISHELL 1 & 2 & 3 & 4, DMASH and HI-MIA open source database project and is the co-founder of China Kaldi offline Technology Forum.
diff --git a/docs_m2met2/_build/html/Rules.html b/docs/m2met2/_build/html/Rules.html
similarity index 97%
rename from docs_m2met2/_build/html/Rules.html
rename to docs/m2met2/_build/html/Rules.html
index 3d2bddebe..59651158a 100644
--- a/docs_m2met2/_build/html/Rules.html
+++ b/docs/m2met2/_build/html/Rules.html
@@ -88,7 +88,7 @@
Track & Evaluation
@@ -128,7 +128,6 @@
Data augmentation is allowed on the original training dataset, including, but not limited to, adding noise or reverberation, speed perturbation and tone change.
Participants are permitted to use the Eval set for model training, but it is not allowed to use the Test set for this purpose. Instead, the Test set should only be utilized for parameter tuning and model selection. Any use of the Test-2023 dataset that violates these rules is strictly prohibited, including but not limited to the use of the Test set for fine-tuning or training the model.
-Multi-system fusion is allowed, but the systems with same structure and different parameters is not encouraged.
If the cpCER of the two systems on the Test dataset are the same, the system with lower computation complexity will be judged as the superior one.
If the forced alignment is used to obtain the frame-level classification label, the forced alignment model must be trained on the basis of the data allowed by the corresponding sub-track.
Shallow fusion is allowed to the end-to-end approaches, e.g., LAS, RNNT and Transformer, but the training data of the shallow fusion language model can only come from the transcripts of the allowed training dataset.
diff --git a/docs_m2met2/_build/html/Track_setting_and_evaluation.html b/docs/m2met2/_build/html/Track_setting_and_evaluation.html
similarity index 96%
rename from docs_m2met2/_build/html/Track_setting_and_evaluation.html
rename to docs/m2met2/_build/html/Track_setting_and_evaluation.html
index f377ee5ea..859f4444a 100644
--- a/docs_m2met2/_build/html/Track_setting_and_evaluation.html
+++ b/docs/m2met2/_build/html/Track_setting_and_evaluation.html
@@ -89,7 +89,7 @@
Track & Evaluation
@@ -125,9 +125,9 @@
Track & Evaluation
-
-Speaker-Attributed ASR (Main Track)
-The speaker-attributed ASR task poses a unique challenge of transcribing speech from multiple speakers and assigning a speaker label to the transcription. Figure 2 illustrates the difference between the speaker-attributed ASR task and the multi-speaker ASR task. This track allows for the use of the AliMeeting, Aishell4, and Cn-Celeb datasets as constrained data sources during both training and evaluation. The AliMeeting dataset, which was used in the M2MeT challenge, includes Train, Eval, and Test sets. Additionally, a new Test-2023 set, consisting of approximately 10 hours of meeting data recorded in an identical acoustic setting as the AliMeeting corpus, will be released soon for challenge scoring and ranking. It’s worth noting that the organizers will not provide the near-field audio, transcriptions, or oracle timestamps. Instead, segments containing multiple speakers will be provided on the Test-2023 set, which can be obtained using a simple voice activity detection (VAD) model.
+
+Speaker-Attributed ASR
+The speaker-attributed ASR task poses a unique challenge of transcribing speech from multiple speakers and assigning a speaker label to the transcription. Figure 2 illustrates the difference between the speaker-attributed ASR task and the multi-speaker ASR task. This track allows for the use of the AliMeeting, Aishell4, and Cn-Celeb datasets as constrained data sources during both training and evaluation. The AliMeeting dataset, which was used in the M2MeT challenge, includes Train, Eval, and Test sets. Additionally, a new Test-2023 set, consisting of approximately 10 hours of meeting data recorded in an identical acoustic setting as the AliMeeting corpus, will be released soon for challenge scoring and ranking. It’s worth noting that the organizers will not provide the near-field audio, transcriptions, or oracle timestamps of the Test-2023 set. Instead, segments containing multiple speakers will be provided, which can be obtained using a simple voice activity detection (VAD) model.
diff --git a/docs_m2met2/_build/html/_images/baseline_result.png b/docs/m2met2/_build/html/_images/baseline_result.png
similarity index 100%
rename from docs_m2met2/_build/html/_images/baseline_result.png
rename to docs/m2met2/_build/html/_images/baseline_result.png
diff --git a/docs_m2met2/_build/html/_images/buhui.jpeg b/docs/m2met2/_build/html/_images/buhui.jpeg
similarity index 100%
rename from docs_m2met2/_build/html/_images/buhui.jpeg
rename to docs/m2met2/_build/html/_images/buhui.jpeg
diff --git a/docs_m2met2/_build/html/_images/chenzhuo.jpg b/docs/m2met2/_build/html/_images/chenzhuo.jpg
similarity index 100%
rename from docs_m2met2/_build/html/_images/chenzhuo.jpg
rename to docs/m2met2/_build/html/_images/chenzhuo.jpg
diff --git a/docs_m2met2/_build/html/_images/dataset_details.png b/docs/m2met2/_build/html/_images/dataset_details.png
similarity index 100%
rename from docs_m2met2/_build/html/_images/dataset_details.png
rename to docs/m2met2/_build/html/_images/dataset_details.png
diff --git a/docs_m2met2/_build/html/_images/kong.png b/docs/m2met2/_build/html/_images/kong.png
similarity index 100%
rename from docs_m2met2/_build/html/_images/kong.png
rename to docs/m2met2/_build/html/_images/kong.png
diff --git a/docs_m2met2/_build/html/_images/lxie.jpeg b/docs/m2met2/_build/html/_images/lxie.jpeg
similarity index 100%
rename from docs_m2met2/_build/html/_images/lxie.jpeg
rename to docs/m2met2/_build/html/_images/lxie.jpeg
diff --git a/docs_m2met2/_build/html/_images/meeting_room.png b/docs/m2met2/_build/html/_images/meeting_room.png
similarity index 100%
rename from docs_m2met2/_build/html/_images/meeting_room.png
rename to docs/m2met2/_build/html/_images/meeting_room.png
diff --git a/docs_m2met2/_build/html/_images/qian.jpeg b/docs/m2met2/_build/html/_images/qian.jpeg
similarity index 100%
rename from docs_m2met2/_build/html/_images/qian.jpeg
rename to docs/m2met2/_build/html/_images/qian.jpeg
diff --git a/docs_m2met2/images/sa_asr_arch.png b/docs/m2met2/_build/html/_images/sa_asr_arch.png
similarity index 100%
rename from docs_m2met2/images/sa_asr_arch.png
rename to docs/m2met2/_build/html/_images/sa_asr_arch.png
diff --git a/docs_m2met2/_build/html/_images/task_diff.png b/docs/m2met2/_build/html/_images/task_diff.png
similarity index 100%
rename from docs_m2met2/_build/html/_images/task_diff.png
rename to docs/m2met2/_build/html/_images/task_diff.png
diff --git a/docs_m2met2/_build/html/_images/wujian.jpg b/docs/m2met2/_build/html/_images/wujian.jpg
similarity index 100%
rename from docs_m2met2/_build/html/_images/wujian.jpg
rename to docs/m2met2/_build/html/_images/wujian.jpg
diff --git a/docs_m2met2/_build/html/_images/zhijie.jpg b/docs/m2met2/_build/html/_images/zhijie.jpg
similarity index 100%
rename from docs_m2met2/_build/html/_images/zhijie.jpg
rename to docs/m2met2/_build/html/_images/zhijie.jpg
diff --git a/docs_m2met2/_build/html/_images/zsl.JPG b/docs/m2met2/_build/html/_images/zsl.JPG
similarity index 100%
rename from docs_m2met2/_build/html/_images/zsl.JPG
rename to docs/m2met2/_build/html/_images/zsl.JPG
diff --git a/docs_m2met2/_build/html/_sources/Baseline.md.txt b/docs/m2met2/_build/html/_sources/Baseline.md.txt
similarity index 99%
rename from docs_m2met2/_build/html/_sources/Baseline.md.txt
rename to docs/m2met2/_build/html/_sources/Baseline.md.txt
index c34679fd6..6f9609bde 100644
--- a/docs_m2met2/_build/html/_sources/Baseline.md.txt
+++ b/docs/m2met2/_build/html/_sources/Baseline.md.txt
@@ -9,4 +9,5 @@ We will release an E2E SA-ASR~\cite{kanda21b_interspeech} baseline conducted on
## Baseline results
The results of the baseline system are shown in Table 3. The speaker profile adopts the oracle speaker embedding during training. However, due to the lack of oracle speaker label during evaluation, the speaker profile provided by an additional spectral clustering is used. Meanwhile, the results of using the oracle speaker profile on Eval and Test Set are also provided to show the impact of speaker profile accuracy.
+

\ No newline at end of file
diff --git a/docs_m2met2/_build/html/_sources/Contact.md.txt b/docs/m2met2/_build/html/_sources/Contact.md.txt
similarity index 100%
rename from docs_m2met2/_build/html/_sources/Contact.md.txt
rename to docs/m2met2/_build/html/_sources/Contact.md.txt
diff --git a/docs_m2met2/_build/html/_sources/Dataset.md.txt b/docs/m2met2/_build/html/_sources/Dataset.md.txt
similarity index 92%
rename from docs_m2met2/_build/html/_sources/Dataset.md.txt
rename to docs/m2met2/_build/html/_sources/Dataset.md.txt
index c987acac9..a897d673b 100644
--- a/docs_m2met2/_build/html/_sources/Dataset.md.txt
+++ b/docs/m2met2/_build/html/_sources/Dataset.md.txt
@@ -2,7 +2,7 @@
## Overview of training data
In the fixed training condition, the training dataset is restricted to three publicly available corpora, namely, AliMeeting, AISHELL-4, and CN-Celeb. To evaluate the performance of the models trained on these datasets, we will release a new Test set called Test-2023 for scoring and ranking. We will describe the AliMeeting dataset and the Test-2023 set in detail.
## Detail of AliMeeting corpus
-AliMeeting contains 118.75 hours of speech data in total. The dataset is divided into 104.75 hours for training (Train), 4 hours for evaluation (Eval) and 10 hours as test set (Test) for scoring and ranking. Specifically, the Train and Eval sets contain 212 and 8 sessions, respectively. Each session consists of a 15 to 30-minute discussion by a group of participants. The total number of participants in Train and Eval sets is 456 and 25, respectively, with balanced gender coverage.
+AliMeeting contains 118.75 hours of speech data in total. The dataset is divided into 104.75 hours for training (Train), 4 hours for evaluation (Eval) and 10 hours as test set (Test) for scoring and ranking. Specifically, the Train, Eval and Test sets contain 212, 8 and 20 sessions, respectively. Each session consists of a 15 to 30-minute discussion by a group of participants. The total number of participants in Train, Eval and Test sets is 456, 25 and 60, respectively, with balanced gender coverage.
The dataset is collected in 13 meeting venues, which are categorized into three types: small, medium, and large rooms with sizes ranging from 8 m$^{2}$ to 55 m$^{2}$. Different rooms give us a variety of acoustic properties and layouts. The detailed parameters of each meeting venue will be released together with the Train data. The type of wall material of the meeting venues covers cement, glass, etc. Other furnishings in meeting venues include sofa, TV, blackboard, fan, air conditioner, plants, etc. During recording, the participants of the meeting sit around the microphone array which is placed on the table and conduct a natural conversation. The microphone-speaker distance ranges from 0.3 m to 5.0 m. All participants are native Chinese speakers speaking Mandarin without strong accents. During the meeting, various kinds of indoor noise including but not limited to clicking, keyboard, door opening/closing, fan, bubble noise, etc., are made naturally. For both Train and Eval sets, the participants are required to remain in the same position during recording. There is no speaker overlap between the Train and Eval set. An example of the recording venue from the Train set is shown in Fig 1.
diff --git a/docs/m2met2/_build/html/_sources/Introduction.md.txt b/docs/m2met2/_build/html/_sources/Introduction.md.txt
new file mode 100644
index 000000000..eac9eb6b5
--- /dev/null
+++ b/docs/m2met2/_build/html/_sources/Introduction.md.txt
@@ -0,0 +1,28 @@
+# Introduction
+## Call for participation
+Automatic speech recognition (ASR) and speaker diarization have made significant strides in recent years, resulting in a surge of speech technology applications across various domains. However, meetings present unique challenges to speech technologies due to their complex acoustic conditions and diverse speaking styles, including overlapping speech, variable numbers of speakers, far-field signals in large conference rooms, and environmental noise and reverberation.
+
+Over the years, several challenges have been organized to advance the development of meeting transcription, including the Rich Transcription evaluation and Computational Hearing in Multisource Environments (CHIME) challenges. The latest iteration of the CHIME challenge has a particular focus on distant automatic speech recognition and developing systems that can generalize across various array topologies and application scenarios. However, while progress has been made in English meeting transcription, language differences remain a significant barrier to achieving comparable results in non-English languages, such as Mandarin. The Multimodal Information Based Speech Processing (MISP) and Multi-Channel Multi-Party Meeting Transcription (M2MeT) challenges have been instrumental in advancing Mandarin meeting transcription. The MISP challenge seeks to address the problem of audio-visual distant multi-microphone signal processing in everyday home environments, while the M2MeT challenge focuses on tackling the speech overlap issue in offline meeting rooms.
+
+The ICASSP2022 M2MeT challenge focuses on meeting scenarios, and it comprises two main tasks: speaker diarization and multi-speaker automatic speech recognition. The former involves identifying who spoke when in the meeting, while the latter aims to transcribe speech from multiple speakers simultaneously, which poses significant technical difficulties due to overlapping speech and acoustic interferences.
+
+Building on the success of the previous M2MeT challenge, we are excited to propose the M2MeT2.0 challenge as an ASRU2023 challenge special session. In the original M2MeT challenge, the evaluation metric was speaker-independent, which meant that the transcription could be determined, but not the corresponding speaker. To address this limitation and further advance the current multi-talker ASR system towards practicality, the M2MeT2.0 challenge proposes the speaker-attributed ASR task with two sub-tracks: fixed and open training conditions. The speaker-attribute automatic speech recognition (ASR) task aims to tackle the practical and challenging problem of identifying "who spoke what at when". To facilitate reproducible research in this field, we offer a comprehensive overview of the dataset, rules, evaluation metrics, and baseline systems. Furthermore, we will release a carefully curated test set, comprising approximately 10 hours of audio, according to the timeline. The new test set is designed to enable researchers to validate and compare their models' performance and advance the state of the art in this area.
+
+## Timeline(AOE Time)
+- $ April~29, 2023: $ Challenge and registration open.
+- $ May~8, 2023: $ Baseline release.
+- $ May~15, 2023: $ Registration deadline, the due date for participants to join the Challenge.
+- $ June~9, 2023: $ Test data release and leaderboard open.
+- $ June~13, 2023: $ Final submission deadline.
+- $ June~19, 2023: $ Evaluation result and ranking release.
+- $ July~3, 2023: $ Deadline for paper submission.
+- $ July~10, 2023: $ Deadline for final paper submission.
+- $ December~12\ to\ 16, 2023: $ ASRU Workshop and challenge session
+
+## Guidelines
+
+Interested participants, whether from academia or industry, must register for the challenge by completing the Google form below. The deadline for registration is May 15, 2023.
+
+[M2MET2.0 Registration](https://docs.google.com/forms/d/e/1FAIpQLSf77T9vAl7Ym-u5g8gXu18SBofoWRaFShBo26Ym0-HDxHW9PQ/viewform?usp=sf_link)
+
+Within three working days, the challenge organizer will send email invitations to eligible teams to participate in the challenge. All qualified teams are required to adhere to the challenge rules, which will be published on the challenge page. Prior to the ranking release time, each participant must submit a system description document detailing their approach and methods. The organizer will select the top three submissions to be included in the ASRU2023 Proceedings.
diff --git a/docs/m2met2/_build/html/_sources/Organizers.md.txt b/docs/m2met2/_build/html/_sources/Organizers.md.txt
new file mode 100644
index 000000000..e16c803af
--- /dev/null
+++ b/docs/m2met2/_build/html/_sources/Organizers.md.txt
@@ -0,0 +1,48 @@
+# Organizers
+***Lei Xie, Professor, Northwestern Polytechnical University, China***
+
+Email: [lxie@nwpu.edu.cn](mailto:lxie@nwpu.edu.cn)
+
+
+
+
+***Kong Aik Lee, Senior Scientist at Institute for Infocomm Research, A\*Star, Singapore***
+
+Email: [kongaik.lee@ieee.org](mailto:kongaik.lee@ieee.org)
+
+
+
+
+***Zhijie Yan, Principal Engineer at Alibaba, China***
+Email: [zhijie.yzj@alibaba-inc.com](mailto:zhijie.yzj@alibaba-inc.com)
+
+
+
+***Shiliang Zhang, Senior Engineer at Alibaba, China***
+Email: [sly.zsl@alibaba-inc.com](mailto:sly.zsl@alibaba-inc.com)
+
+
+
+***Yanmin Qian, Professor, Shanghai Jiao Tong University, China***
+
+Email: [yanminqian@sjtu.edu.cn](mailto:yanminqian@sjtu.edu.cn)
+
+
+
+***Zhuo Chen, Applied Scientist in Microsoft, USA***
+
+Email: [zhuc@microsoft.com](mailto:zhuc@microsoft.com)
+
+
+
+***Jian Wu, Applied Scientist in Microsoft, USA***
+
+Email: [wujian@microsoft.com](mailto:wujian@microsoft.com)
+
+
+
+***Hui Bu, CEO, AISHELL foundation, China***
+
+Email: [buhui@aishelldata.com](mailto:buhui@aishelldata.com)
+
+
diff --git a/docs_m2met2/_build/html/_sources/Rules.md.txt b/docs/m2met2/_build/html/_sources/Rules.md.txt
similarity index 92%
rename from docs_m2met2/_build/html/_sources/Rules.md.txt
rename to docs/m2met2/_build/html/_sources/Rules.md.txt
index 8bc1a1900..340c2f50d 100644
--- a/docs_m2met2/_build/html/_sources/Rules.md.txt
+++ b/docs/m2met2/_build/html/_sources/Rules.md.txt
@@ -4,8 +4,6 @@ All participants should adhere to the following rules to be eligible for the cha
- Data augmentation is allowed on the original training dataset, including, but not limited to, adding noise or reverberation, speed perturbation and tone change.
- Participants are permitted to use the Eval set for model training, but it is not allowed to use the Test set for this purpose. Instead, the Test set should only be utilized for parameter tuning and model selection. Any use of the Test-2023 dataset that violates these rules is strictly prohibited, including but not limited to the use of the Test set for fine-tuning or training the model.
-
-- Multi-system fusion is allowed, but the systems with same structure and different parameters is not encouraged.
- If the cpCER of the two systems on the Test dataset are the same, the system with lower computation complexity will be judged as the superior one.
diff --git a/docs_m2met2/_build/html/_sources/Track_setting_and_evaluation.md.txt b/docs/m2met2/_build/html/_sources/Track_setting_and_evaluation.md.txt
similarity index 95%
rename from docs_m2met2/_build/html/_sources/Track_setting_and_evaluation.md.txt
rename to docs/m2met2/_build/html/_sources/Track_setting_and_evaluation.md.txt
index b90c17af1..2b75fcac5 100644
--- a/docs_m2met2/_build/html/_sources/Track_setting_and_evaluation.md.txt
+++ b/docs/m2met2/_build/html/_sources/Track_setting_and_evaluation.md.txt
@@ -1,6 +1,6 @@
# Track & Evaluation
-## Speaker-Attributed ASR (Main Track)
-The speaker-attributed ASR task poses a unique challenge of transcribing speech from multiple speakers and assigning a speaker label to the transcription. Figure 2 illustrates the difference between the speaker-attributed ASR task and the multi-speaker ASR task. This track allows for the use of the AliMeeting, Aishell4, and Cn-Celeb datasets as constrained data sources during both training and evaluation. The AliMeeting dataset, which was used in the M2MeT challenge, includes Train, Eval, and Test sets. Additionally, a new Test-2023 set, consisting of approximately 10 hours of meeting data recorded in an identical acoustic setting as the AliMeeting corpus, will be released soon for challenge scoring and ranking. It's worth noting that the organizers will not provide the near-field audio, transcriptions, or oracle timestamps. Instead, segments containing multiple speakers will be provided on the Test-2023 set, which can be obtained using a simple voice activity detection (VAD) model.
+## Speaker-Attributed ASR
+The speaker-attributed ASR task poses a unique challenge of transcribing speech from multiple speakers and assigning a speaker label to the transcription. Figure 2 illustrates the difference between the speaker-attributed ASR task and the multi-speaker ASR task. This track allows for the use of the AliMeeting, Aishell4, and Cn-Celeb datasets as constrained data sources during both training and evaluation. The AliMeeting dataset, which was used in the M2MeT challenge, includes Train, Eval, and Test sets. Additionally, a new Test-2023 set, consisting of approximately 10 hours of meeting data recorded in an identical acoustic setting as the AliMeeting corpus, will be released soon for challenge scoring and ranking. It's worth noting that the organizers will not provide the near-field audio, transcriptions, or oracle timestamps of the Test-2023 set. Instead, segments containing multiple speakers will be provided, which can be obtained using a simple voice activity detection (VAD) model.

diff --git a/docs_m2met2/_build/html/_sources/index.rst.txt b/docs/m2met2/_build/html/_sources/index.rst.txt
similarity index 92%
rename from docs_m2met2/_build/html/_sources/index.rst.txt
rename to docs/m2met2/_build/html/_sources/index.rst.txt
index 04cb9345d..e0e7562c7 100644
--- a/docs_m2met2/_build/html/_sources/index.rst.txt
+++ b/docs/m2met2/_build/html/_sources/index.rst.txt
@@ -20,10 +20,3 @@ To facilitate reproducible research, we provide a comprehensive overview of the
./Rules
./Organizers
./Contact
-
-Indices and tables
-==================
-
-* :ref:`genindex`
-* :ref:`modindex`
-* :ref:`search`
\ No newline at end of file
diff --git a/docs_m2met2/_build/html/_static/_sphinx_javascript_frameworks_compat.js b/docs/m2met2/_build/html/_static/_sphinx_javascript_frameworks_compat.js
similarity index 100%
rename from docs_m2met2/_build/html/_static/_sphinx_javascript_frameworks_compat.js
rename to docs/m2met2/_build/html/_static/_sphinx_javascript_frameworks_compat.js
diff --git a/docs_m2met2/_build/html/_static/basic.css b/docs/m2met2/_build/html/_static/basic.css
similarity index 100%
rename from docs_m2met2/_build/html/_static/basic.css
rename to docs/m2met2/_build/html/_static/basic.css
diff --git a/docs_m2met2/_build/html/_static/css/bootstrap-theme.min.css b/docs/m2met2/_build/html/_static/css/bootstrap-theme.min.css
similarity index 100%
rename from docs_m2met2/_build/html/_static/css/bootstrap-theme.min.css
rename to docs/m2met2/_build/html/_static/css/bootstrap-theme.min.css
diff --git a/docs_m2met2/_build/html/_static/css/bootstrap.min.css b/docs/m2met2/_build/html/_static/css/bootstrap.min.css
similarity index 100%
rename from docs_m2met2/_build/html/_static/css/bootstrap.min.css
rename to docs/m2met2/_build/html/_static/css/bootstrap.min.css
diff --git a/docs_m2met2/_build/html/_static/doctools.js b/docs/m2met2/_build/html/_static/doctools.js
similarity index 100%
rename from docs_m2met2/_build/html/_static/doctools.js
rename to docs/m2met2/_build/html/_static/doctools.js
diff --git a/docs_m2met2/_build/html/_static/documentation_options.js b/docs/m2met2/_build/html/_static/documentation_options.js
similarity index 100%
rename from docs_m2met2/_build/html/_static/documentation_options.js
rename to docs/m2met2/_build/html/_static/documentation_options.js
diff --git a/docs_m2met2/_build/html/_static/file.png b/docs/m2met2/_build/html/_static/file.png
similarity index 100%
rename from docs_m2met2/_build/html/_static/file.png
rename to docs/m2met2/_build/html/_static/file.png
diff --git a/docs_m2met2/_build/html/_static/fonts/glyphicons-halflings-regular.eot b/docs/m2met2/_build/html/_static/fonts/glyphicons-halflings-regular.eot
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/glyphicons-halflings-regular.eot
rename to docs/m2met2/_build/html/_static/fonts/glyphicons-halflings-regular.eot
diff --git a/docs_m2met2/_build/html/_static/fonts/glyphicons-halflings-regular.svg b/docs/m2met2/_build/html/_static/fonts/glyphicons-halflings-regular.svg
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/glyphicons-halflings-regular.svg
rename to docs/m2met2/_build/html/_static/fonts/glyphicons-halflings-regular.svg
diff --git a/docs_m2met2/_build/html/_static/fonts/glyphicons-halflings-regular.ttf b/docs/m2met2/_build/html/_static/fonts/glyphicons-halflings-regular.ttf
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/glyphicons-halflings-regular.ttf
rename to docs/m2met2/_build/html/_static/fonts/glyphicons-halflings-regular.ttf
diff --git a/docs_m2met2/_build/html/_static/fonts/glyphicons-halflings-regular.woff b/docs/m2met2/_build/html/_static/fonts/glyphicons-halflings-regular.woff
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/glyphicons-halflings-regular.woff
rename to docs/m2met2/_build/html/_static/fonts/glyphicons-halflings-regular.woff
diff --git a/docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Bold-webfont.eot b/docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Bold-webfont.eot
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Bold-webfont.eot
rename to docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Bold-webfont.eot
diff --git a/docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Bold-webfont.svg b/docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Bold-webfont.svg
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Bold-webfont.svg
rename to docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Bold-webfont.svg
diff --git a/docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Bold-webfont.ttf b/docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Bold-webfont.ttf
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Bold-webfont.ttf
rename to docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Bold-webfont.ttf
diff --git a/docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Bold-webfont.woff b/docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Bold-webfont.woff
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Bold-webfont.woff
rename to docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Bold-webfont.woff
diff --git a/docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-BoldItalic-webfont.eot b/docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-BoldItalic-webfont.eot
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-BoldItalic-webfont.eot
rename to docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-BoldItalic-webfont.eot
diff --git a/docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-BoldItalic-webfont.svg b/docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-BoldItalic-webfont.svg
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-BoldItalic-webfont.svg
rename to docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-BoldItalic-webfont.svg
diff --git a/docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-BoldItalic-webfont.ttf b/docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-BoldItalic-webfont.ttf
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-BoldItalic-webfont.ttf
rename to docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-BoldItalic-webfont.ttf
diff --git a/docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-BoldItalic-webfont.woff b/docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-BoldItalic-webfont.woff
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-BoldItalic-webfont.woff
rename to docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-BoldItalic-webfont.woff
diff --git a/docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-ExtraBold-webfont.eot b/docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-ExtraBold-webfont.eot
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-ExtraBold-webfont.eot
rename to docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-ExtraBold-webfont.eot
diff --git a/docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-ExtraBold-webfont.svg b/docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-ExtraBold-webfont.svg
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-ExtraBold-webfont.svg
rename to docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-ExtraBold-webfont.svg
diff --git a/docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-ExtraBold-webfont.ttf b/docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-ExtraBold-webfont.ttf
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-ExtraBold-webfont.ttf
rename to docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-ExtraBold-webfont.ttf
diff --git a/docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-ExtraBold-webfont.woff b/docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-ExtraBold-webfont.woff
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-ExtraBold-webfont.woff
rename to docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-ExtraBold-webfont.woff
diff --git a/docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-ExtraBoldItalic-webfont.eot b/docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-ExtraBoldItalic-webfont.eot
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-ExtraBoldItalic-webfont.eot
rename to docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-ExtraBoldItalic-webfont.eot
diff --git a/docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-ExtraBoldItalic-webfont.svg b/docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-ExtraBoldItalic-webfont.svg
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-ExtraBoldItalic-webfont.svg
rename to docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-ExtraBoldItalic-webfont.svg
diff --git a/docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-ExtraBoldItalic-webfont.ttf b/docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-ExtraBoldItalic-webfont.ttf
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-ExtraBoldItalic-webfont.ttf
rename to docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-ExtraBoldItalic-webfont.ttf
diff --git a/docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-ExtraBoldItalic-webfont.woff b/docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-ExtraBoldItalic-webfont.woff
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-ExtraBoldItalic-webfont.woff
rename to docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-ExtraBoldItalic-webfont.woff
diff --git a/docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Italic-webfont.eot b/docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Italic-webfont.eot
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Italic-webfont.eot
rename to docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Italic-webfont.eot
diff --git a/docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Italic-webfont.svg b/docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Italic-webfont.svg
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Italic-webfont.svg
rename to docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Italic-webfont.svg
diff --git a/docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Italic-webfont.ttf b/docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Italic-webfont.ttf
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Italic-webfont.ttf
rename to docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Italic-webfont.ttf
diff --git a/docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Italic-webfont.woff b/docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Italic-webfont.woff
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Italic-webfont.woff
rename to docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Italic-webfont.woff
diff --git a/docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Light-webfont.eot b/docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Light-webfont.eot
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Light-webfont.eot
rename to docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Light-webfont.eot
diff --git a/docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Light-webfont.svg b/docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Light-webfont.svg
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Light-webfont.svg
rename to docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Light-webfont.svg
diff --git a/docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Light-webfont.ttf b/docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Light-webfont.ttf
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Light-webfont.ttf
rename to docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Light-webfont.ttf
diff --git a/docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Light-webfont.woff b/docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Light-webfont.woff
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Light-webfont.woff
rename to docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Light-webfont.woff
diff --git a/docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-LightItalic-webfont.eot b/docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-LightItalic-webfont.eot
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-LightItalic-webfont.eot
rename to docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-LightItalic-webfont.eot
diff --git a/docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-LightItalic-webfont.svg b/docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-LightItalic-webfont.svg
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-LightItalic-webfont.svg
rename to docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-LightItalic-webfont.svg
diff --git a/docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-LightItalic-webfont.ttf b/docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-LightItalic-webfont.ttf
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-LightItalic-webfont.ttf
rename to docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-LightItalic-webfont.ttf
diff --git a/docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-LightItalic-webfont.woff b/docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-LightItalic-webfont.woff
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-LightItalic-webfont.woff
rename to docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-LightItalic-webfont.woff
diff --git a/docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Regular-webfont.eot b/docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Regular-webfont.eot
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Regular-webfont.eot
rename to docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Regular-webfont.eot
diff --git a/docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Regular-webfont.svg b/docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Regular-webfont.svg
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Regular-webfont.svg
rename to docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Regular-webfont.svg
diff --git a/docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Regular-webfont.ttf b/docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Regular-webfont.ttf
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Regular-webfont.ttf
rename to docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Regular-webfont.ttf
diff --git a/docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Regular-webfont.woff b/docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Regular-webfont.woff
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Regular-webfont.woff
rename to docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Regular-webfont.woff
diff --git a/docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Semibold-webfont.eot b/docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Semibold-webfont.eot
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Semibold-webfont.eot
rename to docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Semibold-webfont.eot
diff --git a/docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Semibold-webfont.svg b/docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Semibold-webfont.svg
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Semibold-webfont.svg
rename to docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Semibold-webfont.svg
diff --git a/docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Semibold-webfont.ttf b/docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Semibold-webfont.ttf
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Semibold-webfont.ttf
rename to docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Semibold-webfont.ttf
diff --git a/docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Semibold-webfont.woff b/docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Semibold-webfont.woff
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Semibold-webfont.woff
rename to docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-Semibold-webfont.woff
diff --git a/docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-SemiboldItalic-webfont.eot b/docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-SemiboldItalic-webfont.eot
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-SemiboldItalic-webfont.eot
rename to docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-SemiboldItalic-webfont.eot
diff --git a/docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-SemiboldItalic-webfont.svg b/docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-SemiboldItalic-webfont.svg
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-SemiboldItalic-webfont.svg
rename to docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-SemiboldItalic-webfont.svg
diff --git a/docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-SemiboldItalic-webfont.ttf b/docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-SemiboldItalic-webfont.ttf
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-SemiboldItalic-webfont.ttf
rename to docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-SemiboldItalic-webfont.ttf
diff --git a/docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-SemiboldItalic-webfont.woff b/docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-SemiboldItalic-webfont.woff
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-SemiboldItalic-webfont.woff
rename to docs/m2met2/_build/html/_static/fonts/open-sans/fonts/OpenSans-SemiboldItalic-webfont.woff
diff --git a/docs_m2met2/_build/html/_static/fonts/open-sans/stylesheet.css b/docs/m2met2/_build/html/_static/fonts/open-sans/stylesheet.css
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/open-sans/stylesheet.css
rename to docs/m2met2/_build/html/_static/fonts/open-sans/stylesheet.css
diff --git a/docs_m2met2/_build/html/_static/fonts/source-serif-pro/EOT/SourceSerifPro-Black.eot b/docs/m2met2/_build/html/_static/fonts/source-serif-pro/EOT/SourceSerifPro-Black.eot
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/source-serif-pro/EOT/SourceSerifPro-Black.eot
rename to docs/m2met2/_build/html/_static/fonts/source-serif-pro/EOT/SourceSerifPro-Black.eot
diff --git a/docs_m2met2/_build/html/_static/fonts/source-serif-pro/EOT/SourceSerifPro-Bold.eot b/docs/m2met2/_build/html/_static/fonts/source-serif-pro/EOT/SourceSerifPro-Bold.eot
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/source-serif-pro/EOT/SourceSerifPro-Bold.eot
rename to docs/m2met2/_build/html/_static/fonts/source-serif-pro/EOT/SourceSerifPro-Bold.eot
diff --git a/docs_m2met2/_build/html/_static/fonts/source-serif-pro/EOT/SourceSerifPro-ExtraLight.eot b/docs/m2met2/_build/html/_static/fonts/source-serif-pro/EOT/SourceSerifPro-ExtraLight.eot
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/source-serif-pro/EOT/SourceSerifPro-ExtraLight.eot
rename to docs/m2met2/_build/html/_static/fonts/source-serif-pro/EOT/SourceSerifPro-ExtraLight.eot
diff --git a/docs_m2met2/_build/html/_static/fonts/source-serif-pro/EOT/SourceSerifPro-Light.eot b/docs/m2met2/_build/html/_static/fonts/source-serif-pro/EOT/SourceSerifPro-Light.eot
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/source-serif-pro/EOT/SourceSerifPro-Light.eot
rename to docs/m2met2/_build/html/_static/fonts/source-serif-pro/EOT/SourceSerifPro-Light.eot
diff --git a/docs_m2met2/_build/html/_static/fonts/source-serif-pro/EOT/SourceSerifPro-Regular.eot b/docs/m2met2/_build/html/_static/fonts/source-serif-pro/EOT/SourceSerifPro-Regular.eot
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/source-serif-pro/EOT/SourceSerifPro-Regular.eot
rename to docs/m2met2/_build/html/_static/fonts/source-serif-pro/EOT/SourceSerifPro-Regular.eot
diff --git a/docs_m2met2/_build/html/_static/fonts/source-serif-pro/EOT/SourceSerifPro-Semibold.eot b/docs/m2met2/_build/html/_static/fonts/source-serif-pro/EOT/SourceSerifPro-Semibold.eot
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/source-serif-pro/EOT/SourceSerifPro-Semibold.eot
rename to docs/m2met2/_build/html/_static/fonts/source-serif-pro/EOT/SourceSerifPro-Semibold.eot
diff --git a/docs_m2met2/_build/html/_static/fonts/source-serif-pro/LICENSE.txt b/docs/m2met2/_build/html/_static/fonts/source-serif-pro/LICENSE.txt
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/source-serif-pro/LICENSE.txt
rename to docs/m2met2/_build/html/_static/fonts/source-serif-pro/LICENSE.txt
diff --git a/docs_m2met2/_build/html/_static/fonts/source-serif-pro/OTF/SourceSerifPro-Black.otf b/docs/m2met2/_build/html/_static/fonts/source-serif-pro/OTF/SourceSerifPro-Black.otf
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/source-serif-pro/OTF/SourceSerifPro-Black.otf
rename to docs/m2met2/_build/html/_static/fonts/source-serif-pro/OTF/SourceSerifPro-Black.otf
diff --git a/docs_m2met2/_build/html/_static/fonts/source-serif-pro/OTF/SourceSerifPro-Bold.otf b/docs/m2met2/_build/html/_static/fonts/source-serif-pro/OTF/SourceSerifPro-Bold.otf
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/source-serif-pro/OTF/SourceSerifPro-Bold.otf
rename to docs/m2met2/_build/html/_static/fonts/source-serif-pro/OTF/SourceSerifPro-Bold.otf
diff --git a/docs_m2met2/_build/html/_static/fonts/source-serif-pro/OTF/SourceSerifPro-ExtraLight.otf b/docs/m2met2/_build/html/_static/fonts/source-serif-pro/OTF/SourceSerifPro-ExtraLight.otf
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/source-serif-pro/OTF/SourceSerifPro-ExtraLight.otf
rename to docs/m2met2/_build/html/_static/fonts/source-serif-pro/OTF/SourceSerifPro-ExtraLight.otf
diff --git a/docs_m2met2/_build/html/_static/fonts/source-serif-pro/OTF/SourceSerifPro-Light.otf b/docs/m2met2/_build/html/_static/fonts/source-serif-pro/OTF/SourceSerifPro-Light.otf
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/source-serif-pro/OTF/SourceSerifPro-Light.otf
rename to docs/m2met2/_build/html/_static/fonts/source-serif-pro/OTF/SourceSerifPro-Light.otf
diff --git a/docs_m2met2/_build/html/_static/fonts/source-serif-pro/OTF/SourceSerifPro-Regular.otf b/docs/m2met2/_build/html/_static/fonts/source-serif-pro/OTF/SourceSerifPro-Regular.otf
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/source-serif-pro/OTF/SourceSerifPro-Regular.otf
rename to docs/m2met2/_build/html/_static/fonts/source-serif-pro/OTF/SourceSerifPro-Regular.otf
diff --git a/docs_m2met2/_build/html/_static/fonts/source-serif-pro/OTF/SourceSerifPro-Semibold.otf b/docs/m2met2/_build/html/_static/fonts/source-serif-pro/OTF/SourceSerifPro-Semibold.otf
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/source-serif-pro/OTF/SourceSerifPro-Semibold.otf
rename to docs/m2met2/_build/html/_static/fonts/source-serif-pro/OTF/SourceSerifPro-Semibold.otf
diff --git a/docs_m2met2/_build/html/_static/fonts/source-serif-pro/README.md b/docs/m2met2/_build/html/_static/fonts/source-serif-pro/README.md
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/source-serif-pro/README.md
rename to docs/m2met2/_build/html/_static/fonts/source-serif-pro/README.md
diff --git a/docs_m2met2/_build/html/_static/fonts/source-serif-pro/ReadMe.html b/docs/m2met2/_build/html/_static/fonts/source-serif-pro/ReadMe.html
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/source-serif-pro/ReadMe.html
rename to docs/m2met2/_build/html/_static/fonts/source-serif-pro/ReadMe.html
diff --git a/docs_m2met2/_build/html/_static/fonts/source-serif-pro/SourceSerifProReadMe.html b/docs/m2met2/_build/html/_static/fonts/source-serif-pro/SourceSerifProReadMe.html
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/source-serif-pro/SourceSerifProReadMe.html
rename to docs/m2met2/_build/html/_static/fonts/source-serif-pro/SourceSerifProReadMe.html
diff --git a/docs_m2met2/_build/html/_static/fonts/source-serif-pro/TTF/SourceSerifPro-Black.ttf b/docs/m2met2/_build/html/_static/fonts/source-serif-pro/TTF/SourceSerifPro-Black.ttf
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/source-serif-pro/TTF/SourceSerifPro-Black.ttf
rename to docs/m2met2/_build/html/_static/fonts/source-serif-pro/TTF/SourceSerifPro-Black.ttf
diff --git a/docs_m2met2/_build/html/_static/fonts/source-serif-pro/TTF/SourceSerifPro-Bold.ttf b/docs/m2met2/_build/html/_static/fonts/source-serif-pro/TTF/SourceSerifPro-Bold.ttf
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/source-serif-pro/TTF/SourceSerifPro-Bold.ttf
rename to docs/m2met2/_build/html/_static/fonts/source-serif-pro/TTF/SourceSerifPro-Bold.ttf
diff --git a/docs_m2met2/_build/html/_static/fonts/source-serif-pro/TTF/SourceSerifPro-ExtraLight.ttf b/docs/m2met2/_build/html/_static/fonts/source-serif-pro/TTF/SourceSerifPro-ExtraLight.ttf
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/source-serif-pro/TTF/SourceSerifPro-ExtraLight.ttf
rename to docs/m2met2/_build/html/_static/fonts/source-serif-pro/TTF/SourceSerifPro-ExtraLight.ttf
diff --git a/docs_m2met2/_build/html/_static/fonts/source-serif-pro/TTF/SourceSerifPro-Light.ttf b/docs/m2met2/_build/html/_static/fonts/source-serif-pro/TTF/SourceSerifPro-Light.ttf
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/source-serif-pro/TTF/SourceSerifPro-Light.ttf
rename to docs/m2met2/_build/html/_static/fonts/source-serif-pro/TTF/SourceSerifPro-Light.ttf
diff --git a/docs_m2met2/_build/html/_static/fonts/source-serif-pro/TTF/SourceSerifPro-Regular.ttf b/docs/m2met2/_build/html/_static/fonts/source-serif-pro/TTF/SourceSerifPro-Regular.ttf
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/source-serif-pro/TTF/SourceSerifPro-Regular.ttf
rename to docs/m2met2/_build/html/_static/fonts/source-serif-pro/TTF/SourceSerifPro-Regular.ttf
diff --git a/docs_m2met2/_build/html/_static/fonts/source-serif-pro/TTF/SourceSerifPro-Semibold.ttf b/docs/m2met2/_build/html/_static/fonts/source-serif-pro/TTF/SourceSerifPro-Semibold.ttf
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/source-serif-pro/TTF/SourceSerifPro-Semibold.ttf
rename to docs/m2met2/_build/html/_static/fonts/source-serif-pro/TTF/SourceSerifPro-Semibold.ttf
diff --git a/docs_m2met2/_build/html/_static/fonts/source-serif-pro/WOFF/OTF/SourceSerifPro-Black.otf.woff b/docs/m2met2/_build/html/_static/fonts/source-serif-pro/WOFF/OTF/SourceSerifPro-Black.otf.woff
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/source-serif-pro/WOFF/OTF/SourceSerifPro-Black.otf.woff
rename to docs/m2met2/_build/html/_static/fonts/source-serif-pro/WOFF/OTF/SourceSerifPro-Black.otf.woff
diff --git a/docs_m2met2/_build/html/_static/fonts/source-serif-pro/WOFF/OTF/SourceSerifPro-Bold.otf.woff b/docs/m2met2/_build/html/_static/fonts/source-serif-pro/WOFF/OTF/SourceSerifPro-Bold.otf.woff
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/source-serif-pro/WOFF/OTF/SourceSerifPro-Bold.otf.woff
rename to docs/m2met2/_build/html/_static/fonts/source-serif-pro/WOFF/OTF/SourceSerifPro-Bold.otf.woff
diff --git a/docs_m2met2/_build/html/_static/fonts/source-serif-pro/WOFF/OTF/SourceSerifPro-ExtraLight.otf.woff b/docs/m2met2/_build/html/_static/fonts/source-serif-pro/WOFF/OTF/SourceSerifPro-ExtraLight.otf.woff
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/source-serif-pro/WOFF/OTF/SourceSerifPro-ExtraLight.otf.woff
rename to docs/m2met2/_build/html/_static/fonts/source-serif-pro/WOFF/OTF/SourceSerifPro-ExtraLight.otf.woff
diff --git a/docs_m2met2/_build/html/_static/fonts/source-serif-pro/WOFF/OTF/SourceSerifPro-Light.otf.woff b/docs/m2met2/_build/html/_static/fonts/source-serif-pro/WOFF/OTF/SourceSerifPro-Light.otf.woff
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/source-serif-pro/WOFF/OTF/SourceSerifPro-Light.otf.woff
rename to docs/m2met2/_build/html/_static/fonts/source-serif-pro/WOFF/OTF/SourceSerifPro-Light.otf.woff
diff --git a/docs_m2met2/_build/html/_static/fonts/source-serif-pro/WOFF/OTF/SourceSerifPro-Regular.otf.woff b/docs/m2met2/_build/html/_static/fonts/source-serif-pro/WOFF/OTF/SourceSerifPro-Regular.otf.woff
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/source-serif-pro/WOFF/OTF/SourceSerifPro-Regular.otf.woff
rename to docs/m2met2/_build/html/_static/fonts/source-serif-pro/WOFF/OTF/SourceSerifPro-Regular.otf.woff
diff --git a/docs_m2met2/_build/html/_static/fonts/source-serif-pro/WOFF/OTF/SourceSerifPro-Semibold.otf.woff b/docs/m2met2/_build/html/_static/fonts/source-serif-pro/WOFF/OTF/SourceSerifPro-Semibold.otf.woff
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/source-serif-pro/WOFF/OTF/SourceSerifPro-Semibold.otf.woff
rename to docs/m2met2/_build/html/_static/fonts/source-serif-pro/WOFF/OTF/SourceSerifPro-Semibold.otf.woff
diff --git a/docs_m2met2/_build/html/_static/fonts/source-serif-pro/WOFF/TTF/SourceSerifPro-Black.ttf.woff b/docs/m2met2/_build/html/_static/fonts/source-serif-pro/WOFF/TTF/SourceSerifPro-Black.ttf.woff
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/source-serif-pro/WOFF/TTF/SourceSerifPro-Black.ttf.woff
rename to docs/m2met2/_build/html/_static/fonts/source-serif-pro/WOFF/TTF/SourceSerifPro-Black.ttf.woff
diff --git a/docs_m2met2/_build/html/_static/fonts/source-serif-pro/WOFF/TTF/SourceSerifPro-Bold.ttf.woff b/docs/m2met2/_build/html/_static/fonts/source-serif-pro/WOFF/TTF/SourceSerifPro-Bold.ttf.woff
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/source-serif-pro/WOFF/TTF/SourceSerifPro-Bold.ttf.woff
rename to docs/m2met2/_build/html/_static/fonts/source-serif-pro/WOFF/TTF/SourceSerifPro-Bold.ttf.woff
diff --git a/docs_m2met2/_build/html/_static/fonts/source-serif-pro/WOFF/TTF/SourceSerifPro-ExtraLight.ttf.woff b/docs/m2met2/_build/html/_static/fonts/source-serif-pro/WOFF/TTF/SourceSerifPro-ExtraLight.ttf.woff
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/source-serif-pro/WOFF/TTF/SourceSerifPro-ExtraLight.ttf.woff
rename to docs/m2met2/_build/html/_static/fonts/source-serif-pro/WOFF/TTF/SourceSerifPro-ExtraLight.ttf.woff
diff --git a/docs_m2met2/_build/html/_static/fonts/source-serif-pro/WOFF/TTF/SourceSerifPro-Light.ttf.woff b/docs/m2met2/_build/html/_static/fonts/source-serif-pro/WOFF/TTF/SourceSerifPro-Light.ttf.woff
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/source-serif-pro/WOFF/TTF/SourceSerifPro-Light.ttf.woff
rename to docs/m2met2/_build/html/_static/fonts/source-serif-pro/WOFF/TTF/SourceSerifPro-Light.ttf.woff
diff --git a/docs_m2met2/_build/html/_static/fonts/source-serif-pro/WOFF/TTF/SourceSerifPro-Regular.ttf.woff b/docs/m2met2/_build/html/_static/fonts/source-serif-pro/WOFF/TTF/SourceSerifPro-Regular.ttf.woff
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/source-serif-pro/WOFF/TTF/SourceSerifPro-Regular.ttf.woff
rename to docs/m2met2/_build/html/_static/fonts/source-serif-pro/WOFF/TTF/SourceSerifPro-Regular.ttf.woff
diff --git a/docs_m2met2/_build/html/_static/fonts/source-serif-pro/WOFF/TTF/SourceSerifPro-Semibold.ttf.woff b/docs/m2met2/_build/html/_static/fonts/source-serif-pro/WOFF/TTF/SourceSerifPro-Semibold.ttf.woff
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/source-serif-pro/WOFF/TTF/SourceSerifPro-Semibold.ttf.woff
rename to docs/m2met2/_build/html/_static/fonts/source-serif-pro/WOFF/TTF/SourceSerifPro-Semibold.ttf.woff
diff --git a/docs_m2met2/_build/html/_static/fonts/source-serif-pro/bower.json b/docs/m2met2/_build/html/_static/fonts/source-serif-pro/bower.json
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/source-serif-pro/bower.json
rename to docs/m2met2/_build/html/_static/fonts/source-serif-pro/bower.json
diff --git a/docs_m2met2/_build/html/_static/fonts/source-serif-pro/source-serif-pro.css b/docs/m2met2/_build/html/_static/fonts/source-serif-pro/source-serif-pro.css
similarity index 100%
rename from docs_m2met2/_build/html/_static/fonts/source-serif-pro/source-serif-pro.css
rename to docs/m2met2/_build/html/_static/fonts/source-serif-pro/source-serif-pro.css
diff --git a/docs_m2met2/_build/html/_static/guzzle.css b/docs/m2met2/_build/html/_static/guzzle.css
similarity index 100%
rename from docs_m2met2/_build/html/_static/guzzle.css
rename to docs/m2met2/_build/html/_static/guzzle.css
diff --git a/docs_m2met2/_build/html/_static/jquery-3.6.0.js b/docs/m2met2/_build/html/_static/jquery-3.6.0.js
similarity index 100%
rename from docs_m2met2/_build/html/_static/jquery-3.6.0.js
rename to docs/m2met2/_build/html/_static/jquery-3.6.0.js
diff --git a/docs_m2met2/_build/html/_static/jquery.js b/docs/m2met2/_build/html/_static/jquery.js
similarity index 100%
rename from docs_m2met2/_build/html/_static/jquery.js
rename to docs/m2met2/_build/html/_static/jquery.js
diff --git a/docs_m2met2/_build/html/_static/jquery.min.map b/docs/m2met2/_build/html/_static/jquery.min.map
similarity index 100%
rename from docs_m2met2/_build/html/_static/jquery.min.map
rename to docs/m2met2/_build/html/_static/jquery.min.map
diff --git a/docs_m2met2/_build/html/_static/js/bootstrap.js b/docs/m2met2/_build/html/_static/js/bootstrap.js
similarity index 100%
rename from docs_m2met2/_build/html/_static/js/bootstrap.js
rename to docs/m2met2/_build/html/_static/js/bootstrap.js
diff --git a/docs_m2met2/_build/html/_static/js/bootstrap.min.js b/docs/m2met2/_build/html/_static/js/bootstrap.min.js
similarity index 100%
rename from docs_m2met2/_build/html/_static/js/bootstrap.min.js
rename to docs/m2met2/_build/html/_static/js/bootstrap.min.js
diff --git a/docs_m2met2/_build/html/_static/language_data.js b/docs/m2met2/_build/html/_static/language_data.js
similarity index 100%
rename from docs_m2met2/_build/html/_static/language_data.js
rename to docs/m2met2/_build/html/_static/language_data.js
diff --git a/docs_m2met2/_build/html/_static/minus.png b/docs/m2met2/_build/html/_static/minus.png
similarity index 100%
rename from docs_m2met2/_build/html/_static/minus.png
rename to docs/m2met2/_build/html/_static/minus.png
diff --git a/docs_m2met2/_build/html/_static/plus.png b/docs/m2met2/_build/html/_static/plus.png
similarity index 100%
rename from docs_m2met2/_build/html/_static/plus.png
rename to docs/m2met2/_build/html/_static/plus.png
diff --git a/docs_m2met2/_build/html/_static/pygments.css b/docs/m2met2/_build/html/_static/pygments.css
similarity index 100%
rename from docs_m2met2/_build/html/_static/pygments.css
rename to docs/m2met2/_build/html/_static/pygments.css
diff --git a/docs_m2met2/_build/html/_static/searchtools.js b/docs/m2met2/_build/html/_static/searchtools.js
similarity index 100%
rename from docs_m2met2/_build/html/_static/searchtools.js
rename to docs/m2met2/_build/html/_static/searchtools.js
diff --git a/docs_m2met2/_build/html/_static/sphinx_highlight.js b/docs/m2met2/_build/html/_static/sphinx_highlight.js
similarity index 100%
rename from docs_m2met2/_build/html/_static/sphinx_highlight.js
rename to docs/m2met2/_build/html/_static/sphinx_highlight.js
diff --git a/docs_m2met2/_build/html/_static/underscore-1.13.1.js b/docs/m2met2/_build/html/_static/underscore-1.13.1.js
similarity index 100%
rename from docs_m2met2/_build/html/_static/underscore-1.13.1.js
rename to docs/m2met2/_build/html/_static/underscore-1.13.1.js
diff --git a/docs_m2met2/_build/html/_static/underscore.js b/docs/m2met2/_build/html/_static/underscore.js
similarity index 100%
rename from docs_m2met2/_build/html/_static/underscore.js
rename to docs/m2met2/_build/html/_static/underscore.js
diff --git a/docs_m2met2/_build/html/genindex.html b/docs/m2met2/_build/html/genindex.html
similarity index 98%
rename from docs_m2met2/_build/html/genindex.html
rename to docs/m2met2/_build/html/genindex.html
index 0071a1845..e7e17b6ed 100644
--- a/docs_m2met2/_build/html/genindex.html
+++ b/docs/m2met2/_build/html/genindex.html
@@ -79,7 +79,7 @@
Track & Evaluation
diff --git a/docs_m2met2/_build/html/index.html b/docs/m2met2/_build/html/index.html
similarity index 93%
rename from docs_m2met2/_build/html/index.html
rename to docs/m2met2/_build/html/index.html
index a65dfa0cb..dcbb8cb03 100644
--- a/docs_m2met2/_build/html/index.html
+++ b/docs/m2met2/_build/html/index.html
@@ -84,7 +84,7 @@
Track & Evaluation
@@ -135,14 +135,6 @@ To facilitate reproducible research, we provide a comprehensive overview of the
Contact
-
-
diff --git a/docs_m2met2/_build/html/objects.inv b/docs/m2met2/_build/html/objects.inv
similarity index 100%
rename from docs_m2met2/_build/html/objects.inv
rename to docs/m2met2/_build/html/objects.inv
diff --git a/docs_m2met2/_build/html/search.html b/docs/m2met2/_build/html/search.html
similarity index 98%
rename from docs_m2met2/_build/html/search.html
rename to docs/m2met2/_build/html/search.html
index 344ad958a..71adf366d 100644
--- a/docs_m2met2/_build/html/search.html
+++ b/docs/m2met2/_build/html/search.html
@@ -72,7 +72,7 @@
Track & Evaluation
diff --git a/docs/m2met2/_build/html/searchindex.js b/docs/m2met2/_build/html/searchindex.js
new file mode 100644
index 000000000..54443a001
--- /dev/null
+++ b/docs/m2met2/_build/html/searchindex.js
@@ -0,0 +1 @@
+Search.setIndex({"docnames": ["Baseline", "Contact", "Dataset", "Introduction", "Organizers", "Rules", "Track_setting_and_evaluation", "index"], "filenames": ["Baseline.md", "Contact.md", "Dataset.md", "Introduction.md", "Organizers.md", "Rules.md", "Track_setting_and_evaluation.md", "index.rst"], "titles": ["Baseline", "Contact", "Datasets", "Introduction", "Organizers", "Rules", "Track & Evaluation", "ASRU 2023 MULTI-CHANNEL MULTI-PARTY MEETING TRANSCRIPTION CHALLENGE 2.0 (M2MeT2.0)"], "terms": {"we": [0, 2, 3, 7], "releas": [0, 2, 3, 6], "an": [0, 2, 3, 6], "e2": 0, "sa": 0, "asr": [0, 3, 7], "cite": 0, "kanda21b_interspeech": 0, "conduct": [0, 2], "funasr": 0, "time": [0, 6], "accord": [0, 3], "timelin": [0, 2], "The": [0, 2, 3, 5, 6], "model": [0, 2, 3, 5, 6], "architectur": 0, "i": [0, 2, 3, 5], "shown": [0, 2], "figur": [0, 6], "3": [0, 2, 3], "speakerencod": 0, "initi": 0, "pre": [0, 6], "train": [0, 3, 5, 7], "speaker": [0, 2, 3, 7], "verif": 0, "from": [0, 2, 3, 5, 6], "modelscop": [0, 6], "thi": [0, 3, 5, 6], "also": [0, 2, 6], "us": [0, 2, 5, 6], "extract": 0, "embed": 0, "profil": 0, "todo": 0, "fill": 0, "readm": 0, "md": 0, "system": [0, 3, 5, 6, 7], "ar": [0, 2, 3, 5, 6, 7], "tabl": [0, 2], "adopt": 0, "oracl": [0, 6], "dure": [0, 2, 6], "howev": [0, 3, 6], "due": [0, 3], "lack": 0, "label": [0, 5, 6], "evalu": [0, 2, 3, 7], "provid": [0, 2, 6, 7], "addit": [0, 6], "spectral": 0, "cluster": 0, "meanwhil": 0, "eval": [0, 2, 5, 6], "test": [0, 2, 3, 5, 6], "set": [0, 2, 3, 5, 6], "show": 0, "impact": 0, "accuraci": [0, 6], "If": [1, 5, 6], "you": 1, "have": [1, 3], "ani": [1, 5, 6], "question": 1, "about": 1, "m2met2": [1, 3], "0": [1, 2, 3], "challeng": [1, 3, 5, 6], "pleas": 1, "u": [1, 2], "email": [1, 3, 4], "m2met": [1, 3, 6, 7], "alimeet": [1, 6], "gmail": 1, "com": [1, 4], "wechat": 1, "group": [1, 2], "In": [2, 3, 5], "fix": [2, 3, 7], "condit": [2, 3, 7], "restrict": 2, "three": [2, 3, 6], "publicli": [2, 6], "avail": [2, 6], "corpora": 2, "name": 2, "aishel": [2, 4, 6], "4": [2, 6], "cn": [2, 4, 6], "celeb": [2, 6], "To": [2, 3, 7], "perform": [2, 3], "new": [2, 3, 6], "call": 2, "2023": [2, 3, 5, 6], "score": [2, 6], "rank": [2, 3, 6], "describ": 2, "contain": [2, 6], "118": 2, "75": 2, "hour": [2, 3, 6], "speech": [2, 3, 6, 7], "total": [2, 6], "divid": [2, 6], "104": 2, "10": [2, 3, 6], "specif": [2, 6], "212": 2, "8": [2, 3], "20": 2, "session": [2, 3, 6, 7], "respect": 2, "each": [2, 3, 6], "consist": [2, 6], "15": [2, 3], "30": 2, "minut": 2, "discuss": 2, "particip": [2, 5, 6], "number": [2, 3, 6], "456": 2, "25": 2, "60": 2, "balanc": 2, "gender": 2, "coverag": 2, "collect": 2, "13": [2, 3], "meet": [2, 3, 6], "venu": 2, "which": [2, 3, 6], "categor": 2, "type": 2, "small": 2, "medium": 2, "larg": [2, 3], "room": [2, 3], "size": 2, "rang": 2, "m": 2, "2": [2, 6], "55": 2, "differ": [2, 3, 6], "give": 2, "varieti": 2, "acoust": [2, 3, 6], "properti": 2, "layout": 2, "paramet": [2, 5], "togeth": 2, "wall": 2, "materi": 2, "cover": 2, "cement": 2, "glass": 2, "etc": 2, "other": 2, "furnish": 2, "includ": [2, 3, 5, 6], "sofa": 2, "tv": 2, "blackboard": 2, "fan": 2, "air": 2, "condition": 2, "plant": 2, "record": [2, 6], "sit": 2, "around": 2, "microphon": [2, 3], "arrai": [2, 3], "place": 2, "natur": 2, "convers": 2, "distanc": 2, "5": 2, "all": [2, 3, 5, 6], "nativ": 2, "chines": 2, "speak": [2, 3], "mandarin": [2, 3], "without": 2, "strong": 2, "accent": 2, "variou": [2, 3], "kind": 2, "indoor": 2, "nois": [2, 3, 5], "limit": [2, 3, 5], "click": 2, "keyboard": 2, "door": 2, "open": [2, 3, 7], "close": 2, "bubbl": 2, "made": [2, 3], "For": 2, "both": [2, 6], "requir": [2, 3, 6], "remain": [2, 3], "same": [2, 5], "posit": 2, "There": 2, "overlap": [2, 3], "between": [2, 6], "exampl": 2, "fig": 2, "1": 2, "within": [2, 3], "one": [2, 5], "ensur": 2, "ratio": 2, "select": [2, 3, 5, 6], "topic": 2, "medic": 2, "treatment": 2, "educ": 2, "busi": 2, "organ": [2, 3, 5, 6, 7], "manag": 2, "industri": [2, 3], "product": 2, "daili": 2, "routin": 2, "averag": 2, "42": 2, "27": 2, "34": 2, "76": 2, "more": 2, "A": [2, 4], "distribut": 2, "were": 2, "ident": [2, 6], "compris": [2, 3, 7], "therebi": 2, "share": 2, "similar": 2, "configur": 2, "field": [2, 3, 6], "signal": [2, 3], "headset": 2, "onli": [2, 5, 6], "": [2, 6], "own": 2, "transcrib": [2, 3, 6], "It": [2, 6], "worth": [2, 6], "note": [2, 6], "far": [2, 3], "audio": [2, 3, 6], "synchron": 2, "common": 2, "transcript": [2, 3, 5, 6], "prepar": 2, "textgrid": 2, "format": 2, "inform": [2, 3], "durat": 2, "id": 2, "segment": [2, 6], "timestamp": [2, 6], "mention": 2, "abov": 2, "can": [2, 3, 5, 6], "download": 2, "openslr": 2, "via": 2, "follow": [2, 5], "link": 2, "particularli": 2, "baselin": [2, 3, 7], "conveni": 2, "script": 2, "automat": [3, 7], "recognit": [3, 7], "diariz": 3, "signific": 3, "stride": 3, "recent": 3, "year": 3, "result": 3, "surg": 3, "technologi": 3, "applic": 3, "across": 3, "domain": 3, "present": 3, "uniqu": [3, 6], "complex": [3, 5], "divers": 3, "style": 3, "variabl": 3, "confer": 3, "environment": 3, "reverber": [3, 5], "over": 3, "sever": 3, "been": 3, "advanc": [3, 7], "develop": [3, 6], "rich": 3, "comput": [3, 5], "hear": 3, "multisourc": 3, "environ": 3, "chime": 3, "latest": 3, "iter": 3, "ha": 3, "particular": 3, "focu": 3, "distant": 3, "gener": 3, "topologi": 3, "scenario": 3, "while": 3, "progress": 3, "english": 3, "languag": [3, 5], "barrier": 3, "achiev": 3, "compar": 3, "non": 3, "multimod": 3, "base": 3, "process": [3, 6], "misp": 3, "multi": [3, 6], "channel": 3, "parti": [3, 6], "instrument": 3, "seek": 3, "address": 3, "problem": 3, "visual": 3, "everydai": 3, "home": 3, "focus": 3, "tackl": 3, "issu": 3, "offlin": 3, "icassp2022": 3, "two": [3, 5, 7], "main": 3, "task": [3, 6, 7], "former": 3, "involv": [3, 6], "identifi": 3, "who": 3, "spoke": 3, "when": 3, "latter": 3, "aim": 3, "multipl": [3, 6], "simultan": 3, "pose": [3, 6], "technic": 3, "difficulti": 3, "interfer": 3, "build": [3, 6, 7], "success": [3, 7], "previou": 3, "excit": 3, "propos": [3, 7], "asru2023": [3, 7], "special": [3, 5, 7], "origin": [3, 5], "metric": [3, 7], "wa": [3, 6], "independ": 3, "meant": 3, "could": 3, "determin": 3, "correspond": [3, 5], "further": 3, "current": [3, 7], "talker": [3, 7], "toward": 3, "practic": 3, "attribut": [3, 7], "sub": [3, 5, 7], "track": [3, 5, 7], "what": 3, "facilit": [3, 7], "reproduc": [3, 7], "research": [3, 4, 7], "offer": 3, "comprehens": [3, 7], "overview": [3, 7], "dataset": [3, 5, 6, 7], "rule": [3, 7], "furthermor": 3, "carefulli": 3, "curat": 3, "approxim": [3, 6], "design": 3, "enabl": 3, "valid": 3, "state": [3, 6, 7], "art": [3, 7], "area": 3, "april": 3, "29": 3, "registr": 3, "mai": 3, "deadlin": 3, "date": 3, "join": 3, "june": 3, "9": 3, "data": [3, 5, 6], "leaderboard": 3, "final": [3, 5, 6], "submiss": 3, "19": 3, "juli": 3, "paper": [3, 6], "decemb": 3, "12": 3, "16": 3, "asru": 3, "workshop": 3, "interest": 3, "whether": 3, "academia": 3, "must": [3, 5, 6], "regist": 3, "complet": 3, "googl": 3, "form": 3, "below": 3, "work": 3, "dai": 3, "send": 3, "invit": 3, "elig": [3, 5], "team": 3, "qualifi": 3, "adher": [3, 5], "publish": 3, "page": 3, "prior": 3, "submit": 3, "descript": [3, 6], "document": 3, "detail": [3, 6], "approach": [3, 5], "method": 3, "top": 3, "proceed": 3, "lei": 4, "xie": 4, "professor": 4, "northwestern": 4, "polytechn": 4, "univers": 4, "china": 4, "lxie": 4, "nwpu": 4, "edu": 4, "kong": 4, "aik": 4, "lee": 4, "senior": 4, "scientist": 4, "institut": 4, "infocomm": 4, "star": 4, "singapor": 4, "kongaik": 4, "ieee": 4, "org": 4, "zhiji": 4, "yan": 4, "princip": 4, "engin": 4, "alibaba": 4, "yzj": 4, "inc": 4, "shiliang": 4, "zhang": 4, "sly": 4, "zsl": 4, "yanmin": 4, "qian": 4, "shanghai": 4, "jiao": 4, "tong": 4, "yanminqian": 4, "sjtu": 4, "zhuo": 4, "chen": 4, "appli": 4, "microsoft": 4, "usa": 4, "zhuc": 4, "jian": 4, "wu": 4, "wujian": 4, "hui": 4, "bu": 4, "ceo": 4, "foundat": 4, "buhui": 4, "aishelldata": 4, "should": 5, "augment": 5, "allow": [5, 6], "ad": 5, "speed": 5, "perturb": 5, "tone": 5, "chang": 5, "permit": 5, "purpos": 5, "instead": [5, 6], "util": [5, 6], "tune": 5, "violat": 5, "strictli": [5, 6], "prohibit": [5, 6], "fine": 5, "cpcer": [5, 6], "lower": 5, "judg": 5, "superior": 5, "forc": 5, "align": 5, "obtain": [5, 6], "frame": 5, "level": 5, "classif": 5, "basi": 5, "shallow": 5, "fusion": 5, "end": 5, "e": [5, 6], "g": 5, "la": 5, "rnnt": 5, "transform": [5, 6], "come": 5, "right": 5, "interpret": 5, "belong": 5, "case": 5, "circumst": 5, "coordin": 5, "assign": 6, "illustr": 6, "aishell4": 6, "constrain": 6, "sourc": 6, "addition": 6, "corpu": 6, "soon": 6, "simpl": 6, "voic": 6, "activ": 6, "detect": 6, "vad": 6, "concaten": 6, "minimum": 6, "permut": 6, "charact": 6, "error": 6, "rate": 6, "calcul": 6, "step": 6, "firstli": 6, "refer": 6, "hypothesi": 6, "chronolog": 6, "order": 6, "secondli": 6, "cer": 6, "repeat": 6, "possibl": 6, "lowest": 6, "tthe": 6, "insert": 6, "Ins": 6, "substitut": 6, "delet": 6, "del": 6, "output": 6, "text": 6, "frac": 6, "mathcal": 6, "n_": 6, "100": 6, "where": 6, "usag": 6, "third": 6, "hug": 6, "face": 6, "list": 6, "clearli": 6, "privat": 6, "manual": 6, "simul": 6, "thei": 6, "mandatori": 6, "clear": 6, "scheme": 6, "delight": 7, "introduct": 7, "contact": 7}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"baselin": 0, "overview": [0, 2], "quick": 0, "start": 0, "result": 0, "contact": 1, "dataset": 2, "train": [2, 6], "data": 2, "detail": 2, "alimeet": 2, "corpu": 2, "get": 2, "introduct": 3, "call": 3, "particip": 3, "timelin": 3, "aoe": 3, "time": 3, "guidelin": 3, "organ": 4, "rule": 5, "track": 6, "evalu": 6, "speaker": 6, "attribut": 6, "asr": 6, "metric": 6, "sub": 6, "arrang": 6, "i": 6, "fix": 6, "condit": 6, "ii": 6, "open": 6, "asru": 7, "2023": 7, "multi": 7, "channel": 7, "parti": 7, "meet": 7, "transcript": 7, "challeng": 7, "2": 7, "0": 7, "m2met2": 7, "content": 7}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 8, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx": 57}, "alltitles": {"Baseline": [[0, "baseline"]], "Overview": [[0, "overview"]], "Quick start": [[0, "quick-start"]], "Baseline results": [[0, "baseline-results"]], "Contact": [[1, "contact"]], "Datasets": [[2, "datasets"]], "Overview of training data": [[2, "overview-of-training-data"]], "Detail of AliMeeting corpus": [[2, "detail-of-alimeeting-corpus"]], "Get the data": [[2, "get-the-data"]], "Introduction": [[3, "introduction"]], "Call for participation": [[3, "call-for-participation"]], "Timeline(AOE Time)": [[3, "timeline-aoe-time"]], "Guidelines": [[3, "guidelines"]], "Organizers": [[4, "organizers"]], "Rules": [[5, "rules"]], "Track & Evaluation": [[6, "track-evaluation"]], "Speaker-Attributed ASR": [[6, "speaker-attributed-asr"]], "Evaluation metric": [[6, "evaluation-metric"]], "Sub-track arrangement": [[6, "sub-track-arrangement"]], "Sub-track I (Fixed Training Condition):": [[6, "sub-track-i-fixed-training-condition"]], "Sub-track II (Open Training Condition):": [[6, "sub-track-ii-open-training-condition"]], "ASRU 2023 MULTI-CHANNEL MULTI-PARTY MEETING TRANSCRIPTION CHALLENGE 2.0 (M2MeT2.0)": [[7, "asru-2023-multi-channel-multi-party-meeting-transcription-challenge-2-0-m2met2-0"]], "Contents:": [[7, null]]}, "indexentries": {}})
\ No newline at end of file
diff --git a/docs_m2met2/conf.py b/docs/m2met2/conf.py
similarity index 100%
rename from docs_m2met2/conf.py
rename to docs/m2met2/conf.py
diff --git a/docs_m2met2/images/baseline_result.png b/docs/m2met2/images/baseline_result.png
similarity index 100%
rename from docs_m2met2/images/baseline_result.png
rename to docs/m2met2/images/baseline_result.png
diff --git a/docs_m2met2/images/buhui.jpeg b/docs/m2met2/images/buhui.jpeg
similarity index 100%
rename from docs_m2met2/images/buhui.jpeg
rename to docs/m2met2/images/buhui.jpeg
diff --git a/docs_m2met2/images/chenzhuo.jpg b/docs/m2met2/images/chenzhuo.jpg
similarity index 100%
rename from docs_m2met2/images/chenzhuo.jpg
rename to docs/m2met2/images/chenzhuo.jpg
diff --git a/docs_m2met2/images/dataset_details.png b/docs/m2met2/images/dataset_details.png
similarity index 100%
rename from docs_m2met2/images/dataset_details.png
rename to docs/m2met2/images/dataset_details.png
diff --git a/docs_m2met2/images/kong.png b/docs/m2met2/images/kong.png
similarity index 100%
rename from docs_m2met2/images/kong.png
rename to docs/m2met2/images/kong.png
diff --git a/docs_m2met2/images/lxie.jpeg b/docs/m2met2/images/lxie.jpeg
similarity index 100%
rename from docs_m2met2/images/lxie.jpeg
rename to docs/m2met2/images/lxie.jpeg
diff --git a/docs_m2met2/images/meeting_room.png b/docs/m2met2/images/meeting_room.png
similarity index 100%
rename from docs_m2met2/images/meeting_room.png
rename to docs/m2met2/images/meeting_room.png
diff --git a/docs_m2met2/images/qian.jpeg b/docs/m2met2/images/qian.jpeg
similarity index 100%
rename from docs_m2met2/images/qian.jpeg
rename to docs/m2met2/images/qian.jpeg
diff --git a/docs_m2met2_cn/_build/html/_images/sa_asr_arch.png b/docs/m2met2/images/sa_asr_arch.png
similarity index 100%
rename from docs_m2met2_cn/_build/html/_images/sa_asr_arch.png
rename to docs/m2met2/images/sa_asr_arch.png
diff --git a/docs_m2met2/images/task_diff.png b/docs/m2met2/images/task_diff.png
similarity index 100%
rename from docs_m2met2/images/task_diff.png
rename to docs/m2met2/images/task_diff.png
diff --git a/docs_m2met2/images/wujian.jpg b/docs/m2met2/images/wujian.jpg
similarity index 100%
rename from docs_m2met2/images/wujian.jpg
rename to docs/m2met2/images/wujian.jpg
diff --git a/docs_m2met2/images/zhijie.jpg b/docs/m2met2/images/zhijie.jpg
similarity index 100%
rename from docs_m2met2/images/zhijie.jpg
rename to docs/m2met2/images/zhijie.jpg
diff --git a/docs_m2met2/images/zsl.JPG b/docs/m2met2/images/zsl.JPG
similarity index 100%
rename from docs_m2met2/images/zsl.JPG
rename to docs/m2met2/images/zsl.JPG
diff --git a/docs_m2met2/index.rst b/docs/m2met2/index.rst
similarity index 92%
rename from docs_m2met2/index.rst
rename to docs/m2met2/index.rst
index 04cb9345d..e0e7562c7 100644
--- a/docs_m2met2/index.rst
+++ b/docs/m2met2/index.rst
@@ -20,10 +20,3 @@ To facilitate reproducible research, we provide a comprehensive overview of the
./Rules
./Organizers
./Contact
-
-Indices and tables
-==================
-
-* :ref:`genindex`
-* :ref:`modindex`
-* :ref:`search`
\ No newline at end of file
diff --git a/docs_m2met2/make.bat b/docs/m2met2/make.bat
similarity index 100%
rename from docs_m2met2/make.bat
rename to docs/m2met2/make.bat
diff --git a/docs_m2met2_cn/Makefile b/docs/m2met2_cn/Makefile
similarity index 100%
rename from docs_m2met2_cn/Makefile
rename to docs/m2met2_cn/Makefile
diff --git a/docs/m2met2_cn/_build/doctrees/environment.pickle b/docs/m2met2_cn/_build/doctrees/environment.pickle
new file mode 100644
index 000000000..fb92f83a0
Binary files /dev/null and b/docs/m2met2_cn/_build/doctrees/environment.pickle differ
diff --git a/docs/m2met2_cn/_build/doctrees/index.doctree b/docs/m2met2_cn/_build/doctrees/index.doctree
new file mode 100644
index 000000000..77742ac2a
Binary files /dev/null and b/docs/m2met2_cn/_build/doctrees/index.doctree differ
diff --git a/docs_m2met2_cn/_build/doctrees/基线.doctree b/docs/m2met2_cn/_build/doctrees/基线.doctree
similarity index 99%
rename from docs_m2met2_cn/_build/doctrees/基线.doctree
rename to docs/m2met2_cn/_build/doctrees/基线.doctree
index 27ec7ca19..f88f67d87 100644
Binary files a/docs_m2met2_cn/_build/doctrees/基线.doctree and b/docs/m2met2_cn/_build/doctrees/基线.doctree differ
diff --git a/docs_m2met2_cn/_build/doctrees/数据集.doctree b/docs/m2met2_cn/_build/doctrees/数据集.doctree
similarity index 66%
rename from docs_m2met2_cn/_build/doctrees/数据集.doctree
rename to docs/m2met2_cn/_build/doctrees/数据集.doctree
index 26addbfc8..5950ee3c1 100644
Binary files a/docs_m2met2_cn/_build/doctrees/数据集.doctree and b/docs/m2met2_cn/_build/doctrees/数据集.doctree differ
diff --git a/docs_m2met2_cn/_build/doctrees/简介.doctree b/docs/m2met2_cn/_build/doctrees/简介.doctree
similarity index 55%
rename from docs_m2met2_cn/_build/doctrees/简介.doctree
rename to docs/m2met2_cn/_build/doctrees/简介.doctree
index f2d3b2263..373ee340a 100644
Binary files a/docs_m2met2_cn/_build/doctrees/简介.doctree and b/docs/m2met2_cn/_build/doctrees/简介.doctree differ
diff --git a/docs_m2met2_cn/_build/doctrees/组委会.doctree b/docs/m2met2_cn/_build/doctrees/组委会.doctree
similarity index 99%
rename from docs_m2met2_cn/_build/doctrees/组委会.doctree
rename to docs/m2met2_cn/_build/doctrees/组委会.doctree
index 7b2bf0f4b..551248c38 100644
Binary files a/docs_m2met2_cn/_build/doctrees/组委会.doctree and b/docs/m2met2_cn/_build/doctrees/组委会.doctree differ
diff --git a/docs_m2met2_cn/_build/doctrees/联系方式.doctree b/docs/m2met2_cn/_build/doctrees/联系方式.doctree
similarity index 98%
rename from docs_m2met2_cn/_build/doctrees/联系方式.doctree
rename to docs/m2met2_cn/_build/doctrees/联系方式.doctree
index 988c2b520..df477c8d5 100644
Binary files a/docs_m2met2_cn/_build/doctrees/联系方式.doctree and b/docs/m2met2_cn/_build/doctrees/联系方式.doctree differ
diff --git a/docs_m2met2_cn/_build/doctrees/规则.doctree b/docs/m2met2_cn/_build/doctrees/规则.doctree
similarity index 53%
rename from docs_m2met2_cn/_build/doctrees/规则.doctree
rename to docs/m2met2_cn/_build/doctrees/规则.doctree
index e0b6338e6..1cf759cca 100644
Binary files a/docs_m2met2_cn/_build/doctrees/规则.doctree and b/docs/m2met2_cn/_build/doctrees/规则.doctree differ
diff --git a/docs_m2met2_cn/_build/doctrees/赛道设置与评估.doctree b/docs/m2met2_cn/_build/doctrees/赛道设置与评估.doctree
similarity index 75%
rename from docs_m2met2_cn/_build/doctrees/赛道设置与评估.doctree
rename to docs/m2met2_cn/_build/doctrees/赛道设置与评估.doctree
index 5231301e5..fa83a0c82 100644
Binary files a/docs_m2met2_cn/_build/doctrees/赛道设置与评估.doctree and b/docs/m2met2_cn/_build/doctrees/赛道设置与评估.doctree differ
diff --git a/docs_m2met2_cn/_build/html/.buildinfo b/docs/m2met2_cn/_build/html/.buildinfo
similarity index 100%
rename from docs_m2met2_cn/_build/html/.buildinfo
rename to docs/m2met2_cn/_build/html/.buildinfo
diff --git a/docs_m2met2_cn/_build/html/_images/baseline_result.png b/docs/m2met2_cn/_build/html/_images/baseline_result.png
similarity index 100%
rename from docs_m2met2_cn/_build/html/_images/baseline_result.png
rename to docs/m2met2_cn/_build/html/_images/baseline_result.png
diff --git a/docs_m2met2_cn/_build/html/_images/buhui.jpeg b/docs/m2met2_cn/_build/html/_images/buhui.jpeg
similarity index 100%
rename from docs_m2met2_cn/_build/html/_images/buhui.jpeg
rename to docs/m2met2_cn/_build/html/_images/buhui.jpeg
diff --git a/docs_m2met2_cn/_build/html/_images/chenzhuo.jpg b/docs/m2met2_cn/_build/html/_images/chenzhuo.jpg
similarity index 100%
rename from docs_m2met2_cn/_build/html/_images/chenzhuo.jpg
rename to docs/m2met2_cn/_build/html/_images/chenzhuo.jpg
diff --git a/docs_m2met2_cn/_build/html/_images/dataset_detail.png b/docs/m2met2_cn/_build/html/_images/dataset_detail.png
similarity index 100%
rename from docs_m2met2_cn/_build/html/_images/dataset_detail.png
rename to docs/m2met2_cn/_build/html/_images/dataset_detail.png
diff --git a/docs_m2met2_cn/_build/html/_images/kong.png b/docs/m2met2_cn/_build/html/_images/kong.png
similarity index 100%
rename from docs_m2met2_cn/_build/html/_images/kong.png
rename to docs/m2met2_cn/_build/html/_images/kong.png
diff --git a/docs_m2met2_cn/_build/html/_images/lxie.jpeg b/docs/m2met2_cn/_build/html/_images/lxie.jpeg
similarity index 100%
rename from docs_m2met2_cn/_build/html/_images/lxie.jpeg
rename to docs/m2met2_cn/_build/html/_images/lxie.jpeg
diff --git a/docs_m2met2_cn/_build/html/_images/meeting_room.png b/docs/m2met2_cn/_build/html/_images/meeting_room.png
similarity index 100%
rename from docs_m2met2_cn/_build/html/_images/meeting_room.png
rename to docs/m2met2_cn/_build/html/_images/meeting_room.png
diff --git a/docs_m2met2_cn/_build/html/_images/qian.jpeg b/docs/m2met2_cn/_build/html/_images/qian.jpeg
similarity index 100%
rename from docs_m2met2_cn/_build/html/_images/qian.jpeg
rename to docs/m2met2_cn/_build/html/_images/qian.jpeg
diff --git a/docs_m2met2_cn/images/sa_asr_arch.png b/docs/m2met2_cn/_build/html/_images/sa_asr_arch.png
similarity index 100%
rename from docs_m2met2_cn/images/sa_asr_arch.png
rename to docs/m2met2_cn/_build/html/_images/sa_asr_arch.png
diff --git a/docs_m2met2_cn/_build/html/_images/task_diff.png b/docs/m2met2_cn/_build/html/_images/task_diff.png
similarity index 100%
rename from docs_m2met2_cn/_build/html/_images/task_diff.png
rename to docs/m2met2_cn/_build/html/_images/task_diff.png
diff --git a/docs_m2met2_cn/_build/html/_images/wujian.jpg b/docs/m2met2_cn/_build/html/_images/wujian.jpg
similarity index 100%
rename from docs_m2met2_cn/_build/html/_images/wujian.jpg
rename to docs/m2met2_cn/_build/html/_images/wujian.jpg
diff --git a/docs_m2met2_cn/_build/html/_images/zhijie.jpg b/docs/m2met2_cn/_build/html/_images/zhijie.jpg
similarity index 100%
rename from docs_m2met2_cn/_build/html/_images/zhijie.jpg
rename to docs/m2met2_cn/_build/html/_images/zhijie.jpg
diff --git a/docs_m2met2_cn/_build/html/_images/zsl.JPG b/docs/m2met2_cn/_build/html/_images/zsl.JPG
similarity index 100%
rename from docs_m2met2_cn/_build/html/_images/zsl.JPG
rename to docs/m2met2_cn/_build/html/_images/zsl.JPG
diff --git a/docs_m2met2_cn/_build/html/_sources/index.rst.txt b/docs/m2met2_cn/_build/html/_sources/index.rst.txt
similarity index 91%
rename from docs_m2met2_cn/_build/html/_sources/index.rst.txt
rename to docs/m2met2_cn/_build/html/_sources/index.rst.txt
index b35ac96da..c089b36e7 100644
--- a/docs_m2met2_cn/_build/html/_sources/index.rst.txt
+++ b/docs/m2met2_cn/_build/html/_sources/index.rst.txt
@@ -20,10 +20,3 @@ ASRU 2023 多通道多方会议转录挑战 2.0
./规则
./组委会
./联系方式
-
-Indices and tables
-==================
-
-* :ref:`genindex`
-* :ref:`modindex`
-* :ref:`search`
diff --git a/docs_m2met2_cn/_build/html/_sources/基线.md.txt b/docs/m2met2_cn/_build/html/_sources/基线.md.txt
similarity index 100%
rename from docs_m2met2_cn/_build/html/_sources/基线.md.txt
rename to docs/m2met2_cn/_build/html/_sources/基线.md.txt
diff --git a/docs_m2met2_cn/_build/html/_sources/数据集.md.txt b/docs/m2met2_cn/_build/html/_sources/数据集.md.txt
similarity index 85%
rename from docs_m2met2_cn/_build/html/_sources/数据集.md.txt
rename to docs/m2met2_cn/_build/html/_sources/数据集.md.txt
index 52965a1c5..24bfaf3d9 100644
--- a/docs_m2met2_cn/_build/html/_sources/数据集.md.txt
+++ b/docs/m2met2_cn/_build/html/_sources/数据集.md.txt
@@ -3,13 +3,13 @@
在限定数据集条件下,训练数据集仅限于三个公开的语料库,即AliMeeting、AISHELL-4和CN-Celeb。为了评估参赛者提交的模型的性能,我们将发布一个新的测试集(Test-2023)用于打分和排名。下面我们将详细描述AliMeeting数据集和Test-2023测试集。
## Alimeeting数据集介绍
-AliMeeting总共包含118.75小时的语音数据,包括104.75小时的训练集(Train)、4小时的验证集(Eval)和10小时的测试集(Test)。Train集和Eval集分别包含212场和8场会议,其中每场会议由多个说话人进行15到30分钟的讨论。Train和Eval集中参与会议的总人数分别为456人和25人,并且参会的男女比例人数均衡。
+AliMeeting总共包含118.75小时的语音数据,包括104.75小时的训练集(Train)、4小时的验证集(Eval)和10小时的测试集(Test)。Train集,Eval集和Test集分别包含212场和8场会议,其中每场会议由多个说话人进行15到30分钟的讨论。Train,Eval和Test集中参与会议的总人数分别为456人和25人,并且参会的男女比例人数均衡。
该数据集收集于13个不同的会议室,按照大小规格分为小型、中型和大型三种,房间面积从8到55平方米不等。不同房间具有不同的布局和声学特性,每个房间的详细参数也将发送给参与者。会议场地的墙体材料类型包括水泥、玻璃等。会议场地的家具包括沙发、电视、黑板、风扇、空调、植物等。在录制过程中,麦克风阵列放置于桌上,多个说话人围坐在桌边进行自然对话。麦克风阵列离说话人距离约0.3到5.0米之间。所有说话人的母语均是汉语,并且说的都是普通话,没有浓重的口音。在会议录制期间可能会产生各种室内的噪音,包括键盘声、开门/关门声、风扇声、气泡声等。所有说话人在会议的录制期间均保持相同位置,不发生走动。训练集和验证集的说话人没有重复。图1展示了一个会议室的布局以及麦克风的拓扑结构。

-每场会议的说话人数量从2到4人不等。同时为了覆盖各种内容的会议场景,我们选择了多种会议主题,包括医疗、教育、商业、组织管理、工业生产等不同内容的例会。Train集,Eval集和Test集的平均语音重叠率分别为42.27\%和34.76\%。AliMeeting Train集,Eval集和Test集的详细信息见表1。表2显示了Train集,Eval集和Test集中不同发言者人数会议的语音重叠率和会议数量。
+每场会议的说话人数量从2到4人不等。同时为了覆盖各种内容的会议场景,我们选择了多种会议主题,包括医疗、教育、商业、组织管理、工业生产等不同内容的例会。Train集,Eval集和Test集的平均语音重叠率分别为42.27\%,34.76\%和42.8\%。AliMeeting Train集,Eval集和Test集的详细信息见表1。表2显示了Train集,Eval集和Test集中不同发言者人数会议的语音重叠率和会议数量。

Test-2023测试集由20场会议组成,这些会议是在与AliMeeting数据集相同的声学环境下录制的。Test-2023测试集中的每个会议环节由2到4个参与者组成并且与AliMeeting测试集的配置相似。
diff --git a/docs_m2met2_cn/_build/html/_sources/简介.md.txt b/docs/m2met2_cn/_build/html/_sources/简介.md.txt
similarity index 90%
rename from docs_m2met2_cn/_build/html/_sources/简介.md.txt
rename to docs/m2met2_cn/_build/html/_sources/简介.md.txt
index cf4dfb86a..52df97d6b 100644
--- a/docs_m2met2_cn/_build/html/_sources/简介.md.txt
+++ b/docs/m2met2_cn/_build/html/_sources/简介.md.txt
@@ -13,16 +13,20 @@ ASSP2022 M2MeT挑战的侧重点是会议场景,它包括两个赛道:说话
## 时间安排(AOE时间)
-- $ 2023.5.5: $ 参赛者注册截止
+- $ 2023.4.29: $ 开放注册
+- $ 2023.5.8: $ 基线发布
+- $ 2023.5.15: $ 注册截止
- $ 2023.6.9: $ 测试集数据发布
- $ 2023.6.13: $ 最终结果提交截止
- $ 2023.6.19: $ 评估结果和排名发布
- $ 2023.7.3: $ 论文提交截止
- $ 2023.7.10: $ 最终版论文提交截止
-- $ 2023.12.12: $ ASRU Workshop
+- $ 2023.12.12: $ ASRU Workshop & challenge session
## 竞赛报名
-来自学术界和工业界的有意向参赛者均应在2023年5月5日及之前填写下方的谷歌表单:
+来自学术界和工业界的有意向参赛者均应在2023年5月15日及之前填写下方的谷歌表单:
+
+[M2MET2.0报名](https://docs.google.com/forms/d/e/1FAIpQLSf77T9vAl7Ym-u5g8gXu18SBofoWRaFShBo26Ym0-HDxHW9PQ/viewform?usp=sf_link)
主办方将在3个工作日内通过电子邮件通知符合条件的参赛团队,团队必须遵守将在挑战网站上发布的挑战规则。在排名发布之前,每个参赛者必须提交一份系统描述文件,详细说明使用的方法和模型。主办方将选择前三名纳入ASRU2023论文集。
\ No newline at end of file
diff --git a/docs_m2met2_cn/_build/html/_sources/组委会.md.txt b/docs/m2met2_cn/_build/html/_sources/组委会.md.txt
similarity index 100%
rename from docs_m2met2_cn/_build/html/_sources/组委会.md.txt
rename to docs/m2met2_cn/_build/html/_sources/组委会.md.txt
diff --git a/docs_m2met2_cn/_build/html/_sources/联系方式.md.txt b/docs/m2met2_cn/_build/html/_sources/联系方式.md.txt
similarity index 100%
rename from docs_m2met2_cn/_build/html/_sources/联系方式.md.txt
rename to docs/m2met2_cn/_build/html/_sources/联系方式.md.txt
diff --git a/docs_m2met2_cn/_build/html/_sources/规则.md.txt b/docs/m2met2_cn/_build/html/_sources/规则.md.txt
similarity index 90%
rename from docs_m2met2_cn/_build/html/_sources/规则.md.txt
rename to docs/m2met2_cn/_build/html/_sources/规则.md.txt
index b0928ee54..68cb15972 100644
--- a/docs_m2met2_cn/_build/html/_sources/规则.md.txt
+++ b/docs/m2met2_cn/_build/html/_sources/规则.md.txt
@@ -4,8 +4,6 @@
- 允许在原始训练数据集上进行数据增强,包括但不限于添加噪声或混响、速度扰动和音调变化。
- 允许参赛者使用Eval集进行模型训练,但Test集仅能用于调参和模型选择,严禁以任何形式使用Test-2023数据集,包括但不限于使用测试数据集微调或训练模型。
-
-- 允许多系统融合,但不鼓励使用具有相同结构仅参数不同的子系统融合。
- 如果两个系统的测试cpCER相同,则计算复杂度较低的系统将被认定为更优。
diff --git a/docs_m2met2_cn/_build/html/_sources/赛道设置与评估.md.txt b/docs/m2met2_cn/_build/html/_sources/赛道设置与评估.md.txt
similarity index 86%
rename from docs_m2met2_cn/_build/html/_sources/赛道设置与评估.md.txt
rename to docs/m2met2_cn/_build/html/_sources/赛道设置与评估.md.txt
index a99c1eddc..94a623690 100644
--- a/docs_m2met2_cn/_build/html/_sources/赛道设置与评估.md.txt
+++ b/docs/m2met2_cn/_build/html/_sources/赛道设置与评估.md.txt
@@ -1,6 +1,6 @@
# 赛道设置与评估
-## 说话人相关的语音识别 (主赛道)
-说话人相关的ASR任务需要从重叠的语音中识别每个说话人的语音,并为识别内容分配一个说话人标签。图2展示了说话人相关语音识别任务和多说话人语音识别任务的主要区别。在本次竞赛中AliMeeting、Aishell4和Cn-Celeb数据集可作为受限数据源。在M2MeT挑战赛中使用的AliMeeting数据集包含训练、评估和测试集,在M2MET2.0可以在训练和评估中使用。此外,一个包含约10小时会议数据的新的Test-2023集将根据赛程安排发布并用于挑战赛的评分和排名。值得注意的是,组织者将不提供耳机的近场音频、转录以及真实时间戳。主办方将不再提供每个说话人的真实时间戳,而是在Test-2023集上提供包含多个说话人的片段。这些片段可以通过一个简单的vad模型获得。
+## 说话人相关的语音识别
+说话人相关的ASR任务需要从重叠的语音中识别每个说话人的语音,并为识别内容分配一个说话人标签。图2展示了说话人相关语音识别任务和多说话人语音识别任务的主要区别。在本次竞赛中AliMeeting、Aishell4和Cn-Celeb数据集可作为受限数据源。在M2MeT挑战赛中使用的AliMeeting数据集包含训练、评估和测试集,在M2MET2.0可以在训练和评估中使用。此外,一个包含约10小时会议数据的新的Test-2023集将根据赛程安排发布并用于挑战赛的评分和排名。值得注意的是,对于Test-2023测试集,主办方将不再提供耳机的近场音频、转录以及真实时间戳。而是提供可以通过一个简单的VAD模型得到的包含多个说话人的片段。

@@ -12,6 +12,6 @@ $$ \text{CER} = \frac {\mathcal N_{\text{Ins}} + \mathcal N_{\text{Sub}} + \math
其中 $\mathcal N_{\text{Ins}}$ , $\mathcal N_{\text{Sub}}$ , $\mathcal N_{\text{Del}}$ 是三种错误的字符数, $\mathcal N_{\text{Total}}$ 是字符总数.
## 子赛道设置
### 子赛道一 (限定训练数据):
-参赛者在系统构建过程中仅能使用AliMeeting、AISHELL-4和CN Celeb,严禁使用额外数据。参赛者可以任何第三方开源的预训练模型,如[Hugging Face](https://huggingface.co/models)以及[ModelScope](https://www.modelscope.cn/models)上提供的模型。参赛者需要在最终的系统描述文档中详细列出使用的预训练模型名称以及链接。
+参赛者在系统构建过程中仅能使用AliMeeting、AISHELL-4和CN-Celeb,严禁使用额外数据。参赛者可以任何第三方开源的预训练模型,如[Hugging Face](https://huggingface.co/models)以及[ModelScope](https://www.modelscope.cn/models)上提供的模型。参赛者需要在最终的系统描述文档中详细列出使用的预训练模型名称以及链接。
### 子赛道二 (开放训练数据):
除了限定数据外,参与者可以使用任何公开可用、私人录制和模拟仿真的数据集。但是,参与者必须清楚地列出使用的数据。同样,参赛者也可以使用任何第三方开源的预训练模型,但必须在最后的系统描述文件中明确的列出所使用的数据和模型链接,如果使用模拟仿真数据,请详细描述数据模拟的方案。
\ No newline at end of file
diff --git a/docs_m2met2_cn/_build/html/_static/_sphinx_javascript_frameworks_compat.js b/docs/m2met2_cn/_build/html/_static/_sphinx_javascript_frameworks_compat.js
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/_sphinx_javascript_frameworks_compat.js
rename to docs/m2met2_cn/_build/html/_static/_sphinx_javascript_frameworks_compat.js
diff --git a/docs_m2met2_cn/_build/html/_static/basic.css b/docs/m2met2_cn/_build/html/_static/basic.css
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/basic.css
rename to docs/m2met2_cn/_build/html/_static/basic.css
diff --git a/docs_m2met2_cn/_build/html/_static/css/bootstrap-theme.min.css b/docs/m2met2_cn/_build/html/_static/css/bootstrap-theme.min.css
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/css/bootstrap-theme.min.css
rename to docs/m2met2_cn/_build/html/_static/css/bootstrap-theme.min.css
diff --git a/docs_m2met2_cn/_build/html/_static/css/bootstrap.min.css b/docs/m2met2_cn/_build/html/_static/css/bootstrap.min.css
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/css/bootstrap.min.css
rename to docs/m2met2_cn/_build/html/_static/css/bootstrap.min.css
diff --git a/docs_m2met2_cn/_build/html/_static/doctools.js b/docs/m2met2_cn/_build/html/_static/doctools.js
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/doctools.js
rename to docs/m2met2_cn/_build/html/_static/doctools.js
diff --git a/docs_m2met2_cn/_build/html/_static/documentation_options.js b/docs/m2met2_cn/_build/html/_static/documentation_options.js
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/documentation_options.js
rename to docs/m2met2_cn/_build/html/_static/documentation_options.js
diff --git a/docs_m2met2_cn/_build/html/_static/file.png b/docs/m2met2_cn/_build/html/_static/file.png
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/file.png
rename to docs/m2met2_cn/_build/html/_static/file.png
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/glyphicons-halflings-regular.eot b/docs/m2met2_cn/_build/html/_static/fonts/glyphicons-halflings-regular.eot
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/glyphicons-halflings-regular.eot
rename to docs/m2met2_cn/_build/html/_static/fonts/glyphicons-halflings-regular.eot
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/glyphicons-halflings-regular.svg b/docs/m2met2_cn/_build/html/_static/fonts/glyphicons-halflings-regular.svg
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/glyphicons-halflings-regular.svg
rename to docs/m2met2_cn/_build/html/_static/fonts/glyphicons-halflings-regular.svg
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/glyphicons-halflings-regular.ttf b/docs/m2met2_cn/_build/html/_static/fonts/glyphicons-halflings-regular.ttf
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/glyphicons-halflings-regular.ttf
rename to docs/m2met2_cn/_build/html/_static/fonts/glyphicons-halflings-regular.ttf
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/glyphicons-halflings-regular.woff b/docs/m2met2_cn/_build/html/_static/fonts/glyphicons-halflings-regular.woff
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/glyphicons-halflings-regular.woff
rename to docs/m2met2_cn/_build/html/_static/fonts/glyphicons-halflings-regular.woff
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Bold-webfont.eot b/docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Bold-webfont.eot
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Bold-webfont.eot
rename to docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Bold-webfont.eot
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Bold-webfont.svg b/docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Bold-webfont.svg
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Bold-webfont.svg
rename to docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Bold-webfont.svg
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Bold-webfont.ttf b/docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Bold-webfont.ttf
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Bold-webfont.ttf
rename to docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Bold-webfont.ttf
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Bold-webfont.woff b/docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Bold-webfont.woff
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Bold-webfont.woff
rename to docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Bold-webfont.woff
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-BoldItalic-webfont.eot b/docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-BoldItalic-webfont.eot
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-BoldItalic-webfont.eot
rename to docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-BoldItalic-webfont.eot
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-BoldItalic-webfont.svg b/docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-BoldItalic-webfont.svg
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-BoldItalic-webfont.svg
rename to docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-BoldItalic-webfont.svg
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-BoldItalic-webfont.ttf b/docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-BoldItalic-webfont.ttf
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-BoldItalic-webfont.ttf
rename to docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-BoldItalic-webfont.ttf
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-BoldItalic-webfont.woff b/docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-BoldItalic-webfont.woff
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-BoldItalic-webfont.woff
rename to docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-BoldItalic-webfont.woff
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-ExtraBold-webfont.eot b/docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-ExtraBold-webfont.eot
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-ExtraBold-webfont.eot
rename to docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-ExtraBold-webfont.eot
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-ExtraBold-webfont.svg b/docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-ExtraBold-webfont.svg
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-ExtraBold-webfont.svg
rename to docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-ExtraBold-webfont.svg
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-ExtraBold-webfont.ttf b/docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-ExtraBold-webfont.ttf
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-ExtraBold-webfont.ttf
rename to docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-ExtraBold-webfont.ttf
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-ExtraBold-webfont.woff b/docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-ExtraBold-webfont.woff
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-ExtraBold-webfont.woff
rename to docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-ExtraBold-webfont.woff
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-ExtraBoldItalic-webfont.eot b/docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-ExtraBoldItalic-webfont.eot
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-ExtraBoldItalic-webfont.eot
rename to docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-ExtraBoldItalic-webfont.eot
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-ExtraBoldItalic-webfont.svg b/docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-ExtraBoldItalic-webfont.svg
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-ExtraBoldItalic-webfont.svg
rename to docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-ExtraBoldItalic-webfont.svg
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-ExtraBoldItalic-webfont.ttf b/docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-ExtraBoldItalic-webfont.ttf
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-ExtraBoldItalic-webfont.ttf
rename to docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-ExtraBoldItalic-webfont.ttf
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-ExtraBoldItalic-webfont.woff b/docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-ExtraBoldItalic-webfont.woff
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-ExtraBoldItalic-webfont.woff
rename to docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-ExtraBoldItalic-webfont.woff
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Italic-webfont.eot b/docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Italic-webfont.eot
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Italic-webfont.eot
rename to docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Italic-webfont.eot
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Italic-webfont.svg b/docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Italic-webfont.svg
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Italic-webfont.svg
rename to docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Italic-webfont.svg
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Italic-webfont.ttf b/docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Italic-webfont.ttf
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Italic-webfont.ttf
rename to docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Italic-webfont.ttf
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Italic-webfont.woff b/docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Italic-webfont.woff
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Italic-webfont.woff
rename to docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Italic-webfont.woff
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Light-webfont.eot b/docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Light-webfont.eot
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Light-webfont.eot
rename to docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Light-webfont.eot
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Light-webfont.svg b/docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Light-webfont.svg
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Light-webfont.svg
rename to docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Light-webfont.svg
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Light-webfont.ttf b/docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Light-webfont.ttf
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Light-webfont.ttf
rename to docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Light-webfont.ttf
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Light-webfont.woff b/docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Light-webfont.woff
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Light-webfont.woff
rename to docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Light-webfont.woff
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-LightItalic-webfont.eot b/docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-LightItalic-webfont.eot
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-LightItalic-webfont.eot
rename to docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-LightItalic-webfont.eot
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-LightItalic-webfont.svg b/docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-LightItalic-webfont.svg
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-LightItalic-webfont.svg
rename to docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-LightItalic-webfont.svg
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-LightItalic-webfont.ttf b/docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-LightItalic-webfont.ttf
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-LightItalic-webfont.ttf
rename to docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-LightItalic-webfont.ttf
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-LightItalic-webfont.woff b/docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-LightItalic-webfont.woff
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-LightItalic-webfont.woff
rename to docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-LightItalic-webfont.woff
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Regular-webfont.eot b/docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Regular-webfont.eot
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Regular-webfont.eot
rename to docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Regular-webfont.eot
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Regular-webfont.svg b/docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Regular-webfont.svg
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Regular-webfont.svg
rename to docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Regular-webfont.svg
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Regular-webfont.ttf b/docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Regular-webfont.ttf
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Regular-webfont.ttf
rename to docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Regular-webfont.ttf
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Regular-webfont.woff b/docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Regular-webfont.woff
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Regular-webfont.woff
rename to docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Regular-webfont.woff
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Semibold-webfont.eot b/docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Semibold-webfont.eot
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Semibold-webfont.eot
rename to docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Semibold-webfont.eot
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Semibold-webfont.svg b/docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Semibold-webfont.svg
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Semibold-webfont.svg
rename to docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Semibold-webfont.svg
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Semibold-webfont.ttf b/docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Semibold-webfont.ttf
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Semibold-webfont.ttf
rename to docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Semibold-webfont.ttf
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Semibold-webfont.woff b/docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Semibold-webfont.woff
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Semibold-webfont.woff
rename to docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-Semibold-webfont.woff
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-SemiboldItalic-webfont.eot b/docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-SemiboldItalic-webfont.eot
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-SemiboldItalic-webfont.eot
rename to docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-SemiboldItalic-webfont.eot
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-SemiboldItalic-webfont.svg b/docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-SemiboldItalic-webfont.svg
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-SemiboldItalic-webfont.svg
rename to docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-SemiboldItalic-webfont.svg
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-SemiboldItalic-webfont.ttf b/docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-SemiboldItalic-webfont.ttf
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-SemiboldItalic-webfont.ttf
rename to docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-SemiboldItalic-webfont.ttf
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-SemiboldItalic-webfont.woff b/docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-SemiboldItalic-webfont.woff
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-SemiboldItalic-webfont.woff
rename to docs/m2met2_cn/_build/html/_static/fonts/open-sans/fonts/OpenSans-SemiboldItalic-webfont.woff
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/open-sans/stylesheet.css b/docs/m2met2_cn/_build/html/_static/fonts/open-sans/stylesheet.css
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/open-sans/stylesheet.css
rename to docs/m2met2_cn/_build/html/_static/fonts/open-sans/stylesheet.css
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/source-serif-pro/EOT/SourceSerifPro-Black.eot b/docs/m2met2_cn/_build/html/_static/fonts/source-serif-pro/EOT/SourceSerifPro-Black.eot
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/source-serif-pro/EOT/SourceSerifPro-Black.eot
rename to docs/m2met2_cn/_build/html/_static/fonts/source-serif-pro/EOT/SourceSerifPro-Black.eot
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/source-serif-pro/EOT/SourceSerifPro-Bold.eot b/docs/m2met2_cn/_build/html/_static/fonts/source-serif-pro/EOT/SourceSerifPro-Bold.eot
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/source-serif-pro/EOT/SourceSerifPro-Bold.eot
rename to docs/m2met2_cn/_build/html/_static/fonts/source-serif-pro/EOT/SourceSerifPro-Bold.eot
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/source-serif-pro/EOT/SourceSerifPro-ExtraLight.eot b/docs/m2met2_cn/_build/html/_static/fonts/source-serif-pro/EOT/SourceSerifPro-ExtraLight.eot
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/source-serif-pro/EOT/SourceSerifPro-ExtraLight.eot
rename to docs/m2met2_cn/_build/html/_static/fonts/source-serif-pro/EOT/SourceSerifPro-ExtraLight.eot
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/source-serif-pro/EOT/SourceSerifPro-Light.eot b/docs/m2met2_cn/_build/html/_static/fonts/source-serif-pro/EOT/SourceSerifPro-Light.eot
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/source-serif-pro/EOT/SourceSerifPro-Light.eot
rename to docs/m2met2_cn/_build/html/_static/fonts/source-serif-pro/EOT/SourceSerifPro-Light.eot
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/source-serif-pro/EOT/SourceSerifPro-Regular.eot b/docs/m2met2_cn/_build/html/_static/fonts/source-serif-pro/EOT/SourceSerifPro-Regular.eot
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/source-serif-pro/EOT/SourceSerifPro-Regular.eot
rename to docs/m2met2_cn/_build/html/_static/fonts/source-serif-pro/EOT/SourceSerifPro-Regular.eot
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/source-serif-pro/EOT/SourceSerifPro-Semibold.eot b/docs/m2met2_cn/_build/html/_static/fonts/source-serif-pro/EOT/SourceSerifPro-Semibold.eot
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/source-serif-pro/EOT/SourceSerifPro-Semibold.eot
rename to docs/m2met2_cn/_build/html/_static/fonts/source-serif-pro/EOT/SourceSerifPro-Semibold.eot
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/source-serif-pro/LICENSE.txt b/docs/m2met2_cn/_build/html/_static/fonts/source-serif-pro/LICENSE.txt
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/source-serif-pro/LICENSE.txt
rename to docs/m2met2_cn/_build/html/_static/fonts/source-serif-pro/LICENSE.txt
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/source-serif-pro/OTF/SourceSerifPro-Black.otf b/docs/m2met2_cn/_build/html/_static/fonts/source-serif-pro/OTF/SourceSerifPro-Black.otf
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/source-serif-pro/OTF/SourceSerifPro-Black.otf
rename to docs/m2met2_cn/_build/html/_static/fonts/source-serif-pro/OTF/SourceSerifPro-Black.otf
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/source-serif-pro/OTF/SourceSerifPro-Bold.otf b/docs/m2met2_cn/_build/html/_static/fonts/source-serif-pro/OTF/SourceSerifPro-Bold.otf
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/source-serif-pro/OTF/SourceSerifPro-Bold.otf
rename to docs/m2met2_cn/_build/html/_static/fonts/source-serif-pro/OTF/SourceSerifPro-Bold.otf
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/source-serif-pro/OTF/SourceSerifPro-ExtraLight.otf b/docs/m2met2_cn/_build/html/_static/fonts/source-serif-pro/OTF/SourceSerifPro-ExtraLight.otf
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/source-serif-pro/OTF/SourceSerifPro-ExtraLight.otf
rename to docs/m2met2_cn/_build/html/_static/fonts/source-serif-pro/OTF/SourceSerifPro-ExtraLight.otf
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/source-serif-pro/OTF/SourceSerifPro-Light.otf b/docs/m2met2_cn/_build/html/_static/fonts/source-serif-pro/OTF/SourceSerifPro-Light.otf
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/source-serif-pro/OTF/SourceSerifPro-Light.otf
rename to docs/m2met2_cn/_build/html/_static/fonts/source-serif-pro/OTF/SourceSerifPro-Light.otf
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/source-serif-pro/OTF/SourceSerifPro-Regular.otf b/docs/m2met2_cn/_build/html/_static/fonts/source-serif-pro/OTF/SourceSerifPro-Regular.otf
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/source-serif-pro/OTF/SourceSerifPro-Regular.otf
rename to docs/m2met2_cn/_build/html/_static/fonts/source-serif-pro/OTF/SourceSerifPro-Regular.otf
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/source-serif-pro/OTF/SourceSerifPro-Semibold.otf b/docs/m2met2_cn/_build/html/_static/fonts/source-serif-pro/OTF/SourceSerifPro-Semibold.otf
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/source-serif-pro/OTF/SourceSerifPro-Semibold.otf
rename to docs/m2met2_cn/_build/html/_static/fonts/source-serif-pro/OTF/SourceSerifPro-Semibold.otf
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/source-serif-pro/README.md b/docs/m2met2_cn/_build/html/_static/fonts/source-serif-pro/README.md
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/source-serif-pro/README.md
rename to docs/m2met2_cn/_build/html/_static/fonts/source-serif-pro/README.md
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/source-serif-pro/ReadMe.html b/docs/m2met2_cn/_build/html/_static/fonts/source-serif-pro/ReadMe.html
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/source-serif-pro/ReadMe.html
rename to docs/m2met2_cn/_build/html/_static/fonts/source-serif-pro/ReadMe.html
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/source-serif-pro/SourceSerifProReadMe.html b/docs/m2met2_cn/_build/html/_static/fonts/source-serif-pro/SourceSerifProReadMe.html
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/source-serif-pro/SourceSerifProReadMe.html
rename to docs/m2met2_cn/_build/html/_static/fonts/source-serif-pro/SourceSerifProReadMe.html
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/source-serif-pro/TTF/SourceSerifPro-Black.ttf b/docs/m2met2_cn/_build/html/_static/fonts/source-serif-pro/TTF/SourceSerifPro-Black.ttf
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/source-serif-pro/TTF/SourceSerifPro-Black.ttf
rename to docs/m2met2_cn/_build/html/_static/fonts/source-serif-pro/TTF/SourceSerifPro-Black.ttf
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/source-serif-pro/TTF/SourceSerifPro-Bold.ttf b/docs/m2met2_cn/_build/html/_static/fonts/source-serif-pro/TTF/SourceSerifPro-Bold.ttf
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/source-serif-pro/TTF/SourceSerifPro-Bold.ttf
rename to docs/m2met2_cn/_build/html/_static/fonts/source-serif-pro/TTF/SourceSerifPro-Bold.ttf
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/source-serif-pro/TTF/SourceSerifPro-ExtraLight.ttf b/docs/m2met2_cn/_build/html/_static/fonts/source-serif-pro/TTF/SourceSerifPro-ExtraLight.ttf
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/source-serif-pro/TTF/SourceSerifPro-ExtraLight.ttf
rename to docs/m2met2_cn/_build/html/_static/fonts/source-serif-pro/TTF/SourceSerifPro-ExtraLight.ttf
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/source-serif-pro/TTF/SourceSerifPro-Light.ttf b/docs/m2met2_cn/_build/html/_static/fonts/source-serif-pro/TTF/SourceSerifPro-Light.ttf
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/source-serif-pro/TTF/SourceSerifPro-Light.ttf
rename to docs/m2met2_cn/_build/html/_static/fonts/source-serif-pro/TTF/SourceSerifPro-Light.ttf
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/source-serif-pro/TTF/SourceSerifPro-Regular.ttf b/docs/m2met2_cn/_build/html/_static/fonts/source-serif-pro/TTF/SourceSerifPro-Regular.ttf
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/source-serif-pro/TTF/SourceSerifPro-Regular.ttf
rename to docs/m2met2_cn/_build/html/_static/fonts/source-serif-pro/TTF/SourceSerifPro-Regular.ttf
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/source-serif-pro/TTF/SourceSerifPro-Semibold.ttf b/docs/m2met2_cn/_build/html/_static/fonts/source-serif-pro/TTF/SourceSerifPro-Semibold.ttf
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/source-serif-pro/TTF/SourceSerifPro-Semibold.ttf
rename to docs/m2met2_cn/_build/html/_static/fonts/source-serif-pro/TTF/SourceSerifPro-Semibold.ttf
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/source-serif-pro/WOFF/OTF/SourceSerifPro-Black.otf.woff b/docs/m2met2_cn/_build/html/_static/fonts/source-serif-pro/WOFF/OTF/SourceSerifPro-Black.otf.woff
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/source-serif-pro/WOFF/OTF/SourceSerifPro-Black.otf.woff
rename to docs/m2met2_cn/_build/html/_static/fonts/source-serif-pro/WOFF/OTF/SourceSerifPro-Black.otf.woff
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/source-serif-pro/WOFF/OTF/SourceSerifPro-Bold.otf.woff b/docs/m2met2_cn/_build/html/_static/fonts/source-serif-pro/WOFF/OTF/SourceSerifPro-Bold.otf.woff
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/source-serif-pro/WOFF/OTF/SourceSerifPro-Bold.otf.woff
rename to docs/m2met2_cn/_build/html/_static/fonts/source-serif-pro/WOFF/OTF/SourceSerifPro-Bold.otf.woff
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/source-serif-pro/WOFF/OTF/SourceSerifPro-ExtraLight.otf.woff b/docs/m2met2_cn/_build/html/_static/fonts/source-serif-pro/WOFF/OTF/SourceSerifPro-ExtraLight.otf.woff
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/source-serif-pro/WOFF/OTF/SourceSerifPro-ExtraLight.otf.woff
rename to docs/m2met2_cn/_build/html/_static/fonts/source-serif-pro/WOFF/OTF/SourceSerifPro-ExtraLight.otf.woff
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/source-serif-pro/WOFF/OTF/SourceSerifPro-Light.otf.woff b/docs/m2met2_cn/_build/html/_static/fonts/source-serif-pro/WOFF/OTF/SourceSerifPro-Light.otf.woff
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/source-serif-pro/WOFF/OTF/SourceSerifPro-Light.otf.woff
rename to docs/m2met2_cn/_build/html/_static/fonts/source-serif-pro/WOFF/OTF/SourceSerifPro-Light.otf.woff
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/source-serif-pro/WOFF/OTF/SourceSerifPro-Regular.otf.woff b/docs/m2met2_cn/_build/html/_static/fonts/source-serif-pro/WOFF/OTF/SourceSerifPro-Regular.otf.woff
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/source-serif-pro/WOFF/OTF/SourceSerifPro-Regular.otf.woff
rename to docs/m2met2_cn/_build/html/_static/fonts/source-serif-pro/WOFF/OTF/SourceSerifPro-Regular.otf.woff
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/source-serif-pro/WOFF/OTF/SourceSerifPro-Semibold.otf.woff b/docs/m2met2_cn/_build/html/_static/fonts/source-serif-pro/WOFF/OTF/SourceSerifPro-Semibold.otf.woff
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/source-serif-pro/WOFF/OTF/SourceSerifPro-Semibold.otf.woff
rename to docs/m2met2_cn/_build/html/_static/fonts/source-serif-pro/WOFF/OTF/SourceSerifPro-Semibold.otf.woff
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/source-serif-pro/WOFF/TTF/SourceSerifPro-Black.ttf.woff b/docs/m2met2_cn/_build/html/_static/fonts/source-serif-pro/WOFF/TTF/SourceSerifPro-Black.ttf.woff
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/source-serif-pro/WOFF/TTF/SourceSerifPro-Black.ttf.woff
rename to docs/m2met2_cn/_build/html/_static/fonts/source-serif-pro/WOFF/TTF/SourceSerifPro-Black.ttf.woff
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/source-serif-pro/WOFF/TTF/SourceSerifPro-Bold.ttf.woff b/docs/m2met2_cn/_build/html/_static/fonts/source-serif-pro/WOFF/TTF/SourceSerifPro-Bold.ttf.woff
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/source-serif-pro/WOFF/TTF/SourceSerifPro-Bold.ttf.woff
rename to docs/m2met2_cn/_build/html/_static/fonts/source-serif-pro/WOFF/TTF/SourceSerifPro-Bold.ttf.woff
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/source-serif-pro/WOFF/TTF/SourceSerifPro-ExtraLight.ttf.woff b/docs/m2met2_cn/_build/html/_static/fonts/source-serif-pro/WOFF/TTF/SourceSerifPro-ExtraLight.ttf.woff
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/source-serif-pro/WOFF/TTF/SourceSerifPro-ExtraLight.ttf.woff
rename to docs/m2met2_cn/_build/html/_static/fonts/source-serif-pro/WOFF/TTF/SourceSerifPro-ExtraLight.ttf.woff
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/source-serif-pro/WOFF/TTF/SourceSerifPro-Light.ttf.woff b/docs/m2met2_cn/_build/html/_static/fonts/source-serif-pro/WOFF/TTF/SourceSerifPro-Light.ttf.woff
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/source-serif-pro/WOFF/TTF/SourceSerifPro-Light.ttf.woff
rename to docs/m2met2_cn/_build/html/_static/fonts/source-serif-pro/WOFF/TTF/SourceSerifPro-Light.ttf.woff
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/source-serif-pro/WOFF/TTF/SourceSerifPro-Regular.ttf.woff b/docs/m2met2_cn/_build/html/_static/fonts/source-serif-pro/WOFF/TTF/SourceSerifPro-Regular.ttf.woff
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/source-serif-pro/WOFF/TTF/SourceSerifPro-Regular.ttf.woff
rename to docs/m2met2_cn/_build/html/_static/fonts/source-serif-pro/WOFF/TTF/SourceSerifPro-Regular.ttf.woff
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/source-serif-pro/WOFF/TTF/SourceSerifPro-Semibold.ttf.woff b/docs/m2met2_cn/_build/html/_static/fonts/source-serif-pro/WOFF/TTF/SourceSerifPro-Semibold.ttf.woff
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/source-serif-pro/WOFF/TTF/SourceSerifPro-Semibold.ttf.woff
rename to docs/m2met2_cn/_build/html/_static/fonts/source-serif-pro/WOFF/TTF/SourceSerifPro-Semibold.ttf.woff
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/source-serif-pro/bower.json b/docs/m2met2_cn/_build/html/_static/fonts/source-serif-pro/bower.json
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/source-serif-pro/bower.json
rename to docs/m2met2_cn/_build/html/_static/fonts/source-serif-pro/bower.json
diff --git a/docs_m2met2_cn/_build/html/_static/fonts/source-serif-pro/source-serif-pro.css b/docs/m2met2_cn/_build/html/_static/fonts/source-serif-pro/source-serif-pro.css
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/fonts/source-serif-pro/source-serif-pro.css
rename to docs/m2met2_cn/_build/html/_static/fonts/source-serif-pro/source-serif-pro.css
diff --git a/docs_m2met2_cn/_build/html/_static/guzzle.css b/docs/m2met2_cn/_build/html/_static/guzzle.css
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/guzzle.css
rename to docs/m2met2_cn/_build/html/_static/guzzle.css
diff --git a/docs_m2met2_cn/_build/html/_static/jquery-3.6.0.js b/docs/m2met2_cn/_build/html/_static/jquery-3.6.0.js
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/jquery-3.6.0.js
rename to docs/m2met2_cn/_build/html/_static/jquery-3.6.0.js
diff --git a/docs_m2met2_cn/_build/html/_static/jquery.js b/docs/m2met2_cn/_build/html/_static/jquery.js
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/jquery.js
rename to docs/m2met2_cn/_build/html/_static/jquery.js
diff --git a/docs_m2met2_cn/_build/html/_static/jquery.min.map b/docs/m2met2_cn/_build/html/_static/jquery.min.map
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/jquery.min.map
rename to docs/m2met2_cn/_build/html/_static/jquery.min.map
diff --git a/docs_m2met2_cn/_build/html/_static/js/bootstrap.js b/docs/m2met2_cn/_build/html/_static/js/bootstrap.js
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/js/bootstrap.js
rename to docs/m2met2_cn/_build/html/_static/js/bootstrap.js
diff --git a/docs_m2met2_cn/_build/html/_static/js/bootstrap.min.js b/docs/m2met2_cn/_build/html/_static/js/bootstrap.min.js
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/js/bootstrap.min.js
rename to docs/m2met2_cn/_build/html/_static/js/bootstrap.min.js
diff --git a/docs_m2met2_cn/_build/html/_static/language_data.js b/docs/m2met2_cn/_build/html/_static/language_data.js
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/language_data.js
rename to docs/m2met2_cn/_build/html/_static/language_data.js
diff --git a/docs_m2met2_cn/_build/html/_static/minus.png b/docs/m2met2_cn/_build/html/_static/minus.png
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/minus.png
rename to docs/m2met2_cn/_build/html/_static/minus.png
diff --git a/docs_m2met2_cn/_build/html/_static/plus.png b/docs/m2met2_cn/_build/html/_static/plus.png
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/plus.png
rename to docs/m2met2_cn/_build/html/_static/plus.png
diff --git a/docs_m2met2_cn/_build/html/_static/pygments.css b/docs/m2met2_cn/_build/html/_static/pygments.css
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/pygments.css
rename to docs/m2met2_cn/_build/html/_static/pygments.css
diff --git a/docs_m2met2_cn/_build/html/_static/searchtools.js b/docs/m2met2_cn/_build/html/_static/searchtools.js
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/searchtools.js
rename to docs/m2met2_cn/_build/html/_static/searchtools.js
diff --git a/docs_m2met2_cn/_build/html/_static/sphinx_highlight.js b/docs/m2met2_cn/_build/html/_static/sphinx_highlight.js
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/sphinx_highlight.js
rename to docs/m2met2_cn/_build/html/_static/sphinx_highlight.js
diff --git a/docs_m2met2_cn/_build/html/_static/translations.js b/docs/m2met2_cn/_build/html/_static/translations.js
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/translations.js
rename to docs/m2met2_cn/_build/html/_static/translations.js
diff --git a/docs_m2met2_cn/_build/html/_static/underscore-1.13.1.js b/docs/m2met2_cn/_build/html/_static/underscore-1.13.1.js
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/underscore-1.13.1.js
rename to docs/m2met2_cn/_build/html/_static/underscore-1.13.1.js
diff --git a/docs_m2met2_cn/_build/html/_static/underscore.js b/docs/m2met2_cn/_build/html/_static/underscore.js
similarity index 100%
rename from docs_m2met2_cn/_build/html/_static/underscore.js
rename to docs/m2met2_cn/_build/html/_static/underscore.js
diff --git a/docs_m2met2_cn/_build/html/genindex.html b/docs/m2met2_cn/_build/html/genindex.html
similarity index 99%
rename from docs_m2met2_cn/_build/html/genindex.html
rename to docs/m2met2_cn/_build/html/genindex.html
index 98b17f018..5558bcf2f 100644
--- a/docs_m2met2_cn/_build/html/genindex.html
+++ b/docs/m2met2_cn/_build/html/genindex.html
@@ -80,7 +80,7 @@
赛道设置与评估
diff --git a/docs_m2met2_cn/_build/html/index.html b/docs/m2met2_cn/_build/html/index.html
similarity index 93%
rename from docs_m2met2_cn/_build/html/index.html
rename to docs/m2met2_cn/_build/html/index.html
index 4bfbdbfd9..fbc2fceac 100644
--- a/docs_m2met2_cn/_build/html/index.html
+++ b/docs/m2met2_cn/_build/html/index.html
@@ -85,7 +85,7 @@
赛道设置与评估
@@ -136,14 +136,6 @@
联系方式
-
-
diff --git a/docs_m2met2_cn/_build/html/objects.inv b/docs/m2met2_cn/_build/html/objects.inv
similarity index 100%
rename from docs_m2met2_cn/_build/html/objects.inv
rename to docs/m2met2_cn/_build/html/objects.inv
diff --git a/docs_m2met2_cn/_build/html/search.html b/docs/m2met2_cn/_build/html/search.html
similarity index 99%
rename from docs_m2met2_cn/_build/html/search.html
rename to docs/m2met2_cn/_build/html/search.html
index 0257e4c2e..4fe0684db 100644
--- a/docs_m2met2_cn/_build/html/search.html
+++ b/docs/m2met2_cn/_build/html/search.html
@@ -73,7 +73,7 @@
赛道设置与评估
diff --git a/docs/m2met2_cn/_build/html/searchindex.js b/docs/m2met2_cn/_build/html/searchindex.js
new file mode 100644
index 000000000..c9fe167cc
--- /dev/null
+++ b/docs/m2met2_cn/_build/html/searchindex.js
@@ -0,0 +1 @@
+Search.setIndex({"docnames": ["index", "\u57fa\u7ebf", "\u6570\u636e\u96c6", "\u7b80\u4ecb", "\u7ec4\u59d4\u4f1a", "\u8054\u7cfb\u65b9\u5f0f", "\u89c4\u5219", "\u8d5b\u9053\u8bbe\u7f6e\u4e0e\u8bc4\u4f30"], "filenames": ["index.rst", "\u57fa\u7ebf.md", "\u6570\u636e\u96c6.md", "\u7b80\u4ecb.md", "\u7ec4\u59d4\u4f1a.md", "\u8054\u7cfb\u65b9\u5f0f.md", "\u89c4\u5219.md", "\u8d5b\u9053\u8bbe\u7f6e\u4e0e\u8bc4\u4f30.md"], "titles": ["ASRU 2023 \u591a\u901a\u9053\u591a\u65b9\u4f1a\u8bae\u8f6c\u5f55\u6311\u6218 2.0", "\u57fa\u7ebf", "\u6570\u636e\u96c6", "\u7b80\u4ecb", "\u7ec4\u59d4\u4f1a", "\u8054\u7cfb\u65b9\u5f0f", "\u7ade\u8d5b\u89c4\u5219", "\u8d5b\u9053\u8bbe\u7f6e\u4e0e\u8bc4\u4f30"], "terms": {"m2met": [0, 3, 5, 7], "asru2023": [0, 3], "m2met2": [0, 3, 5, 7], "funasr": 1, "sa": 1, "asr": [1, 3, 7], "speakerencod": 1, "modelscop": [1, 7], "todo": 1, "fill": 1, "with": 1, "the": 1, "readm": 1, "md": 1, "of": 1, "baselin": [1, 2], "aishel": [2, 7], "cn": [2, 4, 7], "celeb": [2, 7], "test": [2, 6, 7], "2023": [2, 3, 6, 7], "118": 2, "75": 2, "104": 2, "train": 2, "eval": [2, 6], "10": [2, 3, 7], "212": 2, "15": [2, 3], "30": 2, "456": 2, "25": 2, "13": [2, 3], "55": 2, "42": 2, "27": 2, "34": 2, "76": 2, "20": 2, "textgrid": 2, "id": 2, "openslr": 2, "automat": 3, "speech": 3, "recognit": 3, "speaker": 3, "diariz": 3, "rich": 3, "transcript": 3, "evalu": 3, "chime": 3, "comput": 3, "hear": 3, "in": 3, "multisourc": 3, "environ": 3, "misp": 3, "multimod": 3, "inform": 3, "base": 3, "process": 3, "multi": 3, "channel": 3, "parti": 3, "meet": 3, "assp2022": 3, "29": 3, "19": 3, "12": 3, "asru": 3, "workshop": 3, "challeng": 3, "session": 3, "lxie": 4, "nwpu": 4, "edu": 4, "kong": 4, "aik": 4, "lee": 4, "star": 4, "kongaik": 4, "ieee": 4, "org": 4, "zhiji": 4, "yzj": 4, "alibaba": 4, "inc": 4, "com": [4, 5], "sli": 4, "zsl": 4, "yanminqian": 4, "sjtu": 4, "zhuc": 4, "microsoft": 4, "wujian": 4, "ceo": 4, "buhui": 4, "aishelldata": 4, "alimeet": [5, 7], "gmail": 5, "cpcer": [6, 7], "las": 6, "rnnt": 6, "transform": 6, "aishell4": 7, "vad": 7, "cer": 7, "ins": 7, "sub": 7, "del": 7, "text": 7, "frac": 7, "mathcal": 7, "n_": 7, "total": 7, "time": 7, "100": 7, "hug": 7, "face": 7}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"asru": 0, "2023": 0, "alimeet": 2, "aoe": 3}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 8, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx": 57}, "alltitles": {"ASRU 2023 \u591a\u901a\u9053\u591a\u65b9\u4f1a\u8bae\u8f6c\u5f55\u6311\u6218 2.0": [[0, "asru-2023-2-0"]], "\u76ee\u5f55:": [[0, null]], "\u57fa\u7ebf": [[1, "id1"]], "\u57fa\u7ebf\u6982\u8ff0": [[1, "id2"]], "\u5feb\u901f\u5f00\u59cb": [[1, "id3"]], "\u57fa\u7ebf\u7ed3\u679c": [[1, "id4"]], "\u6570\u636e\u96c6": [[2, "id1"]], "\u6570\u636e\u96c6\u6982\u8ff0": [[2, "id2"]], "Alimeeting\u6570\u636e\u96c6\u4ecb\u7ecd": [[2, "alimeeting"]], "\u83b7\u53d6\u6570\u636e": [[2, "id3"]], "\u7b80\u4ecb": [[3, "id1"]], "\u7ade\u8d5b\u4ecb\u7ecd": [[3, "id2"]], "\u65f6\u95f4\u5b89\u6392(AOE\u65f6\u95f4)": [[3, "aoe"]], "\u7ade\u8d5b\u62a5\u540d": [[3, "id3"]], "\u7ec4\u59d4\u4f1a": [[4, "id1"]], "\u8054\u7cfb\u65b9\u5f0f": [[5, "id1"]], "\u7ade\u8d5b\u89c4\u5219": [[6, "id1"]], "\u8d5b\u9053\u8bbe\u7f6e\u4e0e\u8bc4\u4f30": [[7, "id1"]], "\u8bf4\u8bdd\u4eba\u76f8\u5173\u7684\u8bed\u97f3\u8bc6\u522b": [[7, "id2"]], "\u8bc4\u4f30\u65b9\u6cd5": [[7, "id3"]], "\u5b50\u8d5b\u9053\u8bbe\u7f6e": [[7, "id4"]], "\u5b50\u8d5b\u9053\u4e00 (\u9650\u5b9a\u8bad\u7ec3\u6570\u636e):": [[7, "id5"]], "\u5b50\u8d5b\u9053\u4e8c (\u5f00\u653e\u8bad\u7ec3\u6570\u636e):": [[7, "id6"]]}, "indexentries": {}})
\ No newline at end of file
diff --git a/docs_m2met2_cn/_build/html/基线.html b/docs/m2met2_cn/_build/html/基线.html
similarity index 98%
rename from docs_m2met2_cn/_build/html/基线.html
rename to docs/m2met2_cn/_build/html/基线.html
index 569ba57e7..f28043ea7 100644
--- a/docs_m2met2_cn/_build/html/基线.html
+++ b/docs/m2met2_cn/_build/html/基线.html
@@ -89,7 +89,7 @@
赛道设置与评估
@@ -102,7 +102,7 @@
竞赛规则
组委会
-Contact
+联系方式
diff --git a/docs_m2met2_cn/_build/html/数据集.html b/docs/m2met2_cn/_build/html/数据集.html
similarity index 94%
rename from docs_m2met2_cn/_build/html/数据集.html
rename to docs/m2met2_cn/_build/html/数据集.html
index 3ceb89cfa..ddefcc188 100644
--- a/docs_m2met2_cn/_build/html/数据集.html
+++ b/docs/m2met2_cn/_build/html/数据集.html
@@ -89,7 +89,7 @@
赛道设置与评估
@@ -102,7 +102,7 @@
竞赛规则
组委会
-Contact
+联系方式
@@ -131,10 +131,10 @@
Alimeeting数据集介绍
-AliMeeting总共包含118.75小时的语音数据,包括104.75小时的训练集(Train)、4小时的验证集(Eval)和10小时的测试集(Test)。Train集和Eval集分别包含212场和8场会议,其中每场会议由多个说话人进行15到30分钟的讨论。Train和Eval集中参与会议的总人数分别为456人和25人,并且参会的男女比例人数均衡。
+AliMeeting总共包含118.75小时的语音数据,包括104.75小时的训练集(Train)、4小时的验证集(Eval)和10小时的测试集(Test)。Train集,Eval集和Test集分别包含212场和8场会议,其中每场会议由多个说话人进行15到30分钟的讨论。Train,Eval和Test集中参与会议的总人数分别为456人和25人,并且参会的男女比例人数均衡。
该数据集收集于13个不同的会议室,按照大小规格分为小型、中型和大型三种,房间面积从8到55平方米不等。不同房间具有不同的布局和声学特性,每个房间的详细参数也将发送给参与者。会议场地的墙体材料类型包括水泥、玻璃等。会议场地的家具包括沙发、电视、黑板、风扇、空调、植物等。在录制过程中,麦克风阵列放置于桌上,多个说话人围坐在桌边进行自然对话。麦克风阵列离说话人距离约0.3到5.0米之间。所有说话人的母语均是汉语,并且说的都是普通话,没有浓重的口音。在会议录制期间可能会产生各种室内的噪音,包括键盘声、开门/关门声、风扇声、气泡声等。所有说话人在会议的录制期间均保持相同位置,不发生走动。训练集和验证集的说话人没有重复。图1展示了一个会议室的布局以及麦克风的拓扑结构。
-每场会议的说话人数量从2到4人不等。同时为了覆盖各种内容的会议场景,我们选择了多种会议主题,包括医疗、教育、商业、组织管理、工业生产等不同内容的例会。Train集,Eval集和Test集的平均语音重叠率分别为42.27%和34.76%。AliMeeting Train集,Eval集和Test集的详细信息见表1。表2显示了Train集,Eval集和Test集中不同发言者人数会议的语音重叠率和会议数量。
+每场会议的说话人数量从2到4人不等。同时为了覆盖各种内容的会议场景,我们选择了多种会议主题,包括医疗、教育、商业、组织管理、工业生产等不同内容的例会。Train集,Eval集和Test集的平均语音重叠率分别为42.27%,34.76%和42.8%。AliMeeting Train集,Eval集和Test集的详细信息见表1。表2显示了Train集,Eval集和Test集中不同发言者人数会议的语音重叠率和会议数量。
Test-2023测试集由20场会议组成,这些会议是在与AliMeeting数据集相同的声学环境下录制的。Test-2023测试集中的每个会议环节由2到4个参与者组成并且与AliMeeting测试集的配置相似。
我们还使用耳机麦克风记录了每个说话人的近场音频信号,并确保只转录对应说话人自己的语音。需要注意的是,麦克风阵列记录的远场音频和耳机麦克风记录的近场音频在时间上是同步的。每场会议的所有抄本均以TextGrid格式存储,内容包括会议的时长、说话人信息(说话人数量、说话人ID、性别等)、每个说话人的片段总数、每个片段的时间戳和转录内容。
diff --git a/docs_m2met2_cn/_build/html/简介.html b/docs/m2met2_cn/_build/html/简介.html
similarity index 94%
rename from docs_m2met2_cn/_build/html/简介.html
rename to docs/m2met2_cn/_build/html/简介.html
index 00e916c96..f1da18e63 100644
--- a/docs_m2met2_cn/_build/html/简介.html
+++ b/docs/m2met2_cn/_build/html/简介.html
@@ -90,7 +90,7 @@
赛道设置与评估
@@ -103,7 +103,7 @@
竞赛规则
组委会
-Contact
+联系方式
@@ -138,18 +138,21 @@
时间安排(AOE时间)
-\( 2023.5.5: \) 参赛者注册截止
+\( 2023.4.29: \) 开放注册
+\( 2023.5.8: \) 基线发布
+\( 2023.5.15: \) 注册截止
\( 2023.6.9: \) 测试集数据发布
\( 2023.6.13: \) 最终结果提交截止
\( 2023.6.19: \) 评估结果和排名发布
\( 2023.7.3: \) 论文提交截止
\( 2023.7.10: \) 最终版论文提交截止
-\( 2023.12.12: \) ASRU Workshop
+\( 2023.12.12: \) ASRU Workshop & challenge session
竞赛报名
-来自学术界和工业界的有意向参赛者均应在2023年5月5日及之前填写下方的谷歌表单:
+来自学术界和工业界的有意向参赛者均应在2023年5月15日及之前填写下方的谷歌表单:
+M2MET2.0报名
主办方将在3个工作日内通过电子邮件通知符合条件的参赛团队,团队必须遵守将在挑战网站上发布的挑战规则。在排名发布之前,每个参赛者必须提交一份系统描述文件,详细说明使用的方法和模型。主办方将选择前三名纳入ASRU2023论文集。
diff --git a/docs_m2met2_cn/_build/html/组委会.html b/docs/m2met2_cn/_build/html/组委会.html
similarity index 97%
rename from docs_m2met2_cn/_build/html/组委会.html
rename to docs/m2met2_cn/_build/html/组委会.html
index c295c28ec..ddf93bb58 100644
--- a/docs_m2met2_cn/_build/html/组委会.html
+++ b/docs/m2met2_cn/_build/html/组委会.html
@@ -27,7 +27,7 @@
-
+
@@ -40,7 +40,7 @@
索引
- 下一页 |
赛道设置与评估
@@ -102,7 +102,7 @@
竞赛规则
组委会
-Contact
+联系方式
@@ -168,7 +168,7 @@
@@ -183,7 +183,7 @@
索引
- 下一页 |
赛道设置与评估
diff --git a/docs_m2met2_cn/_build/html/规则.html b/docs/m2met2_cn/_build/html/规则.html
similarity index 97%
rename from docs_m2met2_cn/_build/html/规则.html
rename to docs/m2met2_cn/_build/html/规则.html
index b6fae2901..5186ebdf3 100644
--- a/docs_m2met2_cn/_build/html/规则.html
+++ b/docs/m2met2_cn/_build/html/规则.html
@@ -89,7 +89,7 @@
赛道设置与评估
@@ -102,7 +102,7 @@
竞赛规则
组委会
-Contact
+联系方式
@@ -129,7 +129,6 @@
允许在原始训练数据集上进行数据增强,包括但不限于添加噪声或混响、速度扰动和音调变化。
允许参赛者使用Eval集进行模型训练,但Test集仅能用于调参和模型选择,严禁以任何形式使用Test-2023数据集,包括但不限于使用测试数据集微调或训练模型。
-允许多系统融合,但不鼓励使用具有相同结构仅参数不同的子系统融合。
如果两个系统的测试cpCER相同,则计算复杂度较低的系统将被认定为更优。
如果使用强制对齐模型获得了逐帧分类标签,则必须使用相应子赛道允许的数据对强制对齐模型进行训练。
端到端方法中允许使用浅层融合语言模型,模型可以选择LAS、RNNT和Transformer等,但浅层融合语言模型的训练数据只能来自于允许的训练数据集的转录抄本。
diff --git a/docs_m2met2_cn/_build/html/赛道设置与评估.html b/docs/m2met2_cn/_build/html/赛道设置与评估.html
similarity index 94%
rename from docs_m2met2_cn/_build/html/赛道设置与评估.html
rename to docs/m2met2_cn/_build/html/赛道设置与评估.html
index 7df9889df..072ea5467 100644
--- a/docs_m2met2_cn/_build/html/赛道设置与评估.html
+++ b/docs/m2met2_cn/_build/html/赛道设置与评估.html
@@ -90,7 +90,7 @@
赛道设置与评估
@@ -103,7 +103,7 @@
竞赛规则
组委会
-Contact
+联系方式
@@ -127,8 +127,8 @@
赛道设置与评估
-说话人相关的语音识别 (主赛道)
-说话人相关的ASR任务需要从重叠的语音中识别每个说话人的语音,并为识别内容分配一个说话人标签。图2展示了说话人相关语音识别任务和多说话人语音识别任务的主要区别。在本次竞赛中AliMeeting、Aishell4和Cn-Celeb数据集可作为受限数据源。在M2MeT挑战赛中使用的AliMeeting数据集包含训练、评估和测试集,在M2MET2.0可以在训练和评估中使用。此外,一个包含约10小时会议数据的新的Test-2023集将根据赛程安排发布并用于挑战赛的评分和排名。值得注意的是,组织者将不提供耳机的近场音频、转录以及真实时间戳。主办方将不再提供每个说话人的真实时间戳,而是在Test-2023集上提供包含多个说话人的片段。这些片段可以通过一个简单的vad模型获得。
+说话人相关的语音识别
+说话人相关的ASR任务需要从重叠的语音中识别每个说话人的语音,并为识别内容分配一个说话人标签。图2展示了说话人相关语音识别任务和多说话人语音识别任务的主要区别。在本次竞赛中AliMeeting、Aishell4和Cn-Celeb数据集可作为受限数据源。在M2MeT挑战赛中使用的AliMeeting数据集包含训练、评估和测试集,在M2MET2.0可以在训练和评估中使用。此外,一个包含约10小时会议数据的新的Test-2023集将根据赛程安排发布并用于挑战赛的评分和排名。值得注意的是,对于Test-2023测试集,主办方将不再提供耳机的近场音频、转录以及真实时间戳。而是提供可以通过一个简单的VAD模型得到的包含多个说话人的片段。
@@ -142,7 +142,7 @@
子赛道设置
子赛道一 (限定训练数据):
-参赛者在系统构建过程中仅能使用AliMeeting、AISHELL-4和CN Celeb,严禁使用额外数据。参赛者可以任何第三方开源的预训练模型,如Hugging Face 以及ModelScope 上提供的模型。参赛者需要在最终的系统描述文档中详细列出使用的预训练模型名称以及链接。
+参赛者在系统构建过程中仅能使用AliMeeting、AISHELL-4和CN-Celeb,严禁使用额外数据。参赛者可以任何第三方开源的预训练模型,如Hugging Face 以及ModelScope 上提供的模型。参赛者需要在最终的系统描述文档中详细列出使用的预训练模型名称以及链接。
子赛道二 (开放训练数据):
diff --git a/docs_m2met2_cn/conf.py b/docs/m2met2_cn/conf.py
similarity index 100%
rename from docs_m2met2_cn/conf.py
rename to docs/m2met2_cn/conf.py
diff --git a/docs_m2met2_cn/images/baseline_result.png b/docs/m2met2_cn/images/baseline_result.png
similarity index 100%
rename from docs_m2met2_cn/images/baseline_result.png
rename to docs/m2met2_cn/images/baseline_result.png
diff --git a/docs_m2met2_cn/images/buhui.jpeg b/docs/m2met2_cn/images/buhui.jpeg
similarity index 100%
rename from docs_m2met2_cn/images/buhui.jpeg
rename to docs/m2met2_cn/images/buhui.jpeg
diff --git a/docs_m2met2_cn/images/chenzhuo.jpg b/docs/m2met2_cn/images/chenzhuo.jpg
similarity index 100%
rename from docs_m2met2_cn/images/chenzhuo.jpg
rename to docs/m2met2_cn/images/chenzhuo.jpg
diff --git a/docs_m2met2_cn/images/dataset_detail.png b/docs/m2met2_cn/images/dataset_detail.png
similarity index 100%
rename from docs_m2met2_cn/images/dataset_detail.png
rename to docs/m2met2_cn/images/dataset_detail.png
diff --git a/docs_m2met2_cn/images/dataset_details.png b/docs/m2met2_cn/images/dataset_details.png
similarity index 100%
rename from docs_m2met2_cn/images/dataset_details.png
rename to docs/m2met2_cn/images/dataset_details.png
diff --git a/docs_m2met2_cn/images/kong.png b/docs/m2met2_cn/images/kong.png
similarity index 100%
rename from docs_m2met2_cn/images/kong.png
rename to docs/m2met2_cn/images/kong.png
diff --git a/docs_m2met2_cn/images/lxie.jpeg b/docs/m2met2_cn/images/lxie.jpeg
similarity index 100%
rename from docs_m2met2_cn/images/lxie.jpeg
rename to docs/m2met2_cn/images/lxie.jpeg
diff --git a/docs_m2met2_cn/images/meeting_room.png b/docs/m2met2_cn/images/meeting_room.png
similarity index 100%
rename from docs_m2met2_cn/images/meeting_room.png
rename to docs/m2met2_cn/images/meeting_room.png
diff --git a/docs_m2met2_cn/images/qian.jpeg b/docs/m2met2_cn/images/qian.jpeg
similarity index 100%
rename from docs_m2met2_cn/images/qian.jpeg
rename to docs/m2met2_cn/images/qian.jpeg
diff --git a/docs/m2met2_cn/images/sa_asr_arch.png b/docs/m2met2_cn/images/sa_asr_arch.png
new file mode 100644
index 000000000..fd65dd2c6
Binary files /dev/null and b/docs/m2met2_cn/images/sa_asr_arch.png differ
diff --git a/docs_m2met2_cn/images/task_diff.png b/docs/m2met2_cn/images/task_diff.png
similarity index 100%
rename from docs_m2met2_cn/images/task_diff.png
rename to docs/m2met2_cn/images/task_diff.png
diff --git a/docs_m2met2_cn/images/wujian.jpg b/docs/m2met2_cn/images/wujian.jpg
similarity index 100%
rename from docs_m2met2_cn/images/wujian.jpg
rename to docs/m2met2_cn/images/wujian.jpg
diff --git a/docs_m2met2_cn/images/zhijie.jpg b/docs/m2met2_cn/images/zhijie.jpg
similarity index 100%
rename from docs_m2met2_cn/images/zhijie.jpg
rename to docs/m2met2_cn/images/zhijie.jpg
diff --git a/docs_m2met2_cn/images/zsl.JPG b/docs/m2met2_cn/images/zsl.JPG
similarity index 100%
rename from docs_m2met2_cn/images/zsl.JPG
rename to docs/m2met2_cn/images/zsl.JPG
diff --git a/docs_m2met2_cn/index.rst b/docs/m2met2_cn/index.rst
similarity index 91%
rename from docs_m2met2_cn/index.rst
rename to docs/m2met2_cn/index.rst
index b35ac96da..c089b36e7 100644
--- a/docs_m2met2_cn/index.rst
+++ b/docs/m2met2_cn/index.rst
@@ -20,10 +20,3 @@ ASRU 2023 多通道多方会议转录挑战 2.0
./规则
./组委会
./联系方式
-
-Indices and tables
-==================
-
-* :ref:`genindex`
-* :ref:`modindex`
-* :ref:`search`
diff --git a/docs_m2met2_cn/make.bat b/docs/m2met2_cn/make.bat
similarity index 100%
rename from docs_m2met2_cn/make.bat
rename to docs/m2met2_cn/make.bat
diff --git a/docs_m2met2_cn/基线.md b/docs/m2met2_cn/基线.md
similarity index 100%
rename from docs_m2met2_cn/基线.md
rename to docs/m2met2_cn/基线.md
diff --git a/docs_m2met2_cn/数据集.md b/docs/m2met2_cn/数据集.md
similarity index 85%
rename from docs_m2met2_cn/数据集.md
rename to docs/m2met2_cn/数据集.md
index 52965a1c5..24bfaf3d9 100644
--- a/docs_m2met2_cn/数据集.md
+++ b/docs/m2met2_cn/数据集.md
@@ -3,13 +3,13 @@
在限定数据集条件下,训练数据集仅限于三个公开的语料库,即AliMeeting、AISHELL-4和CN-Celeb。为了评估参赛者提交的模型的性能,我们将发布一个新的测试集(Test-2023)用于打分和排名。下面我们将详细描述AliMeeting数据集和Test-2023测试集。
## Alimeeting数据集介绍
-AliMeeting总共包含118.75小时的语音数据,包括104.75小时的训练集(Train)、4小时的验证集(Eval)和10小时的测试集(Test)。Train集和Eval集分别包含212场和8场会议,其中每场会议由多个说话人进行15到30分钟的讨论。Train和Eval集中参与会议的总人数分别为456人和25人,并且参会的男女比例人数均衡。
+AliMeeting总共包含118.75小时的语音数据,包括104.75小时的训练集(Train)、4小时的验证集(Eval)和10小时的测试集(Test)。Train集,Eval集和Test集分别包含212场和8场会议,其中每场会议由多个说话人进行15到30分钟的讨论。Train,Eval和Test集中参与会议的总人数分别为456人和25人,并且参会的男女比例人数均衡。
该数据集收集于13个不同的会议室,按照大小规格分为小型、中型和大型三种,房间面积从8到55平方米不等。不同房间具有不同的布局和声学特性,每个房间的详细参数也将发送给参与者。会议场地的墙体材料类型包括水泥、玻璃等。会议场地的家具包括沙发、电视、黑板、风扇、空调、植物等。在录制过程中,麦克风阵列放置于桌上,多个说话人围坐在桌边进行自然对话。麦克风阵列离说话人距离约0.3到5.0米之间。所有说话人的母语均是汉语,并且说的都是普通话,没有浓重的口音。在会议录制期间可能会产生各种室内的噪音,包括键盘声、开门/关门声、风扇声、气泡声等。所有说话人在会议的录制期间均保持相同位置,不发生走动。训练集和验证集的说话人没有重复。图1展示了一个会议室的布局以及麦克风的拓扑结构。

-每场会议的说话人数量从2到4人不等。同时为了覆盖各种内容的会议场景,我们选择了多种会议主题,包括医疗、教育、商业、组织管理、工业生产等不同内容的例会。Train集,Eval集和Test集的平均语音重叠率分别为42.27\%和34.76\%。AliMeeting Train集,Eval集和Test集的详细信息见表1。表2显示了Train集,Eval集和Test集中不同发言者人数会议的语音重叠率和会议数量。
+每场会议的说话人数量从2到4人不等。同时为了覆盖各种内容的会议场景,我们选择了多种会议主题,包括医疗、教育、商业、组织管理、工业生产等不同内容的例会。Train集,Eval集和Test集的平均语音重叠率分别为42.27\%,34.76\%和42.8\%。AliMeeting Train集,Eval集和Test集的详细信息见表1。表2显示了Train集,Eval集和Test集中不同发言者人数会议的语音重叠率和会议数量。

Test-2023测试集由20场会议组成,这些会议是在与AliMeeting数据集相同的声学环境下录制的。Test-2023测试集中的每个会议环节由2到4个参与者组成并且与AliMeeting测试集的配置相似。
diff --git a/docs_m2met2_cn/简介.md b/docs/m2met2_cn/简介.md
similarity index 90%
rename from docs_m2met2_cn/简介.md
rename to docs/m2met2_cn/简介.md
index cf4dfb86a..52df97d6b 100644
--- a/docs_m2met2_cn/简介.md
+++ b/docs/m2met2_cn/简介.md
@@ -13,16 +13,20 @@ ASSP2022 M2MeT挑战的侧重点是会议场景,它包括两个赛道:说话
## 时间安排(AOE时间)
-- $ 2023.5.5: $ 参赛者注册截止
+- $ 2023.4.29: $ 开放注册
+- $ 2023.5.8: $ 基线发布
+- $ 2023.5.15: $ 注册截止
- $ 2023.6.9: $ 测试集数据发布
- $ 2023.6.13: $ 最终结果提交截止
- $ 2023.6.19: $ 评估结果和排名发布
- $ 2023.7.3: $ 论文提交截止
- $ 2023.7.10: $ 最终版论文提交截止
-- $ 2023.12.12: $ ASRU Workshop
+- $ 2023.12.12: $ ASRU Workshop & challenge session
## 竞赛报名
-来自学术界和工业界的有意向参赛者均应在2023年5月5日及之前填写下方的谷歌表单:
+来自学术界和工业界的有意向参赛者均应在2023年5月15日及之前填写下方的谷歌表单:
+
+[M2MET2.0报名](https://docs.google.com/forms/d/e/1FAIpQLSf77T9vAl7Ym-u5g8gXu18SBofoWRaFShBo26Ym0-HDxHW9PQ/viewform?usp=sf_link)
主办方将在3个工作日内通过电子邮件通知符合条件的参赛团队,团队必须遵守将在挑战网站上发布的挑战规则。在排名发布之前,每个参赛者必须提交一份系统描述文件,详细说明使用的方法和模型。主办方将选择前三名纳入ASRU2023论文集。
\ No newline at end of file
diff --git a/docs_m2met2_cn/组委会.md b/docs/m2met2_cn/组委会.md
similarity index 100%
rename from docs_m2met2_cn/组委会.md
rename to docs/m2met2_cn/组委会.md
diff --git a/docs_m2met2_cn/联系方式.md b/docs/m2met2_cn/联系方式.md
similarity index 100%
rename from docs_m2met2_cn/联系方式.md
rename to docs/m2met2_cn/联系方式.md
diff --git a/docs_m2met2_cn/规则.md b/docs/m2met2_cn/规则.md
similarity index 90%
rename from docs_m2met2_cn/规则.md
rename to docs/m2met2_cn/规则.md
index b0928ee54..68cb15972 100644
--- a/docs_m2met2_cn/规则.md
+++ b/docs/m2met2_cn/规则.md
@@ -4,8 +4,6 @@
- 允许在原始训练数据集上进行数据增强,包括但不限于添加噪声或混响、速度扰动和音调变化。
- 允许参赛者使用Eval集进行模型训练,但Test集仅能用于调参和模型选择,严禁以任何形式使用Test-2023数据集,包括但不限于使用测试数据集微调或训练模型。
-
-- 允许多系统融合,但不鼓励使用具有相同结构仅参数不同的子系统融合。
- 如果两个系统的测试cpCER相同,则计算复杂度较低的系统将被认定为更优。
diff --git a/docs_m2met2_cn/赛道设置与评估.md b/docs/m2met2_cn/赛道设置与评估.md
similarity index 86%
rename from docs_m2met2_cn/赛道设置与评估.md
rename to docs/m2met2_cn/赛道设置与评估.md
index a99c1eddc..94a623690 100644
--- a/docs_m2met2_cn/赛道设置与评估.md
+++ b/docs/m2met2_cn/赛道设置与评估.md
@@ -1,6 +1,6 @@
# 赛道设置与评估
-## 说话人相关的语音识别 (主赛道)
-说话人相关的ASR任务需要从重叠的语音中识别每个说话人的语音,并为识别内容分配一个说话人标签。图2展示了说话人相关语音识别任务和多说话人语音识别任务的主要区别。在本次竞赛中AliMeeting、Aishell4和Cn-Celeb数据集可作为受限数据源。在M2MeT挑战赛中使用的AliMeeting数据集包含训练、评估和测试集,在M2MET2.0可以在训练和评估中使用。此外,一个包含约10小时会议数据的新的Test-2023集将根据赛程安排发布并用于挑战赛的评分和排名。值得注意的是,组织者将不提供耳机的近场音频、转录以及真实时间戳。主办方将不再提供每个说话人的真实时间戳,而是在Test-2023集上提供包含多个说话人的片段。这些片段可以通过一个简单的vad模型获得。
+## 说话人相关的语音识别
+说话人相关的ASR任务需要从重叠的语音中识别每个说话人的语音,并为识别内容分配一个说话人标签。图2展示了说话人相关语音识别任务和多说话人语音识别任务的主要区别。在本次竞赛中AliMeeting、Aishell4和Cn-Celeb数据集可作为受限数据源。在M2MeT挑战赛中使用的AliMeeting数据集包含训练、评估和测试集,在M2MET2.0可以在训练和评估中使用。此外,一个包含约10小时会议数据的新的Test-2023集将根据赛程安排发布并用于挑战赛的评分和排名。值得注意的是,对于Test-2023测试集,主办方将不再提供耳机的近场音频、转录以及真实时间戳。而是提供可以通过一个简单的VAD模型得到的包含多个说话人的片段。

@@ -12,6 +12,6 @@ $$ \text{CER} = \frac {\mathcal N_{\text{Ins}} + \mathcal N_{\text{Sub}} + \math
其中 $\mathcal N_{\text{Ins}}$ , $\mathcal N_{\text{Sub}}$ , $\mathcal N_{\text{Del}}$ 是三种错误的字符数, $\mathcal N_{\text{Total}}$ 是字符总数.
## 子赛道设置
### 子赛道一 (限定训练数据):
-参赛者在系统构建过程中仅能使用AliMeeting、AISHELL-4和CN Celeb,严禁使用额外数据。参赛者可以任何第三方开源的预训练模型,如[Hugging Face](https://huggingface.co/models)以及[ModelScope](https://www.modelscope.cn/models)上提供的模型。参赛者需要在最终的系统描述文档中详细列出使用的预训练模型名称以及链接。
+参赛者在系统构建过程中仅能使用AliMeeting、AISHELL-4和CN-Celeb,严禁使用额外数据。参赛者可以任何第三方开源的预训练模型,如[Hugging Face](https://huggingface.co/models)以及[ModelScope](https://www.modelscope.cn/models)上提供的模型。参赛者需要在最终的系统描述文档中详细列出使用的预训练模型名称以及链接。
### 子赛道二 (开放训练数据):
除了限定数据外,参与者可以使用任何公开可用、私人录制和模拟仿真的数据集。但是,参与者必须清楚地列出使用的数据。同样,参赛者也可以使用任何第三方开源的预训练模型,但必须在最后的系统描述文件中明确的列出所使用的数据和模型链接,如果使用模拟仿真数据,请详细描述数据模拟的方案。
\ No newline at end of file
diff --git a/docs_m2met2/_build/doctrees/Introduction.doctree b/docs_m2met2/_build/doctrees/Introduction.doctree
deleted file mode 100644
index a5119b7d7..000000000
Binary files a/docs_m2met2/_build/doctrees/Introduction.doctree and /dev/null differ
diff --git a/docs_m2met2/_build/doctrees/Organizers.doctree b/docs_m2met2/_build/doctrees/Organizers.doctree
deleted file mode 100644
index d8d4e5204..000000000
Binary files a/docs_m2met2/_build/doctrees/Organizers.doctree and /dev/null differ
diff --git a/docs_m2met2/_build/doctrees/Rules.doctree b/docs_m2met2/_build/doctrees/Rules.doctree
deleted file mode 100644
index 4ac75811c..000000000
Binary files a/docs_m2met2/_build/doctrees/Rules.doctree and /dev/null differ
diff --git a/docs_m2met2/_build/doctrees/index.doctree b/docs_m2met2/_build/doctrees/index.doctree
deleted file mode 100644
index 1cb0d3dd2..000000000
Binary files a/docs_m2met2/_build/doctrees/index.doctree and /dev/null differ
diff --git a/docs_m2met2/_build/html/_images/sa_asr_arch.png b/docs_m2met2/_build/html/_images/sa_asr_arch.png
deleted file mode 100644
index 6c662ff67..000000000
Binary files a/docs_m2met2/_build/html/_images/sa_asr_arch.png and /dev/null differ
diff --git a/docs_m2met2/_build/html/_sources/Introduction.md.txt b/docs_m2met2/_build/html/_sources/Introduction.md.txt
deleted file mode 100644
index c98e6ce7a..000000000
--- a/docs_m2met2/_build/html/_sources/Introduction.md.txt
+++ /dev/null
@@ -1,27 +0,0 @@
-# Introduction
-## Call for participation
-Automatic speech recognition (ASR) and speaker diarization have made significant strides in recent years, resulting in a surge of speech technology applications across various domains. However, meetings present unique challenges to speech technologies due to their complex acoustic conditions and diverse speaking styles, including overlapping speech, variable numbers of speakers, far-field signals in large conference rooms, and environmental noise and reverberation.
-
-Over the years, several challenges have been organized to advance the development of meeting transcription, including the Rich Transcription evaluation and Computational Hearing in Multisource Environments (CHIME) challenges. The latest iteration of the CHIME challenge has a particular focus on distant automatic speech recognition (ASR) and developing systems that can generalize across various array topologies and application scenarios. However, while progress has been made in English meeting transcription, language differences remain a significant barrier to achieving comparable results in non-English languages, such as Mandarin.
-
-The Multimodal Information Based Speech Processing (MISP) and Multi-Channel Multi-Party Meeting Transcription (M2MeT) challenges have been instrumental in advancing Mandarin meeting transcription. The MISP challenge seeks to address the problem of audio-visual distant multi-microphone signal processing in everyday home environments, while the M2MeT challenge focuses on tackling the speech overlap issue in offline meeting rooms.
-
-The ICASSP2022 M2MeT challenge focuses on meeting scenarios, and it comprises two main tasks: speaker diarization and multi-speaker automatic speech recognition (ASR). The former involves identifying who spoke when in the meeting, while the latter aims to transcribe speech from multiple speakers simultaneously, which poses significant technical difficulties due to overlapping speech and acoustic interferences.
-
-Building on the success of the previous M2MeT challenge, we are excited to propose the M2MeT2.0 challenge as an ASRU2023 challenge special session. In the original M2MeT challenge, the evaluation metric was speaker-independent, which meant that the transcription could be determined, but not the corresponding speaker. To address this limitation and further advance the current multi-talker ASR system towards practicality, the M2MeT2.0 challenge proposes the speaker-attributed ASR task with two sub-tracks: fixed and open training conditions. By attributing speech to specific speakers, this task aims to improve the accuracy and applicability of multi-talker ASR systems in real-world settings. The challenge provides detailed datasets, rules, evaluation methods, and baseline systems to facilitate reproducible research in this field. The speaker-attribute automatic speech recognition (ASR) task aims to tackle the practical and challenging problem of identifying "who spoke what at when". To facilitate reproducible research in this field, we offer a comprehensive overview of the dataset, rules, evaluation metrics, and baseline systems. Furthermore, we will release a carefully curated test set, comprising approximately 10 hours of audio, according to the timeline. The new test set is designed to enable researchers to validate and compare their models' performance and advance the state of the art in this area.
-
-## Timeline(AOE Time)
-
-- $ May~5^{th}, 2023: $ Registration deadline, the due date for participants to join the Challenge.
-- $ June~9^{th}, 2023: $ Test data release.
-- $ June~13^{rd}, 2023: $ Final submission deadline.
-- $ June~19^{th}, 2023: $ Evaluation result and ranking release.
-- $ July~3^{rd}, 2023: $ Deadline for paper submission.
-- $ July~10^{th}, 2023: $ Deadline for final paper submission.
-- $ December~12^{nd}\ to\ 16^{th}, 2023: $ ASRU Workshop
-
-## Guidelines
-
-Possible improved version: Interested participants, whether from academia or industry, must register for the challenge by completing a Google form, which will be available here. The deadline for registration is May 5, 2023.
-
-Within three working days, the challenge organizer will send email invitations to eligible teams to participate in the challenge. All qualified teams are required to adhere to the challenge rules, which will be published on the challenge page. Prior to the ranking release time, each participant must submit a system description document detailing their approach and methods. The organizer will select the top three submissions to be included in the ASRU2023 Proceedings.
diff --git a/docs_m2met2/_build/html/_sources/Organizers.md.txt b/docs_m2met2/_build/html/_sources/Organizers.md.txt
deleted file mode 100644
index 5aea55846..000000000
--- a/docs_m2met2/_build/html/_sources/Organizers.md.txt
+++ /dev/null
@@ -1,68 +0,0 @@
-# Organizers
-***Lei Xie, Professor, Northwestern Polytechnical University, China***
-
-Email: [lxie@nwpu.edu.cn](mailto:lxie@nwpu.edu.cn)
-
-
-
-Lei Xie received the Ph.D. degree in computer science from Northwestern Polytechnical University, Xi'an, China, in 2004. From 2001 to 2002, he was with the Department of Electronics and Information Processing, Vrije Universiteit Brussel (VUB), Brussels, Belgium, as a Visiting Scientist. From 2004 to 2006, he was a Senior Research Associate with the Center for Media Technology, School of Creative Media, City University of Hong Kong, Hong Kong, China. From 2006 to 2007, he was a Postdoctoral Fellow with the Human-Computer Communications Laboratory (HCCL), The Chinese University of Hong Kong, Hong Kong, China. He is currently a Professor with School of Computer Science, Northwestern Polytechnical University, Xian, China and leads the Audio, Speech and Language Processing Group (ASLP@NPU). He has published over 200 papers in referred journals and conferences, such as IEEE/ACM Transactions on Audio, Speech and Language Processing, IEEE Transactions on Multimedia, Interspeech, ICASSP, ASRU, ACL and ACM Multimedia. He has achieved several best paper awards in flagship conferences. His current research interests include general topics in speech and language processing, multimedia, and human-computer interaction. Dr. Xie is currently an associate editor (AE) of IEEE/ACM Trans. on Audio, Speech and language Processing. He has actively served as Chairs in many conferences and technical committees. He serves as an IEEE Speech and Language Processing
-Technical Committee Member.
-
-***Kong Aik Lee, Senior Scientist at Institute for Infocomm Research, A\*Star, Singapore***
-
-Email: [kongaik.lee@ieee.org](mailto:kongaik.lee@ieee.org)
-
-
-
-Kong Aik Lee started off him career as a researcher, then a team leader and a strategic planning manager, at the Institute Infocomm Research, A*STAR, Singapore, working on speaker and language recognition research. From 2018 to 2020, he spent two and a half years in NEC Corporation, Japan, focusing very much on voice biometrics and multi-modal biometrics products. He is proud to work with a great team on voice biometrics featured on NEC Bio-Idiom platform. He returned to Singapore in July 2020, and now leading the speech and audio analytics research at the Institute for Infocomm Research, as a Senior Scientist and PI. He also serve as an Editor for Elsevier Computer Speech and Language (since 2016), and was an Associate Editor for IEEE/ACM Transactions on Audio, Speech and Language Processing (2017 - 2021), and am an elected member of IEEE Speech and Language Technical Committee (2019 - 2021).
-
-***Zhijie Yan, Principal Engineer at Alibaba, China***
-Email: [zhijie.yzj@alibaba-inc.com](mailto:zhijie.yzj@alibaba-inc.com)
-
-
-
-Zhijie Yan holds a PhD from the University of Science and Technology of China, and is a senior member of the Institute of Electrical and Electronics Engineers (IEEE). He is also an expert reviewer of top academic conferences and journals in the speech field. His research fields include speech recognition, speech synthesis, voiceprints, and speech interaction. His research results are applied in speech services provided by Alibaba Group and Ant Financial. He was awarded the title of "One of the Top 100 Grassroots Scientists" by the China Association for Science and Technology.
-
-
-***Shiliang Zhang, Senior Engineer at Alibaba, China***
-Email: [sly.zsl@alibaba-inc.com](mailto:sly.zsl@alibaba-inc.com)
-
-
-
-Shiliang Zhang graduated with a Ph.D. from the University of Science and Technology of China in 2017. His research areas mainly include speech recognition, natural language understanding, and machine learning. Currently, he has published over 40 papers in mainstream academic journals and conferences in the fields of speech and machine learning, and has applied for dozens of patents. After obtaining his doctorate degree, he joined the Alibaba Intelligent Speech team. He is currently leading the direction of speech recognition and fundamental technology at DAMO Academy's speech laboratory.
-
-
-
-***Yanmin Qian, Professor, Shanghai Jiao Tong University, China***
-
-Email: [yanminqian@sjtu.edu.cn](mailto:yanminqian@sjtu.edu.cn)
-
-
-
-Yanmin Qian received the B.S. degree from the Department of Electronic and Information Engineering,Huazhong University of Science and Technology, Wuhan, China, in 2007, and the Ph.D. degree from the Department of Electronic Engineering, Tsinghua University, Beijing, China, in 2012. Since 2013, he has been with the Department of Computer Science and Engineering, Shanghai Jiao Tong University (SJTU), Shanghai, China, where he is currently an Associate Professor. From 2015 to 2016, he also worked as an Associate Research in the Speech Group, Cambridge University Engineering Department, Cambridge, U.K. He is a senior member of IEEE and a member of ISCA, and one of the founding members of Kaldi Speech Recognition Toolkit. He has published more than 110 papers on speech and language processing with 4000+ citations, including the top conference: ICASSP, INTERSPEECH and ASRU. His current research interests include the acoustic and language modeling in speech recognition, speaker and language recognition, key word spotting, and multimedia signal processing.
-
-
-
-***Zhuo Chen, Applied Scientist in Microsoft, USA***
-
-Email: [zhuc@microsoft.com](mailto:zhuc@microsoft.com)
-
-
-
-Zhuo Chen received the Ph.D. degree from Columbia University, New York, NY, USA, in 2017. He is currently a Principal Applied Data Scientist with Microsoft. He has authored or coauthored more than 80 papers in peer-reviewed journals and conferences with around 6000 citations. He is a reviewer or technical committee member for more than ten journals and conferences. His research interests include automatic conversation recognition, speech separation, diarisation, and speaker information extraction. He actively participated in the academic events and challenges, and won several awards. Meanwhile, he contributed to open-sourced datasets, such as WSJ0-2mix, LibriCSS, and AISHELL-4, that have been main benchmark datasets for multi-speaker processing research. In 2020, he was the Team Leader in 2020 Jelinek workshop, leading more than 30 researchers and students to push the state of the art in conversation transcription.
-
-***Jian Wu, Applied Scientist in Microsoft, USA***
-
-Email: [wujian@microsoft.com](mailto:wujian@microsoft.com)
-
-
-
-Jian Wu received a master degree from Northwestern Polytechnical University, Xi'an, China, in 2020 and currently he is a Applied Scientist in Microsoft, USA. His research interests cover multi-channel signal processing, robust and multi-talker speech recognition, speech enhancement, dereverberation and separation. He has around 30 conference publications with a total citation over 1200. He participated in several challenges such as CHiME5, DNS 2020 and FFSVC 2020 and contributed to the open-sourced datasets including LibriCSS and AISHELL-4. He is also a reviewer for several journals and conferences such as ICASSP, SLT, TASLP and SPL.
-
-***Hui Bu, CEO, AISHELL foundation, China***
-
-Email: [buhui@aishelldata.com](mailto:buhui@aishelldata.com)
-
-
-
-Hui Bu received his master degree in the Artificial Intelligence Laboratory of Korea University in 2014. He is the founder and the CEO of AISHELL and AISHELL foundation. He participated in the release of AISHELL 1 \& 2 \& 3 \& 4, DMASH and HI-MIA open source database project and is the co-founder of China Kaldi offline Technology Forum.
diff --git a/docs_m2met2/_build/html/searchindex.js b/docs_m2met2/_build/html/searchindex.js
deleted file mode 100644
index 940cc2856..000000000
--- a/docs_m2met2/_build/html/searchindex.js
+++ /dev/null
@@ -1 +0,0 @@
-Search.setIndex({"docnames": ["Baseline", "Contact", "Dataset", "Introduction", "Organizers", "Rules", "Track_setting_and_evaluation", "index"], "filenames": ["Baseline.md", "Contact.md", "Dataset.md", "Introduction.md", "Organizers.md", "Rules.md", "Track_setting_and_evaluation.md", "index.rst"], "titles": ["Baseline", "Contact", "Datasets", "Introduction", "Organizers", "Rules", "Track & Evaluation", "ASRU 2023 MULTI-CHANNEL MULTI-PARTY MEETING TRANSCRIPTION CHALLENGE 2.0 (M2MeT2.0)"], "terms": {"we": [0, 2, 3, 7], "releas": [0, 2, 3, 4, 6], "an": [0, 2, 3, 4, 6], "e2": 0, "sa": 0, "asr": [0, 3, 7], "cite": 0, "kanda21b_interspeech": 0, "conduct": [0, 2], "funasr": 0, "time": [0, 6], "accord": [0, 3], "timelin": [0, 2], "The": [0, 2, 3, 4, 5, 6], "model": [0, 2, 3, 4, 5, 6], "architectur": 0, "i": [0, 2, 3, 4, 5], "shown": [0, 2], "figur": [0, 6], "3": [0, 2, 3, 4], "speakerencod": 0, "initi": 0, "pre": [0, 6], "train": [0, 3, 5, 7], "speaker": [0, 2, 3, 4, 7], "verif": 0, "from": [0, 2, 3, 4, 5, 6], "modelscop": [0, 6], "thi": [0, 3, 5, 6], "also": [0, 2, 4, 6], "us": [0, 2, 5, 6], "extract": [0, 4], "embed": 0, "profil": 0, "todo": 0, "fill": 0, "readm": 0, "md": 0, "system": [0, 3, 5, 6, 7], "ar": [0, 2, 3, 4, 5, 6, 7], "tabl": [0, 2], "adopt": 0, "oracl": [0, 6], "dure": [0, 2, 6], "howev": [0, 3, 6], "due": [0, 3], "lack": 0, "label": [0, 5, 6], "evalu": [0, 2, 3, 7], "provid": [0, 2, 3, 4, 6, 7], "addit": [0, 6], "spectral": 0, "cluster": 0, "meanwhil": [0, 4], "eval": [0, 2, 5, 6], "test": [0, 2, 3, 5, 6], "set": [0, 2, 3, 5, 6], "show": 0, "impact": 0, "accuraci": [0, 3, 6], "If": [1, 5, 6], "you": 1, "have": [1, 3, 4], "ani": [1, 5, 6], "question": 1, "about": 1, "m2met2": [1, 3], "0": [1, 2, 3], "challeng": [1, 3, 4, 5, 6], "pleas": 1, "u": [1, 2, 4], "email": [1, 3, 4], "m2met": [1, 3, 6, 7], "alimeet": [1, 6], "gmail": 1, "com": [1, 4], "wechat": 1, "group": [1, 2, 4], "In": [2, 3, 4, 5], "fix": [2, 3, 7], "condit": [2, 3, 7], "restrict": 2, "three": [2, 3, 6], "publicli": [2, 6], "avail": [2, 3, 6], "corpora": 2, "name": 2, "aishel": [2, 4, 6], "4": [2, 4, 6], "cn": [2, 4, 6], "celeb": [2, 6], "To": [2, 3, 7], "perform": [2, 3], "new": [2, 3, 4, 6], "call": 2, "2023": [2, 3, 5, 6], "score": [2, 6], "rank": [2, 3, 6], "describ": 2, "contain": [2, 6], "118": 2, "75": 2, "hour": [2, 3, 6], "speech": [2, 3, 4, 6, 7], "total": [2, 4, 6], "divid": [2, 6], "104": 2, "10": [2, 3, 6], "specif": [2, 3, 6], "212": 2, "8": 2, "session": [2, 3, 6, 7], "respect": 2, "each": [2, 3, 6], "consist": [2, 6], "15": 2, "30": [2, 4], "minut": 2, "discuss": 2, "particip": [2, 4, 5, 6], "number": [2, 3, 6], "456": 2, "25": 2, "balanc": 2, "gender": 2, "coverag": 2, "collect": 2, "13": [2, 3], "meet": [2, 3, 6], "venu": 2, "which": [2, 3, 6], "categor": 2, "type": 2, "small": 2, "medium": 2, "larg": [2, 3], "room": [2, 3], "size": 2, "rang": 2, "m": 2, "2": [2, 4, 6], "55": 2, "differ": [2, 3, 5, 6], "give": 2, "varieti": 2, "acoust": [2, 3, 4, 6], "properti": 2, "layout": 2, "paramet": [2, 5], "togeth": 2, "wall": 2, "materi": 2, "cover": [2, 4], "cement": 2, "glass": 2, "etc": 2, "other": 2, "furnish": 2, "includ": [2, 3, 4, 5, 6], "sofa": 2, "tv": 2, "blackboard": 2, "fan": 2, "air": 2, "condition": 2, "plant": 2, "record": [2, 6], "sit": 2, "around": [2, 4], "microphon": [2, 3], "arrai": [2, 3], "place": 2, "natur": [2, 4], "convers": [2, 4], "distanc": 2, "5": [2, 3], "all": [2, 3, 5, 6], "nativ": 2, "chines": [2, 4], "speak": [2, 3], "mandarin": [2, 3], "without": 2, "strong": 2, "accent": 2, "variou": [2, 3], "kind": 2, "indoor": 2, "nois": [2, 3, 5], "limit": [2, 3, 5], "click": 2, "keyboard": 2, "door": 2, "open": [2, 3, 4, 7], "close": 2, "bubbl": 2, "made": [2, 3], "For": 2, "both": [2, 6], "requir": [2, 3, 6], "remain": [2, 3], "same": [2, 5], "posit": 2, "There": 2, "overlap": [2, 3], "between": [2, 6], "exampl": 2, "fig": 2, "1": [2, 4], "within": [2, 3], "one": [2, 4, 5], "ensur": 2, "ratio": 2, "select": [2, 3, 5, 6], "topic": [2, 4], "medic": 2, "treatment": 2, "educ": 2, "busi": 2, "organ": [2, 3, 5, 6, 7], "manag": [2, 4], "industri": [2, 3], "product": [2, 4], "daili": 2, "routin": 2, "averag": 2, "42": 2, "27": 2, "34": 2, "76": 2, "more": [2, 4], "A": [2, 4], "distribut": 2, "20": 2, "were": 2, "ident": [2, 6], "compris": [2, 3, 7], "therebi": 2, "share": 2, "similar": 2, "configur": 2, "field": [2, 3, 4, 6], "signal": [2, 3, 4], "headset": 2, "onli": [2, 5, 6], "": [2, 4, 6], "own": 2, "transcrib": [2, 3, 6], "It": [2, 6], "worth": [2, 6], "note": [2, 6], "far": [2, 3], "audio": [2, 3, 4, 6], "synchron": 2, "common": 2, "transcript": [2, 3, 4, 5, 6], "prepar": 2, "textgrid": 2, "format": 2, "inform": [2, 3, 4], "durat": 2, "id": 2, "segment": [2, 6], "timestamp": [2, 6], "mention": 2, "abov": 2, "can": [2, 3, 5, 6], "download": 2, "openslr": 2, "via": 2, "follow": [2, 5], "link": 2, "particularli": 2, "baselin": [2, 3, 7], "conveni": 2, "script": 2, "automat": [3, 4, 7], "recognit": [3, 4, 7], "diariz": 3, "signific": 3, "stride": 3, "recent": 3, "year": [3, 4], "result": [3, 4], "surg": 3, "technologi": [3, 4], "applic": 3, "across": 3, "domain": 3, "present": 3, "uniqu": [3, 6], "complex": [3, 5], "divers": 3, "style": 3, "variabl": 3, "confer": [3, 4], "environment": 3, "reverber": [3, 5], "over": [3, 4], "sever": [3, 4], "been": [3, 4], "advanc": [3, 7], "develop": [3, 6], "rich": 3, "comput": [3, 4, 5], "hear": 3, "multisourc": 3, "environ": 3, "chime": 3, "latest": 3, "iter": 3, "ha": [3, 4], "particular": 3, "focu": 3, "distant": 3, "gener": [3, 4], "topologi": 3, "scenario": 3, "while": 3, "progress": 3, "english": 3, "languag": [3, 4, 5], "barrier": 3, "achiev": [3, 4], "compar": 3, "non": 3, "multimod": 3, "base": 3, "process": [3, 4, 6], "misp": 3, "multi": [3, 4, 5, 6], "channel": [3, 4], "parti": [3, 6], "instrument": 3, "seek": 3, "address": 3, "problem": 3, "visual": 3, "everydai": 3, "home": 3, "focus": [3, 4], "tackl": 3, "issu": 3, "offlin": [3, 4], "icassp2022": 3, "two": [3, 4, 5, 7], "main": [3, 4], "task": [3, 6, 7], "former": 3, "involv": [3, 6], "identifi": 3, "who": 3, "spoke": 3, "when": 3, "latter": 3, "aim": 3, "multipl": [3, 6], "simultan": 3, "pose": [3, 6], "technic": [3, 4], "difficulti": 3, "interfer": 3, "build": [3, 6, 7], "success": [3, 7], "previou": 3, "excit": 3, "propos": [3, 7], "asru2023": [3, 7], "special": [3, 5, 7], "origin": [3, 5], "metric": [3, 7], "wa": [3, 4, 6], "independ": 3, "meant": 3, "could": 3, "determin": 3, "correspond": [3, 5], "further": 3, "current": [3, 4, 7], "talker": [3, 4, 7], "toward": 3, "practic": 3, "attribut": [3, 7], "sub": [3, 5, 7], "track": [3, 5, 7], "By": 3, "improv": 3, "real": 3, "world": 3, "detail": [3, 6], "dataset": [3, 4, 5, 6, 7], "rule": [3, 7], "method": 3, "facilit": [3, 7], "reproduc": [3, 7], "research": [3, 4, 7], "what": 3, "offer": 3, "comprehens": [3, 7], "overview": [3, 7], "furthermor": 3, "carefulli": 3, "curat": 3, "approxim": [3, 6], "design": 3, "enabl": 3, "valid": 3, "state": [3, 4, 6, 7], "art": [3, 4, 7], "area": [3, 4], "mai": 3, "th": 3, "registr": 3, "deadlin": 3, "date": 3, "join": [3, 4], "june": 3, "9": 3, "data": [3, 4, 5, 6], "rd": 3, "final": [3, 5, 6], "submiss": 3, "19": 3, "juli": [3, 4], "paper": [3, 4, 6], "decemb": 3, "12": 3, "nd": 3, "16": 3, "asru": [3, 4], "workshop": [3, 4], "possibl": [3, 6], "version": 3, "interest": [3, 4], "whether": 3, "academia": 3, "must": [3, 5, 6], "regist": 3, "complet": 3, "googl": 3, "form": 3, "here": 3, "work": [3, 4], "dai": 3, "send": 3, "invit": 3, "elig": [3, 5], "team": [3, 4], "qualifi": 3, "adher": [3, 5], "publish": [3, 4], "page": [3, 7], "prior": 3, "submit": 3, "descript": [3, 6], "document": 3, "approach": [3, 5], "top": [3, 4], "proceed": 3, "lei": 4, "xie": 4, "professor": 4, "northwestern": 4, "polytechn": 4, "univers": 4, "china": 4, "lxie": 4, "nwpu": 4, "edu": 4, "receiv": 4, "ph": 4, "d": 4, "degre": 4, "scienc": 4, "xi": 4, "2004": 4, "2001": 4, "2002": 4, "he": 4, "depart": 4, "electron": 4, "vrije": 4, "universiteit": 4, "brussel": 4, "vub": 4, "belgium": 4, "visit": 4, "scientist": 4, "2006": 4, "senior": 4, "associ": 4, "center": 4, "media": 4, "school": 4, "creativ": 4, "citi": 4, "hong": 4, "kong": 4, "2007": 4, "postdoctor": 4, "fellow": 4, "human": 4, "commun": 4, "laboratori": 4, "hccl": 4, "xian": 4, "lead": 4, "aslp": 4, "npu": 4, "200": 4, "refer": [4, 6], "journal": 4, "ieee": 4, "acm": 4, "transact": 4, "multimedia": 4, "interspeech": 4, "icassp": 4, "acl": 4, "best": 4, "award": 4, "flagship": 4, "hi": 4, "interact": 4, "dr": 4, "editor": 4, "ae": 4, "tran": 4, "activ": [4, 6], "serv": 4, "chair": 4, "mani": 4, "committe": 4, "member": 4, "aik": 4, "lee": 4, "institut": 4, "infocomm": 4, "star": 4, "singapor": 4, "kongaik": 4, "org": 4, "start": 4, "off": 4, "him": 4, "career": 4, "leader": 4, "strateg": 4, "plan": 4, "2018": 4, "2020": 4, "spent": 4, "half": 4, "nec": 4, "corpor": 4, "japan": 4, "veri": 4, "much": 4, "voic": [4, 6], "biometr": 4, "modal": 4, "proud": 4, "great": 4, "featur": 4, "bio": 4, "idiom": 4, "platform": 4, "return": 4, "now": 4, "analyt": 4, "pi": 4, "elsevi": 4, "sinc": 4, "2016": 4, "2017": 4, "2021": 4, "am": 4, "elect": 4, "2019": 4, "zhiji": 4, "yan": 4, "princip": 4, "engin": 4, "alibaba": 4, "yzj": 4, "inc": 4, "hold": 4, "phd": 4, "electr": 4, "expert": 4, "review": 4, "academ": 4, "synthesi": 4, "voiceprint": 4, "appli": 4, "servic": 4, "ant": 4, "financi": 4, "titl": 4, "One": 4, "100": [4, 6], "grassroot": 4, "shiliang": 4, "zhang": 4, "sly": 4, "zsl": 4, "graduat": 4, "mainli": 4, "understand": 4, "machin": 4, "learn": 4, "40": 4, "mainstream": 4, "dozen": 4, "patent": 4, "after": 4, "obtain": [4, 5, 6], "doctor": 4, "intellig": 4, "direct": 4, "fundament": 4, "damo": 4, "academi": 4, "yanmin": 4, "qian": 4, "shanghai": 4, "jiao": 4, "tong": 4, "yanminqian": 4, "sjtu": 4, "b": 4, "huazhong": 4, "wuhan": 4, "tsinghua": 4, "beij": 4, "2012": 4, "2013": 4, "where": [4, 6], "2015": 4, "cambridg": 4, "k": 4, "isca": 4, "found": 4, "kaldi": 4, "toolkit": 4, "than": 4, "110": 4, "4000": 4, "citat": 4, "kei": 4, "word": 4, "spot": 4, "zhuo": 4, "chen": 4, "microsoft": 4, "usa": 4, "zhuc": 4, "columbia": 4, "york": 4, "ny": 4, "author": 4, "coauthor": 4, "80": 4, "peer": 4, "6000": 4, "ten": 4, "separ": 4, "diaris": 4, "event": 4, "won": 4, "contribut": 4, "sourc": [4, 6], "wsj0": 4, "2mix": 4, "libricss": 4, "benchmark": 4, "jelinek": 4, "student": 4, "push": 4, "jian": 4, "wu": 4, "wujian": 4, "master": 4, "robust": 4, "enhanc": 4, "dereverber": 4, "public": 4, "1200": 4, "chime5": 4, "dn": 4, "ffsvc": 4, "slt": 4, "taslp": 4, "spl": 4, "hui": 4, "bu": 4, "ceo": 4, "foundat": 4, "buhui": 4, "aishelldata": 4, "artifici": 4, "korea": 4, "2014": 4, "founder": 4, "dmash": 4, "mia": 4, "databas": 4, "project": 4, "co": 4, "forum": 4, "should": 5, "augment": 5, "allow": [5, 6], "ad": 5, "speed": 5, "perturb": 5, "tone": 5, "chang": 5, "permit": 5, "purpos": 5, "instead": [5, 6], "util": [5, 6], "tune": 5, "violat": 5, "strictli": [5, 6], "prohibit": [5, 6], "fine": 5, "fusion": 5, "structur": 5, "encourag": 5, "cpcer": [5, 6], "lower": 5, "judg": 5, "superior": 5, "forc": 5, "align": 5, "frame": 5, "level": 5, "classif": 5, "basi": 5, "shallow": 5, "end": 5, "e": [5, 6], "g": 5, "la": 5, "rnnt": 5, "transform": [5, 6], "come": 5, "right": 5, "interpret": 5, "belong": 5, "case": 5, "circumst": 5, "coordin": 5, "assign": 6, "illustr": 6, "aishell4": 6, "constrain": 6, "addition": 6, "corpu": 6, "soon": 6, "simpl": 6, "detect": 6, "vad": 6, "concaten": 6, "minimum": 6, "permut": 6, "charact": 6, "error": 6, "rate": 6, "calcul": 6, "step": 6, "firstli": 6, "hypothesi": 6, "chronolog": 6, "order": 6, "secondli": 6, "cer": 6, "repeat": 6, "lowest": 6, "tthe": 6, "insert": 6, "Ins": 6, "substitut": 6, "delet": 6, "del": 6, "output": 6, "text": 6, "frac": 6, "mathcal": 6, "n_": 6, "usag": 6, "third": 6, "hug": 6, "face": 6, "list": 6, "clearli": 6, "privat": 6, "manual": 6, "simul": 6, "thei": 6, "mandatori": 6, "clear": 6, "scheme": 6, "delight": 7, "introduct": 7, "contact": 7, "index": 7, "modul": 7, "search": 7}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"baselin": 0, "overview": [0, 2], "quick": 0, "start": 0, "result": 0, "contact": 1, "dataset": 2, "train": [2, 6], "data": 2, "detail": 2, "alimeet": 2, "corpu": 2, "get": 2, "introduct": 3, "call": 3, "particip": 3, "timelin": 3, "aoe": 3, "time": 3, "guidelin": 3, "organ": 4, "rule": 5, "track": 6, "evalu": 6, "speaker": 6, "attribut": 6, "asr": 6, "main": 6, "metric": 6, "sub": 6, "arrang": 6, "i": 6, "fix": 6, "condit": 6, "ii": 6, "open": 6, "asru": 7, "2023": 7, "multi": 7, "channel": 7, "parti": 7, "meet": 7, "transcript": 7, "challeng": 7, "2": 7, "0": 7, "m2met2": 7, "content": 7, "indic": 7, "tabl": 7}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 8, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx": 57}, "alltitles": {"Baseline": [[0, "baseline"]], "Overview": [[0, "overview"]], "Quick start": [[0, "quick-start"]], "Baseline results": [[0, "baseline-results"]], "Contact": [[1, "contact"]], "Datasets": [[2, "datasets"]], "Overview of training data": [[2, "overview-of-training-data"]], "Detail of AliMeeting corpus": [[2, "detail-of-alimeeting-corpus"]], "Get the data": [[2, "get-the-data"]], "Introduction": [[3, "introduction"]], "Call for participation": [[3, "call-for-participation"]], "Timeline(AOE Time)": [[3, "timeline-aoe-time"]], "Guidelines": [[3, "guidelines"]], "Organizers": [[4, "organizers"]], "Rules": [[5, "rules"]], "Track & Evaluation": [[6, "track-evaluation"]], "Speaker-Attributed ASR (Main Track)": [[6, "speaker-attributed-asr-main-track"]], "Evaluation metric": [[6, "evaluation-metric"]], "Sub-track arrangement": [[6, "sub-track-arrangement"]], "Sub-track I (Fixed Training Condition):": [[6, "sub-track-i-fixed-training-condition"]], "Sub-track II (Open Training Condition):": [[6, "sub-track-ii-open-training-condition"]], "ASRU 2023 MULTI-CHANNEL MULTI-PARTY MEETING TRANSCRIPTION CHALLENGE 2.0 (M2MeT2.0)": [[7, "asru-2023-multi-channel-multi-party-meeting-transcription-challenge-2-0-m2met2-0"]], "Contents:": [[7, null]], "Indices and tables": [[7, "indices-and-tables"]]}, "indexentries": {}})
\ No newline at end of file
diff --git a/docs_m2met2_cn/_build/doctrees/environment.pickle b/docs_m2met2_cn/_build/doctrees/environment.pickle
deleted file mode 100644
index 500bee7cc..000000000
Binary files a/docs_m2met2_cn/_build/doctrees/environment.pickle and /dev/null differ
diff --git a/docs_m2met2_cn/_build/doctrees/index.doctree b/docs_m2met2_cn/_build/doctrees/index.doctree
deleted file mode 100644
index c816bd988..000000000
Binary files a/docs_m2met2_cn/_build/doctrees/index.doctree and /dev/null differ
diff --git a/docs_m2met2_cn/_build/html/searchindex.js b/docs_m2met2_cn/_build/html/searchindex.js
deleted file mode 100644
index 8042b77c9..000000000
--- a/docs_m2met2_cn/_build/html/searchindex.js
+++ /dev/null
@@ -1 +0,0 @@
-Search.setIndex({"docnames": ["index", "\u57fa\u7ebf", "\u6570\u636e\u96c6", "\u7b80\u4ecb", "\u7ec4\u59d4\u4f1a", "\u8054\u7cfb\u65b9\u5f0f", "\u89c4\u5219", "\u8d5b\u9053\u8bbe\u7f6e\u4e0e\u8bc4\u4f30"], "filenames": ["index.rst", "\u57fa\u7ebf.md", "\u6570\u636e\u96c6.md", "\u7b80\u4ecb.md", "\u7ec4\u59d4\u4f1a.md", "\u8054\u7cfb\u65b9\u5f0f.md", "\u89c4\u5219.md", "\u8d5b\u9053\u8bbe\u7f6e\u4e0e\u8bc4\u4f30.md"], "titles": ["ASRU 2023 \u591a\u901a\u9053\u591a\u65b9\u4f1a\u8bae\u8f6c\u5f55\u6311\u6218 2.0", "\u57fa\u7ebf", "\u6570\u636e\u96c6", "\u7b80\u4ecb", "\u7ec4\u59d4\u4f1a", "\u8054\u7cfb\u65b9\u5f0f", "\u7ade\u8d5b\u89c4\u5219", "\u8d5b\u9053\u8bbe\u7f6e\u4e0e\u8bc4\u4f30"], "terms": {"m2met": [0, 3, 5, 7], "asru2023": [0, 3], "m2met2": [0, 3, 5, 7], "contact": [], "funasr": 1, "sa": 1, "asr": [1, 3, 7], "speakerencod": 1, "modelscop": [1, 7], "todo": 1, "fill": 1, "with": 1, "the": 1, "readm": 1, "md": 1, "of": 1, "baselin": [1, 2], "aishel": [2, 7], "cn": [2, 4, 7], "celeb": [2, 7], "test": [2, 6, 7], "2023": [2, 3, 6, 7], "118": 2, "75": 2, "104": 2, "train": 2, "eval": [2, 6], "10": [2, 3, 7], "212": 2, "15": 2, "30": 2, "456": 2, "25": 2, "13": [2, 3], "55": 2, "42": 2, "27": 2, "34": 2, "76": 2, "20": 2, "textgrid": 2, "id": 2, "openslr": 2, "automat": 3, "speech": 3, "recognit": 3, "speaker": 3, "diariz": 3, "rich": 3, "transcript": 3, "evalu": 3, "chime": 3, "comput": 3, "hear": 3, "in": 3, "multisourc": 3, "environ": 3, "misp": 3, "multimod": 3, "inform": 3, "base": 3, "process": 3, "multi": 3, "channel": 3, "parti": 3, "meet": 3, "assp2022": 3, "19": 3, "12": 3, "asru": 3, "workshop": 3, "lxie": 4, "nwpu": 4, "edu": 4, "kong": 4, "aik": 4, "lee": 4, "star": 4, "kongaik": 4, "ieee": 4, "org": 4, "zhiji": 4, "yzj": 4, "alibaba": 4, "inc": 4, "com": [4, 5], "sli": 4, "zsl": 4, "yanminqian": 4, "sjtu": 4, "zhuc": 4, "microsoft": 4, "wujian": 4, "ceo": 4, "buhui": 4, "aishelldata": 4, "alimeet": [5, 7], "gmail": 5, "cpcer": [6, 7], "las": 6, "rnnt": 6, "transform": 6, "aishell4": 7, "vad": 7, "cer": 7, "ins": 7, "sub": 7, "del": 7, "text": 7, "frac": 7, "mathcal": 7, "n_": 7, "total": 7, "time": 7, "100": 7, "hug": 7, "face": 7}, "objects": {}, "objtypes": {}, "objnames": {}, "titleterms": {"asru": 0, "2023": 0, "indic": 0, "and": 0, "tabl": 0, "alimeet": 2, "aoe": 3, "contact": []}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 8, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx": 57}, "alltitles": {"ASRU 2023 \u591a\u901a\u9053\u591a\u65b9\u4f1a\u8bae\u8f6c\u5f55\u6311\u6218 2.0": [[0, "asru-2023-2-0"]], "\u76ee\u5f55:": [[0, null]], "Indices and tables": [[0, "indices-and-tables"]], "\u57fa\u7ebf": [[1, "id1"]], "\u57fa\u7ebf\u6982\u8ff0": [[1, "id2"]], "\u5feb\u901f\u5f00\u59cb": [[1, "id3"]], "\u57fa\u7ebf\u7ed3\u679c": [[1, "id4"]], "\u6570\u636e\u96c6": [[2, "id1"]], "\u6570\u636e\u96c6\u6982\u8ff0": [[2, "id2"]], "Alimeeting\u6570\u636e\u96c6\u4ecb\u7ecd": [[2, "alimeeting"]], "\u83b7\u53d6\u6570\u636e": [[2, "id3"]], "\u7b80\u4ecb": [[3, "id1"]], "\u7ade\u8d5b\u4ecb\u7ecd": [[3, "id2"]], "\u65f6\u95f4\u5b89\u6392(AOE\u65f6\u95f4)": [[3, "aoe"]], "\u7ade\u8d5b\u62a5\u540d": [[3, "id3"]], "\u7ade\u8d5b\u89c4\u5219": [[6, "id1"]], "\u8d5b\u9053\u8bbe\u7f6e\u4e0e\u8bc4\u4f30": [[7, "id1"]], "\u8bf4\u8bdd\u4eba\u76f8\u5173\u7684\u8bed\u97f3\u8bc6\u522b (\u4e3b\u8d5b\u9053)": [[7, "id2"]], "\u8bc4\u4f30\u65b9\u6cd5": [[7, "id3"]], "\u5b50\u8d5b\u9053\u8bbe\u7f6e": [[7, "id4"]], "\u5b50\u8d5b\u9053\u4e00 (\u9650\u5b9a\u8bad\u7ec3\u6570\u636e):": [[7, "id5"]], "\u5b50\u8d5b\u9053\u4e8c (\u5f00\u653e\u8bad\u7ec3\u6570\u636e):": [[7, "id6"]], "\u7ec4\u59d4\u4f1a": [[4, "id1"]], "\u8054\u7cfb\u65b9\u5f0f": [[5, "id1"]]}, "indexentries": {}})
\ No newline at end of file
diff --git a/egs_modelscope/asr/TEMPLATE/README.md b/egs_modelscope/asr/TEMPLATE/README.md
index a064302a2..83c462d98 100644
--- a/egs_modelscope/asr/TEMPLATE/README.md
+++ b/egs_modelscope/asr/TEMPLATE/README.md
@@ -58,6 +58,22 @@ Full code of demo, please ref to [demo](https://github.com/alibaba-damo-academy/
#### [RNN-T-online model]()
Undo
+#### [MFCCA Model](https://www.modelscope.cn/models/NPU-ASLP/speech_mfcca_asr-zh-cn-16k-alimeeting-vocab4950/summary)
+For more model detailes, please refer to [docs](https://www.modelscope.cn/models/NPU-ASLP/speech_mfcca_asr-zh-cn-16k-alimeeting-vocab4950/summary)
+```python
+from modelscope.pipelines import pipeline
+from modelscope.utils.constant import Tasks
+
+inference_pipeline = pipeline(
+ task=Tasks.auto_speech_recognition,
+ model='NPU-ASLP/speech_mfcca_asr-zh-cn-16k-alimeeting-vocab4950',
+ model_revision='v3.0.0'
+)
+
+rec_result = inference_pipeline(audio_in='https://isv-data.oss-cn-hangzhou.aliyuncs.com/ics/MaaS/ASR/test_audio/asr_example_zh.wav')
+print(rec_result)
+```
+
#### API-reference
##### Define pipeline
- `task`: `Tasks.auto_speech_recognition`
@@ -94,6 +110,8 @@ FunASR also offer recipes [egs_modelscope/asr/TEMPLATE/infer.sh](https://github.
- `njob`: only used for CPU inference (`gpu_inference`=`false`), `64` (Default), the number of jobs for CPU decoding
- `checkpoint_dir`: only used for infer finetuned models, the path dir of finetuned models
- `checkpoint_name`: only used for infer finetuned models, `valid.cer_ctc.ave.pb` (Default), which checkpoint is used to infer
+ - `decoding_mode`: `normal` (Default), decoding mode for UniASR model(fast、normal、offline)
+ - `hotword_txt`: `None` (Default), hotword file for contextual paraformer model(the hotword file name ends with .txt")
- Decode with multi GPUs:
```shell
diff --git a/egs_modelscope/asr/TEMPLATE/infer.py b/egs_modelscope/asr/TEMPLATE/infer.py
index 9f280d50b..5bc205cda 100644
--- a/egs_modelscope/asr/TEMPLATE/infer.py
+++ b/egs_modelscope/asr/TEMPLATE/infer.py
@@ -11,6 +11,7 @@ def modelscope_infer(args):
model=args.model,
output_dir=args.output_dir,
batch_size=args.batch_size,
+ param_dict={"decoding_model": args.decoding_mode, "hotword": args.hotword_txt}
)
inference_pipeline(audio_in=args.audio_in)
@@ -19,7 +20,9 @@ if __name__ == "__main__":
parser.add_argument('--model', type=str, default="damo/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-pytorch")
parser.add_argument('--audio_in', type=str, default="./data/test/wav.scp")
parser.add_argument('--output_dir', type=str, default="./results/")
+ parser.add_argument('--decoding_mode', type=str, default="normal")
+ parser.add_argument('--hotword_txt', type=str, default=None)
parser.add_argument('--batch_size', type=int, default=64)
parser.add_argument('--gpuid', type=str, default="0")
args = parser.parse_args()
- modelscope_infer(args)
\ No newline at end of file
+ modelscope_infer(args)
diff --git a/egs_modelscope/asr/mfcca/speech_mfcca_asr-zh-cn-16k-alimeeting-vocab4950/README.md b/egs_modelscope/asr/mfcca/speech_mfcca_asr-zh-cn-16k-alimeeting-vocab4950/README.md
deleted file mode 100644
index 16aeada4b..000000000
--- a/egs_modelscope/asr/mfcca/speech_mfcca_asr-zh-cn-16k-alimeeting-vocab4950/README.md
+++ /dev/null
@@ -1,53 +0,0 @@
-# ModelScope Model
-
-## How to finetune and infer using a pretrained Paraformer-large Model
-
-### Finetune
-
-- Modify finetune training related parameters in `finetune.py`
- - output_dir: # result dir
- - data_dir: # the dataset dir needs to include files: `train/wav.scp`, `train/text`; `validation/wav.scp`, `validation/text`
- - dataset_type: # for dataset larger than 1000 hours, set as `large`, otherwise set as `small`
- - batch_bins: # batch size. For dataset_type is `small`, `batch_bins` indicates the feature frames. For dataset_type is `large`, `batch_bins` indicates the duration in ms
- - max_epoch: # number of training epoch
- - lr: # learning rate
-
-- Then you can run the pipeline to finetune with:
-```python
- python finetune.py
-```
-
-### Inference
-
-Or you can use the finetuned model for inference directly.
-
-- Setting parameters in `infer.py`
- - data_dir: # the dataset dir needs to include `test/wav.scp`. If `test/text` is also exists, CER will be computed
- - output_dir: # result dir
- - ngpu: # the number of GPUs for decoding
- - njob: # the number of jobs for each GPU
-
-- Then you can run the pipeline to infer with:
-```python
- python infer.py
-```
-
-- Results
-
-The decoding results can be found in `$output_dir/1best_recog/text.sp.cer` and `$output_dir/1best_recog/text.nosp.cer`, which includes recognition results with or without separating character (src) of each sample and the CER metric of the whole test set.
-
-### Inference using local finetuned model
-
-- Modify inference related parameters in `infer_after_finetune.py`
- - output_dir: # result dir
- - data_dir: # the dataset dir needs to include `test/wav.scp`. If `test/text` is also exists, CER will be computed
- - decoding_model_name: # set the checkpoint name for decoding, e.g., `valid.cer_ctc.ave.pb`
-
-- Then you can run the pipeline to finetune with:
-```python
- python infer_after_finetune.py
-```
-
-- Results
-
-The decoding results can be found in `$output_dir/1best_recog/text.sp.cer` and `$output_dir/1best_recog/text.nosp.cer`, which includes recognition results with or without separating character (src) of each sample and the CER metric of the whole test set.
diff --git a/egs_modelscope/asr/mfcca/speech_mfcca_asr-zh-cn-16k-alimeeting-vocab4950/README.md b/egs_modelscope/asr/mfcca/speech_mfcca_asr-zh-cn-16k-alimeeting-vocab4950/README.md
new file mode 120000
index 000000000..bb55ab52e
--- /dev/null
+++ b/egs_modelscope/asr/mfcca/speech_mfcca_asr-zh-cn-16k-alimeeting-vocab4950/README.md
@@ -0,0 +1 @@
+../../TEMPLATE/README.md
\ No newline at end of file
diff --git a/egs_modelscope/asr/mfcca/speech_mfcca_asr-zh-cn-16k-alimeeting-vocab4950/infer.py b/egs_modelscope/asr/mfcca/speech_mfcca_asr-zh-cn-16k-alimeeting-vocab4950/infer.py
index 8abadd719..12ec2ac8c 100755
--- a/egs_modelscope/asr/mfcca/speech_mfcca_asr-zh-cn-16k-alimeeting-vocab4950/infer.py
+++ b/egs_modelscope/asr/mfcca/speech_mfcca_asr-zh-cn-16k-alimeeting-vocab4950/infer.py
@@ -1,102 +1,27 @@
import os
import shutil
-from multiprocessing import Pool
-
+import argparse
from modelscope.pipelines import pipeline
from modelscope.utils.constant import Tasks
-from funasr.utils.compute_wer import compute_wer
-
-def modelscope_infer_core(output_dir, split_dir, njob, idx):
- output_dir_job = os.path.join(output_dir, "output.{}".format(idx))
- gpu_id = (int(idx) - 1) // njob
- if "CUDA_VISIBLE_DEVICES" in os.environ.keys():
- gpu_list = os.environ['CUDA_VISIBLE_DEVICES'].split(",")
- os.environ['CUDA_VISIBLE_DEVICES'] = str(gpu_list[gpu_id])
- else:
- os.environ['CUDA_VISIBLE_DEVICES'] = str(gpu_id)
- inference_pipline = pipeline(
+def modelscope_infer(args):
+ os.environ['CUDA_VISIBLE_DEVICES'] = str(args.gpuid)
+ inference_pipeline = pipeline(
task=Tasks.auto_speech_recognition,
- model='NPU-ASLP/speech_mfcca_asr-zh-cn-16k-alimeeting-vocab4950',
- model_revision='v3.0.0',
- output_dir=output_dir_job,
- batch_size=1,
+ model=args.model,
+ model_revision=args.model_revision,
+ output_dir=args.output_dir,
+ batch_size=args.batch_size,
)
- audio_in = os.path.join(split_dir, "wav.{}.scp".format(idx))
- inference_pipline(audio_in=audio_in)
-
-
-def modelscope_infer(params):
- # prepare for multi-GPU decoding
- ngpu = params["ngpu"]
- njob = params["njob"]
- output_dir = params["output_dir"]
- if os.path.exists(output_dir):
- shutil.rmtree(output_dir)
- os.mkdir(output_dir)
- split_dir = os.path.join(output_dir, "split")
- os.mkdir(split_dir)
- nj = ngpu * njob
- wav_scp_file = os.path.join(params["data_dir"], "wav.scp")
- with open(wav_scp_file) as f:
- lines = f.readlines()
- num_lines = len(lines)
- num_job_lines = num_lines // nj
- start = 0
- for i in range(nj):
- end = start + num_job_lines
- file = os.path.join(split_dir, "wav.{}.scp".format(str(i + 1)))
- with open(file, "w") as f:
- if i == nj - 1:
- f.writelines(lines[start:])
- else:
- f.writelines(lines[start:end])
- start = end
- p = Pool(nj)
- for i in range(nj):
- p.apply_async(modelscope_infer_core,
- args=(output_dir, split_dir, njob, str(i + 1)))
- p.close()
- p.join()
-
- # combine decoding results
- best_recog_path = os.path.join(output_dir, "1best_recog")
- os.mkdir(best_recog_path)
- files = ["text", "token", "score"]
- for file in files:
- with open(os.path.join(best_recog_path, file), "w") as f:
- for i in range(nj):
- job_file = os.path.join(output_dir, "output.{}/1best_recog".format(str(i + 1)), file)
- with open(job_file) as f_job:
- lines = f_job.readlines()
- f.writelines(lines)
-
- # If text exists, compute CER
- text_in = os.path.join(params["data_dir"], "text")
- if os.path.exists(text_in):
- text_proc_file = os.path.join(best_recog_path, "token")
- text_proc_file2 = os.path.join(best_recog_path, "token_nosep")
- with open(text_proc_file, 'r') as hyp_reader:
- with open(text_proc_file2, 'w') as hyp_writer:
- for line in hyp_reader:
- new_context = line.strip().replace("src","").replace(" "," ").replace(" "," ").strip()
- hyp_writer.write(new_context+'\n')
- text_in2 = os.path.join(best_recog_path, "ref_text_nosep")
- with open(text_in, 'r') as ref_reader:
- with open(text_in2, 'w') as ref_writer:
- for line in ref_reader:
- new_context = line.strip().replace("src","").replace(" "," ").replace(" "," ").strip()
- ref_writer.write(new_context+'\n')
-
-
- compute_wer(text_in, text_proc_file, os.path.join(best_recog_path, "text.sp.cer"))
- compute_wer(text_in2, text_proc_file2, os.path.join(best_recog_path, "text.nosp.cer"))
-
+ inference_pipeline(audio_in=args.audio_in)
if __name__ == "__main__":
- params = {}
- params["data_dir"] = "./example_data/validation"
- params["output_dir"] = "./output_dir"
- params["ngpu"] = 1
- params["njob"] = 1
- modelscope_infer(params)
+ parser = argparse.ArgumentParser()
+ parser.add_argument('--model', type=str, default="NPU-ASLP/speech_mfcca_asr-zh-cn-16k-alimeeting-vocab4950")
+ parser.add_argument('--model_revision', type=str, default="v3.0.0")
+ parser.add_argument('--audio_in', type=str, default="./data/test/wav.scp")
+ parser.add_argument('--output_dir', type=str, default="./results/")
+ parser.add_argument('--batch_size', type=int, default=1)
+ parser.add_argument('--gpuid', type=str, default="0")
+ args = parser.parse_args()
+ modelscope_infer(args)
diff --git a/egs_modelscope/asr/mfcca/speech_mfcca_asr-zh-cn-16k-alimeeting-vocab4950/infer.sh b/egs_modelscope/asr/mfcca/speech_mfcca_asr-zh-cn-16k-alimeeting-vocab4950/infer.sh
new file mode 100755
index 000000000..51a4968bc
--- /dev/null
+++ b/egs_modelscope/asr/mfcca/speech_mfcca_asr-zh-cn-16k-alimeeting-vocab4950/infer.sh
@@ -0,0 +1,70 @@
+#!/usr/bin/env bash
+
+set -e
+set -u
+set -o pipefail
+
+stage=1
+stop_stage=3
+model="NPU-ASLP/speech_mfcca_asr-zh-cn-16k-alimeeting-vocab4950"
+data_dir="./data/test"
+output_dir="./results_pl_gpu"
+batch_size=1
+gpu_inference=true # whether to perform gpu decoding
+gpuid_list="3,4" # set gpus, e.g., gpuid_list="0,1"
+njob=4 # the number of jobs for CPU decoding, if gpu_inference=false, use CPU decoding, please set njob
+
+. utils/parse_options.sh || exit 1;
+
+if ${gpu_inference} == "true"; then
+ nj=$(echo $gpuid_list | awk -F "," '{print NF}')
+else
+ nj=$njob
+ batch_size=1
+ gpuid_list=""
+ for JOB in $(seq ${nj}); do
+ gpuid_list=$gpuid_list"-1,"
+ done
+fi
+
+mkdir -p $output_dir/split
+split_scps=""
+for JOB in $(seq ${nj}); do
+ split_scps="$split_scps $output_dir/split/wav.$JOB.scp"
+done
+perl utils/split_scp.pl ${data_dir}/wav.scp ${split_scps}
+
+if [ $stage -le 1 ] && [ $stop_stage -ge 1 ];then
+ echo "Decoding ..."
+ gpuid_list_array=(${gpuid_list//,/ })
+ ./utils/run.pl JOB=1:${nj} ${output_dir}/log/infer.JOB.log \
+ python infer.py \
+ --model ${model} \
+ --audio_in ${output_dir}/split/wav.JOB.scp \
+ --output_dir ${output_dir}/output.JOB \
+ --batch_size ${batch_size} \
+ --gpuid ${gpuid_list_array[JOB-1]}
+
+ mkdir -p ${output_dir}/1best_recog
+ for f in token score text; do
+ if [ -f "${output_dir}/output.1/1best_recog/${f}" ]; then
+ for i in $(seq "${nj}"); do
+ cat "${output_dir}/output.${i}/1best_recog/${f}"
+ done | sort -k1 >"${output_dir}/1best_recog/${f}"
+ fi
+ done
+fi
+
+if [ $stage -le 2 ] && [ $stop_stage -ge 2 ];then
+ echo "Computing WER ..."
+ cp ${output_dir}/1best_recog/token ${output_dir}/1best_recog/text.proc
+ cp ${data_dir}/text ${output_dir}/1best_recog/text.ref
+ sed -e 's/src//g' ${output_dir}/1best_recog/text.proc | sed -e 's/ \+/ /g' > ${output_dir}/1best_recog/text_nosp.proc
+ sed -e 's/src//g' ${output_dir}/1best_recog/text.ref | sed -e 's/ \+/ /g' > ${output_dir}/1best_recog/text_nosp.ref
+
+ python utils/compute_wer.py ${output_dir}/1best_recog/text.ref ${output_dir}/1best_recog/text.proc ${output_dir}/1best_recog/text.sp.cer
+ tail -n 3 ${output_dir}/1best_recog/text.sp.cer
+ python utils/compute_wer.py ${output_dir}/1best_recog/text_nosp.ref ${output_dir}/1best_recog/text_nosp.proc ${output_dir}/1best_recog/text.nosp.cer
+ tail -n 3 ${output_dir}/1best_recog/text.nosp.cer
+fi
+
diff --git a/egs_modelscope/asr/mfcca/speech_mfcca_asr-zh-cn-16k-alimeeting-vocab4950/utils b/egs_modelscope/asr/mfcca/speech_mfcca_asr-zh-cn-16k-alimeeting-vocab4950/utils
new file mode 120000
index 000000000..2ac163ff4
--- /dev/null
+++ b/egs_modelscope/asr/mfcca/speech_mfcca_asr-zh-cn-16k-alimeeting-vocab4950/utils
@@ -0,0 +1 @@
+../../../../egs/aishell/transformer/utils
\ No newline at end of file
diff --git a/egs_modelscope/asr/paraformer/speech_paraformer-large-contextual_asr_nat-zh-cn-16k-common-vocab8404/demo.py b/egs_modelscope/asr/paraformer/speech_paraformer-large-contextual_asr_nat-zh-cn-16k-common-vocab8404/demo.py
new file mode 100644
index 000000000..bec6f052e
--- /dev/null
+++ b/egs_modelscope/asr/paraformer/speech_paraformer-large-contextual_asr_nat-zh-cn-16k-common-vocab8404/demo.py
@@ -0,0 +1,12 @@
+from modelscope.pipelines import pipeline
+from modelscope.utils.constant import Tasks
+
+param_dict = dict()
+param_dict['hotword'] = "https://isv-data.oss-cn-hangzhou.aliyuncs.com/ics/MaaS/ASR/test_audio/hotword.txt"
+inference_pipeline = pipeline(
+ task=Tasks.auto_speech_recognition,
+ model="damo/speech_paraformer-large-contextual_asr_nat-zh-cn-16k-common-vocab8404",
+ param_dict=param_dict)
+
+rec_result = inference_pipeline(audio_in='https://isv-data.oss-cn-hangzhou.aliyuncs.com/ics/MaaS/ASR/test_audio/asr_example_hotword.wav')
+print(rec_result)
diff --git a/egs_modelscope/asr/paraformer/speech_paraformer-large-contextual_asr_nat-zh-cn-16k-common-vocab8404/infer.py b/egs_modelscope/asr/paraformer/speech_paraformer-large-contextual_asr_nat-zh-cn-16k-common-vocab8404/infer.py
deleted file mode 100644
index 16a57e9af..000000000
--- a/egs_modelscope/asr/paraformer/speech_paraformer-large-contextual_asr_nat-zh-cn-16k-common-vocab8404/infer.py
+++ /dev/null
@@ -1,21 +0,0 @@
-from modelscope.pipelines import pipeline
-from modelscope.utils.constant import Tasks
-
-
-if __name__ == '__main__':
- param_dict = dict()
- param_dict['hotword'] = "https://isv-data.oss-cn-hangzhou.aliyuncs.com/ics/MaaS/ASR/test_audio/hotword.txt"
-
- audio_in = "https://isv-data.oss-cn-hangzhou.aliyuncs.com/ics/MaaS/ASR/test_audio/asr_example_hotword.wav"
- output_dir = None
- batch_size = 1
-
- inference_pipeline = pipeline(
- task=Tasks.auto_speech_recognition,
- model="damo/speech_paraformer-large-contextual_asr_nat-zh-cn-16k-common-vocab8404",
- output_dir=output_dir,
- batch_size=batch_size,
- param_dict=param_dict)
-
- rec_result = inference_pipeline(audio_in=audio_in)
- print(rec_result)
diff --git a/egs_modelscope/asr/paraformer/speech_paraformer-large-contextual_asr_nat-zh-cn-16k-common-vocab8404/infer.py b/egs_modelscope/asr/paraformer/speech_paraformer-large-contextual_asr_nat-zh-cn-16k-common-vocab8404/infer.py
new file mode 120000
index 000000000..128fc31c2
--- /dev/null
+++ b/egs_modelscope/asr/paraformer/speech_paraformer-large-contextual_asr_nat-zh-cn-16k-common-vocab8404/infer.py
@@ -0,0 +1 @@
+../../TEMPLATE/infer.py
\ No newline at end of file
diff --git a/egs_modelscope/asr/paraformer/speech_paraformer-large-contextual_asr_nat-zh-cn-16k-common-vocab8404/infer.sh b/egs_modelscope/asr/paraformer/speech_paraformer-large-contextual_asr_nat-zh-cn-16k-common-vocab8404/infer.sh
new file mode 100644
index 000000000..e60f6d973
--- /dev/null
+++ b/egs_modelscope/asr/paraformer/speech_paraformer-large-contextual_asr_nat-zh-cn-16k-common-vocab8404/infer.sh
@@ -0,0 +1,105 @@
+#!/usr/bin/env bash
+
+set -e
+set -u
+set -o pipefail
+
+stage=1
+stop_stage=2
+model="damo/speech_paraformer-large-contextual_asr_nat-zh-cn-16k-common-vocab8404"
+data_dir="./data/test"
+output_dir="./results"
+batch_size=64
+gpu_inference=true # whether to perform gpu decoding
+gpuid_list="0,1" # set gpus, e.g., gpuid_list="0,1"
+njob=64 # the number of jobs for CPU decoding, if gpu_inference=false, use CPU decoding, please set njob
+checkpoint_dir=
+checkpoint_name="valid.cer_ctc.ave.pb"
+hotword_txt=None
+
+. utils/parse_options.sh || exit 1;
+
+if ${gpu_inference} == "true"; then
+ nj=$(echo $gpuid_list | awk -F "," '{print NF}')
+else
+ nj=$njob
+ batch_size=1
+ gpuid_list=""
+ for JOB in $(seq ${nj}); do
+ gpuid_list=$gpuid_list"-1,"
+ done
+fi
+
+mkdir -p $output_dir/split
+split_scps=""
+for JOB in $(seq ${nj}); do
+ split_scps="$split_scps $output_dir/split/wav.$JOB.scp"
+done
+perl utils/split_scp.pl ${data_dir}/wav.scp ${split_scps}
+
+if [ -n "${checkpoint_dir}" ]; then
+ python utils/prepare_checkpoint.py ${model} ${checkpoint_dir} ${checkpoint_name}
+ model=${checkpoint_dir}/${model}
+fi
+
+if [ $stage -le 1 ] && [ $stop_stage -ge 1 ];then
+ echo "Decoding ..."
+ gpuid_list_array=(${gpuid_list//,/ })
+ for JOB in $(seq ${nj}); do
+ {
+ id=$((JOB-1))
+ gpuid=${gpuid_list_array[$id]}
+ mkdir -p ${output_dir}/output.$JOB
+ python infer.py \
+ --model ${model} \
+ --audio_in ${output_dir}/split/wav.$JOB.scp \
+ --output_dir ${output_dir}/output.$JOB \
+ --batch_size ${batch_size} \
+ --gpuid ${gpuid} \
+ --hotword_txt ${hotword_txt}
+ }&
+ done
+ wait
+
+ mkdir -p ${output_dir}/1best_recog
+ for f in token score text; do
+ if [ -f "${output_dir}/output.1/1best_recog/${f}" ]; then
+ for i in $(seq "${nj}"); do
+ cat "${output_dir}/output.${i}/1best_recog/${f}"
+ done | sort -k1 >"${output_dir}/1best_recog/${f}"
+ fi
+ done
+fi
+
+if [ $stage -le 2 ] && [ $stop_stage -ge 2 ];then
+ echo "Computing WER ..."
+ cp ${output_dir}/1best_recog/text ${output_dir}/1best_recog/text.proc
+ cp ${data_dir}/text ${output_dir}/1best_recog/text.ref
+ python utils/compute_wer.py ${output_dir}/1best_recog/text.ref ${output_dir}/1best_recog/text.proc ${output_dir}/1best_recog/text.cer
+ tail -n 3 ${output_dir}/1best_recog/text.cer
+fi
+
+if [ $stage -le 3 ] && [ $stop_stage -ge 3 ];then
+ echo "SpeechIO TIOBE textnorm"
+ echo "$0 --> Normalizing REF text ..."
+ ./utils/textnorm_zh.py \
+ --has_key --to_upper \
+ ${data_dir}/text \
+ ${output_dir}/1best_recog/ref.txt
+
+ echo "$0 --> Normalizing HYP text ..."
+ ./utils/textnorm_zh.py \
+ --has_key --to_upper \
+ ${output_dir}/1best_recog/text.proc \
+ ${output_dir}/1best_recog/rec.txt
+ grep -v $'\t$' ${output_dir}/1best_recog/rec.txt > ${output_dir}/1best_recog/rec_non_empty.txt
+
+ echo "$0 --> computing WER/CER and alignment ..."
+ ./utils/error_rate_zh \
+ --tokenizer char \
+ --ref ${output_dir}/1best_recog/ref.txt \
+ --hyp ${output_dir}/1best_recog/rec_non_empty.txt \
+ ${output_dir}/1best_recog/DETAILS.txt | tee ${output_dir}/1best_recog/RESULTS.txt
+ rm -rf ${output_dir}/1best_recog/rec.txt ${output_dir}/1best_recog/rec_non_empty.txt
+fi
+
diff --git a/egs_modelscope/asr/paraformer/speech_paraformer-large-contextual_asr_nat-zh-cn-16k-common-vocab8404/utils b/egs_modelscope/asr/paraformer/speech_paraformer-large-contextual_asr_nat-zh-cn-16k-common-vocab8404/utils
new file mode 120000
index 000000000..2ac163ff4
--- /dev/null
+++ b/egs_modelscope/asr/paraformer/speech_paraformer-large-contextual_asr_nat-zh-cn-16k-common-vocab8404/utils
@@ -0,0 +1 @@
+../../../../egs/aishell/transformer/utils
\ No newline at end of file
diff --git a/egs_modelscope/asr/paraformer/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-pytorch/demo.py b/egs_modelscope/asr/paraformer/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-pytorch/demo.py
new file mode 100644
index 000000000..edc3a050e
--- /dev/null
+++ b/egs_modelscope/asr/paraformer/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-pytorch/demo.py
@@ -0,0 +1,9 @@
+from modelscope.pipelines import pipeline
+from modelscope.utils.constant import Tasks
+
+inference_pipeline = pipeline(
+ task=Tasks.auto_speech_recognition,
+ model='damo/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-pytorch')
+
+rec_result = inference_pipeline(audio_in='https://isv-data.oss-cn-hangzhou.aliyuncs.com/ics/MaaS/ASR/test_audio/asr_example_zh.wav')
+print(rec_result)
diff --git a/egs_modelscope/asr/paraformer/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-pytorch/infer.py b/egs_modelscope/asr/paraformer/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-pytorch/infer.py
deleted file mode 100644
index 9f280d50b..000000000
--- a/egs_modelscope/asr/paraformer/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-pytorch/infer.py
+++ /dev/null
@@ -1,25 +0,0 @@
-import os
-import shutil
-import argparse
-from modelscope.pipelines import pipeline
-from modelscope.utils.constant import Tasks
-
-def modelscope_infer(args):
- os.environ['CUDA_VISIBLE_DEVICES'] = str(args.gpuid)
- inference_pipeline = pipeline(
- task=Tasks.auto_speech_recognition,
- model=args.model,
- output_dir=args.output_dir,
- batch_size=args.batch_size,
- )
- inference_pipeline(audio_in=args.audio_in)
-
-if __name__ == "__main__":
- parser = argparse.ArgumentParser()
- parser.add_argument('--model', type=str, default="damo/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-pytorch")
- parser.add_argument('--audio_in', type=str, default="./data/test/wav.scp")
- parser.add_argument('--output_dir', type=str, default="./results/")
- parser.add_argument('--batch_size', type=int, default=64)
- parser.add_argument('--gpuid', type=str, default="0")
- args = parser.parse_args()
- modelscope_infer(args)
\ No newline at end of file
diff --git a/egs_modelscope/asr/paraformer/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-pytorch/infer.py b/egs_modelscope/asr/paraformer/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-pytorch/infer.py
new file mode 120000
index 000000000..128fc31c2
--- /dev/null
+++ b/egs_modelscope/asr/paraformer/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-pytorch/infer.py
@@ -0,0 +1 @@
+../../TEMPLATE/infer.py
\ No newline at end of file
diff --git a/egs_modelscope/asr/paraformer/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-pytorch/infer.sh b/egs_modelscope/asr/paraformer/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-pytorch/infer.sh
index b8b011c0a..ef49d7a60 100644
--- a/egs_modelscope/asr/paraformer/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-pytorch/infer.sh
+++ b/egs_modelscope/asr/paraformer/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-pytorch/infer.sh
@@ -12,7 +12,9 @@ output_dir="./results"
batch_size=64
gpu_inference=true # whether to perform gpu decoding
gpuid_list="0,1" # set gpus, e.g., gpuid_list="0,1"
-njob=4 # the number of jobs for CPU decoding, if gpu_inference=false, use CPU decoding, please set njob
+njob=64 # the number of jobs for CPU decoding, if gpu_inference=false, use CPU decoding, please set njob
+checkpoint_dir=
+checkpoint_name="valid.cer_ctc.ave.pb"
. utils/parse_options.sh || exit 1;
@@ -34,6 +36,11 @@ for JOB in $(seq ${nj}); do
done
perl utils/split_scp.pl ${data_dir}/wav.scp ${split_scps}
+if [ -n "${checkpoint_dir}" ]; then
+ python utils/prepare_checkpoint.py ${model} ${checkpoint_dir} ${checkpoint_name}
+ model=${checkpoint_dir}/${model}
+fi
+
if [ $stage -le 1 ] && [ $stop_stage -ge 1 ];then
echo "Decoding ..."
gpuid_list_array=(${gpuid_list//,/ })
diff --git a/egs_modelscope/asr/uniasr/speech_UniASR_asr_2pass-minnan-16k-common-vocab3825/demo.py b/egs_modelscope/asr/uniasr/speech_UniASR_asr_2pass-minnan-16k-common-vocab3825/demo.py
new file mode 100644
index 000000000..570f910fe
--- /dev/null
+++ b/egs_modelscope/asr/uniasr/speech_UniASR_asr_2pass-minnan-16k-common-vocab3825/demo.py
@@ -0,0 +1,12 @@
+from modelscope.pipelines import pipeline
+from modelscope.utils.constant import Tasks
+
+decoding_mode="normal" #fast, normal, offline
+inference_pipeline = pipeline(
+ task=Tasks.auto_speech_recognition,
+ model='damo/speech_UniASR_asr_2pass-minnan-16k-common-vocab3825',
+ param_dict={"decoding_model": decoding_mode}
+)
+
+rec_result = inference_pipeline(audio_in='https://isv-data.oss-cn-hangzhou.aliyuncs.com/ics/MaaS/ASR/test_audio/asr_example_zh.wav')
+print(rec_result)
diff --git a/egs_modelscope/asr/uniasr/speech_UniASR_asr_2pass-minnan-16k-common-vocab3825/infer.py b/egs_modelscope/asr/uniasr/speech_UniASR_asr_2pass-minnan-16k-common-vocab3825/infer.py
deleted file mode 100644
index d28395be4..000000000
--- a/egs_modelscope/asr/uniasr/speech_UniASR_asr_2pass-minnan-16k-common-vocab3825/infer.py
+++ /dev/null
@@ -1,89 +0,0 @@
-import os
-import shutil
-from multiprocessing import Pool
-
-from modelscope.pipelines import pipeline
-from modelscope.utils.constant import Tasks
-
-from funasr.utils.compute_wer import compute_wer
-
-
-def modelscope_infer_core(output_dir, split_dir, njob, idx):
- output_dir_job = os.path.join(output_dir, "output.{}".format(idx))
- gpu_id = (int(idx) - 1) // njob
- if "CUDA_VISIBLE_DEVICES" in os.environ.keys():
- gpu_list = os.environ['CUDA_VISIBLE_DEVICES'].split(",")
- os.environ['CUDA_VISIBLE_DEVICES'] = str(gpu_list[gpu_id])
- else:
- os.environ['CUDA_VISIBLE_DEVICES'] = str(gpu_id)
- inference_pipline = pipeline(
- task=Tasks.auto_speech_recognition,
- model="damo/speech_UniASR_asr_2pass-minnan-16k-common-vocab3825",
- output_dir=output_dir_job,
- batch_size=1
- )
- audio_in = os.path.join(split_dir, "wav.{}.scp".format(idx))
- inference_pipline(audio_in=audio_in, param_dict={"decoding_model": "normal"})
-
-
-def modelscope_infer(params):
- # prepare for multi-GPU decoding
- ngpu = params["ngpu"]
- njob = params["njob"]
- output_dir = params["output_dir"]
- if os.path.exists(output_dir):
- shutil.rmtree(output_dir)
- os.mkdir(output_dir)
- split_dir = os.path.join(output_dir, "split")
- os.mkdir(split_dir)
- nj = ngpu * njob
- wav_scp_file = os.path.join(params["data_dir"], "wav.scp")
- with open(wav_scp_file) as f:
- lines = f.readlines()
- num_lines = len(lines)
- num_job_lines = num_lines // nj
- start = 0
- for i in range(nj):
- end = start + num_job_lines
- file = os.path.join(split_dir, "wav.{}.scp".format(str(i + 1)))
- with open(file, "w") as f:
- if i == nj - 1:
- f.writelines(lines[start:])
- else:
- f.writelines(lines[start:end])
- start = end
-
- p = Pool(nj)
- for i in range(nj):
- p.apply_async(modelscope_infer_core,
- args=(output_dir, split_dir, njob, str(i + 1)))
- p.close()
- p.join()
-
- # combine decoding results
- best_recog_path = os.path.join(output_dir, "1best_recog")
- os.mkdir(best_recog_path)
- files = ["text", "token", "score"]
- for file in files:
- with open(os.path.join(best_recog_path, file), "w") as f:
- for i in range(nj):
- job_file = os.path.join(output_dir, "output.{}/1best_recog".format(str(i + 1)), file)
- with open(job_file) as f_job:
- lines = f_job.readlines()
- f.writelines(lines)
-
- # If text exists, compute CER
- text_in = os.path.join(params["data_dir"], "text")
- if os.path.exists(text_in):
- text_proc_file = os.path.join(best_recog_path, "token")
- compute_wer(text_in, text_proc_file, os.path.join(best_recog_path, "text.cer"))
- os.system("tail -n 3 {}".format(os.path.join(best_recog_path, "text.cer")))
-
-
-if __name__ == "__main__":
- params = {}
- params["data_dir"] = "./data/test"
- params["output_dir"] = "./results"
- params["ngpu"] = 1
- params["njob"] = 8
- modelscope_infer(params)
diff --git a/egs_modelscope/asr/uniasr/speech_UniASR_asr_2pass-minnan-16k-common-vocab3825/infer.py b/egs_modelscope/asr/uniasr/speech_UniASR_asr_2pass-minnan-16k-common-vocab3825/infer.py
new file mode 120000
index 000000000..128fc31c2
--- /dev/null
+++ b/egs_modelscope/asr/uniasr/speech_UniASR_asr_2pass-minnan-16k-common-vocab3825/infer.py
@@ -0,0 +1 @@
+../../TEMPLATE/infer.py
\ No newline at end of file
diff --git a/egs_modelscope/asr/uniasr/speech_UniASR_asr_2pass-minnan-16k-common-vocab3825/infer.sh b/egs_modelscope/asr/uniasr/speech_UniASR_asr_2pass-minnan-16k-common-vocab3825/infer.sh
new file mode 100644
index 000000000..b44be9f3c
--- /dev/null
+++ b/egs_modelscope/asr/uniasr/speech_UniASR_asr_2pass-minnan-16k-common-vocab3825/infer.sh
@@ -0,0 +1,105 @@
+#!/usr/bin/env bash
+
+set -e
+set -u
+set -o pipefail
+
+stage=1
+stop_stage=2
+model="damo/speech_UniASR_asr_2pass-minnan-16k-common-vocab3825"
+data_dir="./data/test"
+output_dir="./results"
+batch_size=1
+gpu_inference=true # whether to perform gpu decoding
+gpuid_list="0,1" # set gpus, e.g., gpuid_list="0,1"
+njob=64 # the number of jobs for CPU decoding, if gpu_inference=false, use CPU decoding, please set njob
+checkpoint_dir=
+checkpoint_name="valid.cer_ctc.ave.pb"
+decoding_mode="normal"
+
+. utils/parse_options.sh || exit 1;
+
+if ${gpu_inference} == "true"; then
+ nj=$(echo $gpuid_list | awk -F "," '{print NF}')
+else
+ nj=$njob
+ batch_size=1
+ gpuid_list=""
+ for JOB in $(seq ${nj}); do
+ gpuid_list=$gpuid_list"-1,"
+ done
+fi
+
+mkdir -p $output_dir/split
+split_scps=""
+for JOB in $(seq ${nj}); do
+ split_scps="$split_scps $output_dir/split/wav.$JOB.scp"
+done
+perl utils/split_scp.pl ${data_dir}/wav.scp ${split_scps}
+
+if [ -n "${checkpoint_dir}" ]; then
+ python utils/prepare_checkpoint.py ${model} ${checkpoint_dir} ${checkpoint_name}
+ model=${checkpoint_dir}/${model}
+fi
+
+if [ $stage -le 1 ] && [ $stop_stage -ge 1 ];then
+ echo "Decoding ..."
+ gpuid_list_array=(${gpuid_list//,/ })
+ for JOB in $(seq ${nj}); do
+ {
+ id=$((JOB-1))
+ gpuid=${gpuid_list_array[$id]}
+ mkdir -p ${output_dir}/output.$JOB
+ python infer.py \
+ --model ${model} \
+ --audio_in ${output_dir}/split/wav.$JOB.scp \
+ --output_dir ${output_dir}/output.$JOB \
+ --batch_size ${batch_size} \
+ --gpuid ${gpuid} \
+ --decoding_mode ${decoding_mode}
+ }&
+ done
+ wait
+
+ mkdir -p ${output_dir}/1best_recog
+ for f in token score text; do
+ if [ -f "${output_dir}/output.1/1best_recog/${f}" ]; then
+ for i in $(seq "${nj}"); do
+ cat "${output_dir}/output.${i}/1best_recog/${f}"
+ done | sort -k1 >"${output_dir}/1best_recog/${f}"
+ fi
+ done
+fi
+
+if [ $stage -le 2 ] && [ $stop_stage -ge 2 ];then
+ echo "Computing WER ..."
+ cp ${output_dir}/1best_recog/text ${output_dir}/1best_recog/text.proc
+ cp ${data_dir}/text ${output_dir}/1best_recog/text.ref
+ python utils/compute_wer.py ${output_dir}/1best_recog/text.ref ${output_dir}/1best_recog/text.proc ${output_dir}/1best_recog/text.cer
+ tail -n 3 ${output_dir}/1best_recog/text.cer
+fi
+
+if [ $stage -le 3 ] && [ $stop_stage -ge 3 ];then
+ echo "SpeechIO TIOBE textnorm"
+ echo "$0 --> Normalizing REF text ..."
+ ./utils/textnorm_zh.py \
+ --has_key --to_upper \
+ ${data_dir}/text \
+ ${output_dir}/1best_recog/ref.txt
+
+ echo "$0 --> Normalizing HYP text ..."
+ ./utils/textnorm_zh.py \
+ --has_key --to_upper \
+ ${output_dir}/1best_recog/text.proc \
+ ${output_dir}/1best_recog/rec.txt
+ grep -v $'\t$' ${output_dir}/1best_recog/rec.txt > ${output_dir}/1best_recog/rec_non_empty.txt
+
+ echo "$0 --> computing WER/CER and alignment ..."
+ ./utils/error_rate_zh \
+ --tokenizer char \
+ --ref ${output_dir}/1best_recog/ref.txt \
+ --hyp ${output_dir}/1best_recog/rec_non_empty.txt \
+ ${output_dir}/1best_recog/DETAILS.txt | tee ${output_dir}/1best_recog/RESULTS.txt
+ rm -rf ${output_dir}/1best_recog/rec.txt ${output_dir}/1best_recog/rec_non_empty.txt
+fi
+
diff --git a/egs_modelscope/asr/uniasr/speech_UniASR_asr_2pass-minnan-16k-common-vocab3825/utils b/egs_modelscope/asr/uniasr/speech_UniASR_asr_2pass-minnan-16k-common-vocab3825/utils
new file mode 120000
index 000000000..2ac163ff4
--- /dev/null
+++ b/egs_modelscope/asr/uniasr/speech_UniASR_asr_2pass-minnan-16k-common-vocab3825/utils
@@ -0,0 +1 @@
+../../../../egs/aishell/transformer/utils
\ No newline at end of file
diff --git a/funasr/bin/asr_inference_paraformer_streaming.py b/funasr/bin/asr_inference_paraformer_streaming.py
index 821f69429..ff8bb8c77 100644
--- a/funasr/bin/asr_inference_paraformer_streaming.py
+++ b/funasr/bin/asr_inference_paraformer_streaming.py
@@ -8,6 +8,7 @@ import os
import codecs
import tempfile
import requests
+import yaml
from pathlib import Path
from typing import Optional
from typing import Sequence
@@ -19,7 +20,6 @@ from typing import List
import numpy as np
import torch
-import torchaudio
from typeguard import check_argument_types
from funasr.fileio.datadir_writer import DatadirWriter
@@ -40,11 +40,12 @@ from funasr.utils.types import str2bool
from funasr.utils.types import str2triple_str
from funasr.utils.types import str_or_none
from funasr.utils import asr_utils, wav_utils, postprocess_utils
-from funasr.models.frontend.wav_frontend import WavFrontend
-from funasr.models.e2e_asr_paraformer import BiCifParaformer, ContextualParaformer
+from funasr.models.frontend.wav_frontend import WavFrontend, WavFrontendOnline
from funasr.export.models.e2e_asr_paraformer import Paraformer as Paraformer_export
+
np.set_printoptions(threshold=np.inf)
+
class Speech2Text:
"""Speech2Text class
@@ -89,7 +90,7 @@ class Speech2Text:
)
frontend = None
if asr_train_args.frontend is not None and asr_train_args.frontend_conf is not None:
- frontend = WavFrontend(cmvn_file=cmvn_file, **asr_train_args.frontend_conf)
+ frontend = WavFrontendOnline(cmvn_file=cmvn_file, **asr_train_args.frontend_conf)
logging.info("asr_model: {}".format(asr_model))
logging.info("asr_train_args: {}".format(asr_train_args))
@@ -189,8 +190,7 @@ class Speech2Text:
@torch.no_grad()
def __call__(
- self, cache: dict, speech: Union[torch.Tensor, np.ndarray], speech_lengths: Union[torch.Tensor, np.ndarray] = None,
- begin_time: int = 0, end_time: int = None,
+ self, cache: dict, speech: Union[torch.Tensor], speech_lengths: Union[torch.Tensor] = None
):
"""Inference
@@ -201,38 +201,59 @@ class Speech2Text:
"""
assert check_argument_types()
-
- # Input as audio signal
- if isinstance(speech, np.ndarray):
- speech = torch.tensor(speech)
- if self.frontend is not None:
- feats, feats_len = self.frontend.forward(speech, speech_lengths)
- feats = to_device(feats, device=self.device)
- feats_len = feats_len.int()
- self.asr_model.frontend = None
+ results = []
+ cache_en = cache["encoder"]
+ if speech.shape[1] < 16 * 60 and cache_en["is_final"]:
+ cache_en["tail_chunk"] = True
+ feats = cache_en["feats"]
+ feats_len = torch.tensor([feats.shape[1]])
+ results = self.infer(feats, feats_len, cache)
+ return results
else:
- feats = speech
- feats_len = speech_lengths
- lfr_factor = max(1, (feats.size()[-1] // 80) - 1)
- feats_len = cache["encoder"]["stride"] + cache["encoder"]["pad_left"] + cache["encoder"]["pad_right"]
- feats = feats[:,cache["encoder"]["start_idx"]:cache["encoder"]["start_idx"]+feats_len,:]
- feats_len = torch.tensor([feats_len])
- batch = {"speech": feats, "speech_lengths": feats_len, "cache": cache}
+ if self.frontend is not None:
+ feats, feats_len = self.frontend.forward(speech, speech_lengths, cache_en["is_final"])
+ feats = to_device(feats, device=self.device)
+ feats_len = feats_len.int()
+ self.asr_model.frontend = None
+ else:
+ feats = speech
+ feats_len = speech_lengths
- # a. To device
+ if feats.shape[1] != 0:
+ if cache_en["is_final"]:
+ if feats.shape[1] + cache_en["chunk_size"][2] < cache_en["chunk_size"][1]:
+ cache_en["last_chunk"] = True
+ else:
+ # first chunk
+ feats_chunk1 = feats[:, :cache_en["chunk_size"][1], :]
+ feats_len = torch.tensor([feats_chunk1.shape[1]])
+ results_chunk1 = self.infer(feats_chunk1, feats_len, cache)
+
+ # last chunk
+ cache_en["last_chunk"] = True
+ feats_chunk2 = feats[:, -(feats.shape[1] + cache_en["chunk_size"][2] - cache_en["chunk_size"][1]):, :]
+ feats_len = torch.tensor([feats_chunk2.shape[1]])
+ results_chunk2 = self.infer(feats_chunk2, feats_len, cache)
+
+ return ["".join(results_chunk1 + results_chunk2)]
+
+ results = self.infer(feats, feats_len, cache)
+
+ return results
+
+ @torch.no_grad()
+ def infer(self, feats: Union[torch.Tensor], feats_len: Union[torch.Tensor], cache: List = None):
+ batch = {"speech": feats, "speech_lengths": feats_len}
batch = to_device(batch, device=self.device)
-
# b. Forward Encoder
- enc, enc_len = self.asr_model.encode_chunk(feats, feats_len, cache)
+ enc, enc_len = self.asr_model.encode_chunk(feats, feats_len, cache=cache)
if isinstance(enc, tuple):
enc = enc[0]
# assert len(enc) == 1, len(enc)
enc_len_batch_total = torch.sum(enc_len).item() * self.encoder_downsampling_factor
predictor_outs = self.asr_model.calc_predictor_chunk(enc, cache)
- pre_acoustic_embeds, pre_token_length, alphas, pre_peak_index = predictor_outs[0], predictor_outs[1], \
- predictor_outs[2], predictor_outs[3]
- pre_token_length = pre_token_length.floor().long()
+ pre_acoustic_embeds, pre_token_length= predictor_outs[0], predictor_outs[1]
if torch.max(pre_token_length) < 1:
return []
decoder_outs = self.asr_model.cal_decoder_with_predictor_chunk(enc, pre_acoustic_embeds, cache)
@@ -279,166 +300,12 @@ class Speech2Text:
text = self.tokenizer.tokens2text(token)
else:
text = None
-
- results.append((text, token, token_int, hyp, enc_len_batch_total, lfr_factor))
+ results.append(text)
# assert check_return_type(results)
return results
-class Speech2TextExport:
- """Speech2TextExport class
-
- """
-
- def __init__(
- self,
- asr_train_config: Union[Path, str] = None,
- asr_model_file: Union[Path, str] = None,
- cmvn_file: Union[Path, str] = None,
- lm_train_config: Union[Path, str] = None,
- lm_file: Union[Path, str] = None,
- token_type: str = None,
- bpemodel: str = None,
- device: str = "cpu",
- maxlenratio: float = 0.0,
- minlenratio: float = 0.0,
- dtype: str = "float32",
- beam_size: int = 20,
- ctc_weight: float = 0.5,
- lm_weight: float = 1.0,
- ngram_weight: float = 0.9,
- penalty: float = 0.0,
- nbest: int = 1,
- frontend_conf: dict = None,
- hotword_list_or_file: str = None,
- **kwargs,
- ):
-
- # 1. Build ASR model
- asr_model, asr_train_args = ASRTask.build_model_from_file(
- asr_train_config, asr_model_file, cmvn_file, device
- )
- frontend = None
- if asr_train_args.frontend is not None and asr_train_args.frontend_conf is not None:
- frontend = WavFrontend(cmvn_file=cmvn_file, **asr_train_args.frontend_conf)
-
- logging.info("asr_model: {}".format(asr_model))
- logging.info("asr_train_args: {}".format(asr_train_args))
- asr_model.to(dtype=getattr(torch, dtype)).eval()
-
- token_list = asr_model.token_list
-
- logging.info(f"Decoding device={device}, dtype={dtype}")
-
- # 5. [Optional] Build Text converter: e.g. bpe-sym -> Text
- if token_type is None:
- token_type = asr_train_args.token_type
- if bpemodel is None:
- bpemodel = asr_train_args.bpemodel
-
- if token_type is None:
- tokenizer = None
- elif token_type == "bpe":
- if bpemodel is not None:
- tokenizer = build_tokenizer(token_type=token_type, bpemodel=bpemodel)
- else:
- tokenizer = None
- else:
- tokenizer = build_tokenizer(token_type=token_type)
- converter = TokenIDConverter(token_list=token_list)
- logging.info(f"Text tokenizer: {tokenizer}")
-
- # self.asr_model = asr_model
- self.asr_train_args = asr_train_args
- self.converter = converter
- self.tokenizer = tokenizer
-
- self.device = device
- self.dtype = dtype
- self.nbest = nbest
- self.frontend = frontend
-
- model = Paraformer_export(asr_model, onnx=False)
- self.asr_model = model
-
- @torch.no_grad()
- def __call__(
- self, speech: Union[torch.Tensor, np.ndarray], speech_lengths: Union[torch.Tensor, np.ndarray] = None
- ):
- """Inference
-
- Args:
- speech: Input speech data
- Returns:
- text, token, token_int, hyp
-
- """
- assert check_argument_types()
-
- # Input as audio signal
- if isinstance(speech, np.ndarray):
- speech = torch.tensor(speech)
-
- if self.frontend is not None:
- feats, feats_len = self.frontend.forward(speech, speech_lengths)
- feats = to_device(feats, device=self.device)
- feats_len = feats_len.int()
- self.asr_model.frontend = None
- else:
- feats = speech
- feats_len = speech_lengths
-
- enc_len_batch_total = feats_len.sum()
- lfr_factor = max(1, (feats.size()[-1] // 80) - 1)
- batch = {"speech": feats, "speech_lengths": feats_len}
-
- # a. To device
- batch = to_device(batch, device=self.device)
-
- decoder_outs = self.asr_model(**batch)
- decoder_out, ys_pad_lens = decoder_outs[0], decoder_outs[1]
-
- results = []
- b, n, d = decoder_out.size()
- for i in range(b):
- am_scores = decoder_out[i, :ys_pad_lens[i], :]
-
- yseq = am_scores.argmax(dim=-1)
- score = am_scores.max(dim=-1)[0]
- score = torch.sum(score, dim=-1)
- # pad with mask tokens to ensure compatibility with sos/eos tokens
- yseq = torch.tensor(
- yseq.tolist(), device=yseq.device
- )
- nbest_hyps = [Hypothesis(yseq=yseq, score=score)]
-
- for hyp in nbest_hyps:
- assert isinstance(hyp, (Hypothesis)), type(hyp)
-
- # remove sos/eos and get results
- last_pos = -1
- if isinstance(hyp.yseq, list):
- token_int = hyp.yseq[1:last_pos]
- else:
- token_int = hyp.yseq[1:last_pos].tolist()
-
- # remove blank symbol id, which is assumed to be 0
- token_int = list(filter(lambda x: x != 0 and x != 2, token_int))
-
- # Change integer-ids to tokens
- token = self.converter.ids2tokens(token_int)
-
- if self.tokenizer is not None:
- text = self.tokenizer.tokens2text(token)
- else:
- text = None
-
- results.append((text, token, token_int, hyp, enc_len_batch_total, lfr_factor))
-
- return results
-
-
def inference(
maxlenratio: float,
minlenratio: float,
@@ -536,8 +403,6 @@ def inference_modelscope(
**kwargs,
):
assert check_argument_types()
- ncpu = kwargs.get("ncpu", 1)
- torch.set_num_threads(ncpu)
if word_lm_train_config is not None:
raise NotImplementedError("Word LM is not implemented")
@@ -580,11 +445,9 @@ def inference_modelscope(
penalty=penalty,
nbest=nbest,
)
- if export_mode:
- speech2text = Speech2TextExport(**speech2text_kwargs)
- else:
- speech2text = Speech2Text(**speech2text_kwargs)
-
+
+ speech2text = Speech2Text(**speech2text_kwargs)
+
def _load_bytes(input):
middle_data = np.frombuffer(input, dtype=np.int16)
middle_data = np.asarray(middle_data)
@@ -599,7 +462,46 @@ def inference_modelscope(
offset = i.min + abs_max
array = np.frombuffer((middle_data.astype(dtype) - offset) / abs_max, dtype=np.float32)
return array
-
+
+ def _read_yaml(yaml_path: Union[str, Path]) -> Dict:
+ if not Path(yaml_path).exists():
+ raise FileExistsError(f'The {yaml_path} does not exist.')
+
+ with open(str(yaml_path), 'rb') as f:
+ data = yaml.load(f, Loader=yaml.Loader)
+ return data
+
+ def _prepare_cache(cache: dict = {}, chunk_size=[5,10,5], batch_size=1):
+ if len(cache) > 0:
+ return cache
+ config = _read_yaml(asr_train_config)
+ enc_output_size = config["encoder_conf"]["output_size"]
+ feats_dims = config["frontend_conf"]["n_mels"] * config["frontend_conf"]["lfr_m"]
+ cache_en = {"start_idx": 0, "cif_hidden": torch.zeros((batch_size, 1, enc_output_size)),
+ "cif_alphas": torch.zeros((batch_size, 1)), "chunk_size": chunk_size, "last_chunk": False,
+ "feats": torch.zeros((batch_size, chunk_size[0] + chunk_size[2], feats_dims)), "tail_chunk": False}
+ cache["encoder"] = cache_en
+
+ cache_de = {"decode_fsmn": None}
+ cache["decoder"] = cache_de
+
+ return cache
+
+ def _cache_reset(cache: dict = {}, chunk_size=[5,10,5], batch_size=1):
+ if len(cache) > 0:
+ config = _read_yaml(asr_train_config)
+ enc_output_size = config["encoder_conf"]["output_size"]
+ feats_dims = config["frontend_conf"]["n_mels"] * config["frontend_conf"]["lfr_m"]
+ cache_en = {"start_idx": 0, "cif_hidden": torch.zeros((batch_size, 1, enc_output_size)),
+ "cif_alphas": torch.zeros((batch_size, 1)), "chunk_size": chunk_size, "last_chunk": False,
+ "feats": torch.zeros((batch_size, chunk_size[0] + chunk_size[2], feats_dims)), "tail_chunk": False}
+ cache["encoder"] = cache_en
+
+ cache_de = {"decode_fsmn": None}
+ cache["decoder"] = cache_de
+
+ return cache
+
def _forward(
data_path_and_name_and_type,
raw_inputs: Union[np.ndarray, torch.Tensor] = None,
@@ -610,123 +512,35 @@ def inference_modelscope(
):
# 3. Build data-iterator
+ if data_path_and_name_and_type is not None and data_path_and_name_and_type[2] == "bytes":
+ raw_inputs = _load_bytes(data_path_and_name_and_type[0])
+ raw_inputs = torch.tensor(raw_inputs)
+ if data_path_and_name_and_type is None and raw_inputs is not None:
+ if isinstance(raw_inputs, np.ndarray):
+ raw_inputs = torch.tensor(raw_inputs)
is_final = False
cache = {}
+ chunk_size = [5, 10, 5]
if param_dict is not None and "cache" in param_dict:
cache = param_dict["cache"]
if param_dict is not None and "is_final" in param_dict:
is_final = param_dict["is_final"]
+ if param_dict is not None and "chunk_size" in param_dict:
+ chunk_size = param_dict["chunk_size"]
- if data_path_and_name_and_type is not None and data_path_and_name_and_type[2] == "bytes":
- raw_inputs = _load_bytes(data_path_and_name_and_type[0])
- raw_inputs = torch.tensor(raw_inputs)
- if data_path_and_name_and_type is not None and data_path_and_name_and_type[2] == "sound":
- raw_inputs = torchaudio.load(data_path_and_name_and_type[0])[0][0]
- is_final = True
- if data_path_and_name_and_type is None and raw_inputs is not None:
- if isinstance(raw_inputs, np.ndarray):
- raw_inputs = torch.tensor(raw_inputs)
# 7 .Start for-loop
# FIXME(kamo): The output format should be discussed about
+ raw_inputs = torch.unsqueeze(raw_inputs, axis=0)
+ input_lens = torch.tensor([raw_inputs.shape[1]])
asr_result_list = []
- results = []
- asr_result = ""
- wait = True
- if len(cache) == 0:
- cache["encoder"] = {"start_idx": 0, "pad_left": 0, "stride": 10, "pad_right": 5, "cif_hidden": None, "cif_alphas": None, "is_final": is_final, "left": 0, "right": 0}
- cache_de = {"decode_fsmn": None}
- cache["decoder"] = cache_de
- cache["first_chunk"] = True
- cache["speech"] = []
- cache["accum_speech"] = 0
- if raw_inputs is not None:
- if len(cache["speech"]) == 0:
- cache["speech"] = raw_inputs
- else:
- cache["speech"] = torch.cat([cache["speech"], raw_inputs], dim=0)
- cache["accum_speech"] += len(raw_inputs)
- while cache["accum_speech"] >= 960:
- if cache["first_chunk"]:
- if cache["accum_speech"] >= 14400:
- speech = torch.unsqueeze(cache["speech"], axis=0)
- speech_length = torch.tensor([len(cache["speech"])])
- cache["encoder"]["pad_left"] = 5
- cache["encoder"]["pad_right"] = 5
- cache["encoder"]["stride"] = 10
- cache["encoder"]["left"] = 5
- cache["encoder"]["right"] = 0
- results = speech2text(cache, speech, speech_length)
- cache["accum_speech"] -= 4800
- cache["first_chunk"] = False
- cache["encoder"]["start_idx"] = -5
- cache["encoder"]["is_final"] = False
- wait = False
- else:
- if is_final:
- cache["encoder"]["stride"] = len(cache["speech"]) // 960
- cache["encoder"]["pad_left"] = 0
- cache["encoder"]["pad_right"] = 0
- speech = torch.unsqueeze(cache["speech"], axis=0)
- speech_length = torch.tensor([len(cache["speech"])])
- results = speech2text(cache, speech, speech_length)
- cache["accum_speech"] = 0
- wait = False
- else:
- break
- else:
- if cache["accum_speech"] >= 19200:
- cache["encoder"]["start_idx"] += 10
- cache["encoder"]["stride"] = 10
- cache["encoder"]["pad_left"] = 5
- cache["encoder"]["pad_right"] = 5
- cache["encoder"]["left"] = 0
- cache["encoder"]["right"] = 0
- speech = torch.unsqueeze(cache["speech"], axis=0)
- speech_length = torch.tensor([len(cache["speech"])])
- results = speech2text(cache, speech, speech_length)
- cache["accum_speech"] -= 9600
- wait = False
- else:
- if is_final:
- cache["encoder"]["is_final"] = True
- if cache["accum_speech"] >= 14400:
- cache["encoder"]["start_idx"] += 10
- cache["encoder"]["stride"] = 10
- cache["encoder"]["pad_left"] = 5
- cache["encoder"]["pad_right"] = 5
- cache["encoder"]["left"] = 0
- cache["encoder"]["right"] = cache["accum_speech"] // 960 - 15
- speech = torch.unsqueeze(cache["speech"], axis=0)
- speech_length = torch.tensor([len(cache["speech"])])
- results = speech2text(cache, speech, speech_length)
- cache["accum_speech"] -= 9600
- wait = False
- else:
- cache["encoder"]["start_idx"] += 10
- cache["encoder"]["stride"] = cache["accum_speech"] // 960 - 5
- cache["encoder"]["pad_left"] = 5
- cache["encoder"]["pad_right"] = 0
- cache["encoder"]["left"] = 0
- cache["encoder"]["right"] = 0
- speech = torch.unsqueeze(cache["speech"], axis=0)
- speech_length = torch.tensor([len(cache["speech"])])
- results = speech2text(cache, speech, speech_length)
- cache["accum_speech"] = 0
- wait = False
- else:
- break
-
- if len(results) >= 1:
- asr_result += results[0][0]
- if asr_result == "":
- asr_result = "sil"
- if wait:
- asr_result = "waiting_for_more_voice"
- item = {'key': "utt", 'value': asr_result}
- asr_result_list.append(item)
- else:
- return []
+ cache = _prepare_cache(cache, chunk_size=chunk_size, batch_size=1)
+ cache["encoder"]["is_final"] = is_final
+ asr_result = speech2text(cache, raw_inputs, input_lens)
+ item = {'key': "utt", 'value': asr_result}
+ asr_result_list.append(item)
+ if is_final:
+ cache = _cache_reset(cache, chunk_size=chunk_size, batch_size=1)
return asr_result_list
return _forward
@@ -920,5 +734,3 @@ if __name__ == "__main__":
#
# rec_result = inference_16k_pipline(audio_in='https://isv-data.oss-cn-hangzhou.aliyuncs.com/ics/MaaS/ASR/test_audio/asr_example_zh.wav')
# print(rec_result)
-
-
diff --git a/funasr/datasets/large_datasets/utils/tokenize.py b/funasr/datasets/large_datasets/utils/tokenize.py
index 022d32131..0d2fd84ee 100644
--- a/funasr/datasets/large_datasets/utils/tokenize.py
+++ b/funasr/datasets/large_datasets/utils/tokenize.py
@@ -17,13 +17,21 @@ def forward_segment(text, seg_dict):
return word_list
def seg_tokenize(txt, seg_dict):
+ pattern = re.compile(r'^[\u4E00-\u9FA50-9]+$')
out_txt = ""
for word in txt:
word = word.lower()
if word in seg_dict:
out_txt += seg_dict[word] + " "
else:
- out_txt += "" + " "
+ if pattern.match(word):
+ for char in word:
+ if char in seg_dict:
+ out_txt += seg_dict[char] + " "
+ else:
+ out_txt += "" + " "
+ else:
+ out_txt += "" + " "
return out_txt.strip().split()
def tokenize(data,
diff --git a/funasr/datasets/preprocessor.py b/funasr/datasets/preprocessor.py
index 20a38314a..758c75045 100644
--- a/funasr/datasets/preprocessor.py
+++ b/funasr/datasets/preprocessor.py
@@ -44,15 +44,22 @@ def forward_segment(text, dic):
i += len(longest_word)
return word_list
-
def seg_tokenize(txt, seg_dict):
+ pattern = re.compile(r'^[\u4E00-\u9FA50-9]+$')
out_txt = ""
for word in txt:
word = word.lower()
if word in seg_dict:
out_txt += seg_dict[word] + " "
else:
- out_txt += "" + " "
+ if pattern.match(word):
+ for char in word:
+ if char in seg_dict:
+ out_txt += seg_dict[char] + " "
+ else:
+ out_txt += "" + " "
+ else:
+ out_txt += "" + " "
return out_txt.strip().split()
def seg_tokenize_wo_pattern(txt, seg_dict):
diff --git a/funasr/models/e2e_asr_paraformer.py b/funasr/models/e2e_asr_paraformer.py
index 699d85fdb..d02783f49 100644
--- a/funasr/models/e2e_asr_paraformer.py
+++ b/funasr/models/e2e_asr_paraformer.py
@@ -712,9 +712,9 @@ class ParaformerOnline(Paraformer):
def calc_predictor_chunk(self, encoder_out, cache=None):
- pre_acoustic_embeds, pre_token_length, alphas, pre_peak_index = \
+ pre_acoustic_embeds, pre_token_length = \
self.predictor.forward_chunk(encoder_out, cache["encoder"])
- return pre_acoustic_embeds, pre_token_length, alphas, pre_peak_index
+ return pre_acoustic_embeds, pre_token_length
def cal_decoder_with_predictor_chunk(self, encoder_out, sematic_embeds, cache=None):
decoder_outs = self.decoder.forward_chunk(
diff --git a/funasr/models/e2e_asr_transducer.py b/funasr/models/e2e_asr_transducer.py
index 657dd7554..f8ba0f0c6 100644
--- a/funasr/models/e2e_asr_transducer.py
+++ b/funasr/models/e2e_asr_transducer.py
@@ -386,7 +386,7 @@ class TransducerModel(AbsESPnetModel):
if not self.training and (self.report_cer or self.report_wer):
if self.error_calculator is None:
- from espnet2.asr_transducer.error_calculator import ErrorCalculator
+ from funasr.modules.e2e_asr_common import ErrorCalculatorTransducer as ErrorCalculator
self.error_calculator = ErrorCalculator(
self.decoder,
@@ -398,7 +398,7 @@ class TransducerModel(AbsESPnetModel):
report_wer=self.report_wer,
)
- cer_transducer, wer_transducer = self.error_calculator(encoder_out, target)
+ cer_transducer, wer_transducer = self.error_calculator(encoder_out, target, t_len)
return loss_transducer, cer_transducer, wer_transducer
@@ -889,6 +889,8 @@ class UnifiedTransducerModel(AbsESPnetModel):
if not self.training and (self.report_cer or self.report_wer):
if self.error_calculator is None:
+ from funasr.modules.e2e_asr_common import ErrorCalculatorTransducer as ErrorCalculator
+
self.error_calculator = ErrorCalculator(
self.decoder,
self.joint_network,
@@ -899,7 +901,7 @@ class UnifiedTransducerModel(AbsESPnetModel):
report_wer=self.report_wer,
)
- cer_transducer, wer_transducer = self.error_calculator(encoder_out, target)
+ cer_transducer, wer_transducer = self.error_calculator(encoder_out, target, t_len)
return loss_transducer, cer_transducer, wer_transducer
return loss_transducer, None, None
diff --git a/funasr/models/encoder/sanm_encoder.py b/funasr/models/encoder/sanm_encoder.py
index f2502bbb6..969ddadf2 100644
--- a/funasr/models/encoder/sanm_encoder.py
+++ b/funasr/models/encoder/sanm_encoder.py
@@ -6,9 +6,11 @@ from typing import Union
import logging
import torch
import torch.nn as nn
+import torch.nn.functional as F
from funasr.modules.streaming_utils.chunk_utilis import overlap_chunk
from typeguard import check_argument_types
import numpy as np
+from funasr.torch_utils.device_funcs import to_device
from funasr.modules.nets_utils import make_pad_mask
from funasr.modules.attention import MultiHeadedAttention, MultiHeadedAttentionSANM, MultiHeadedAttentionSANMwithMask
from funasr.modules.embedding import SinusoidalPositionEncoder, StreamSinusoidalPositionEncoder
@@ -349,6 +351,23 @@ class SANMEncoder(AbsEncoder):
return (xs_pad, intermediate_outs), olens, None
return xs_pad, olens, None
+ def _add_overlap_chunk(self, feats: np.ndarray, cache: dict = {}):
+ if len(cache) == 0:
+ return feats
+ # process last chunk
+ cache["feats"] = to_device(cache["feats"], device=feats.device)
+ overlap_feats = torch.cat((cache["feats"], feats), dim=1)
+ if cache["is_final"]:
+ cache["feats"] = overlap_feats[:, -cache["chunk_size"][0]:, :]
+ if not cache["last_chunk"]:
+ padding_length = sum(cache["chunk_size"]) - overlap_feats.shape[1]
+ overlap_feats = overlap_feats.transpose(1, 2)
+ overlap_feats = F.pad(overlap_feats, (0, padding_length))
+ overlap_feats = overlap_feats.transpose(1, 2)
+ else:
+ cache["feats"] = overlap_feats[:, -(cache["chunk_size"][0] + cache["chunk_size"][2]):, :]
+ return overlap_feats
+
def forward_chunk(self,
xs_pad: torch.Tensor,
ilens: torch.Tensor,
@@ -360,7 +379,10 @@ class SANMEncoder(AbsEncoder):
xs_pad = xs_pad
else:
xs_pad = self.embed(xs_pad, cache)
-
+ if cache["tail_chunk"]:
+ xs_pad = cache["feats"]
+ else:
+ xs_pad = self._add_overlap_chunk(xs_pad, cache)
encoder_outs = self.encoders0(xs_pad, None, None, None, None)
xs_pad, masks = encoder_outs[0], encoder_outs[1]
intermediate_outs = []
diff --git a/funasr/models/predictor/cif.py b/funasr/models/predictor/cif.py
index a5273f841..c59e24502 100644
--- a/funasr/models/predictor/cif.py
+++ b/funasr/models/predictor/cif.py
@@ -2,6 +2,7 @@ import torch
from torch import nn
import logging
import numpy as np
+from funasr.torch_utils.device_funcs import to_device
from funasr.modules.nets_utils import make_pad_mask
from funasr.modules.streaming_utils.utils import sequence_mask
@@ -200,7 +201,7 @@ class CifPredictorV2(nn.Module):
return acoustic_embeds, token_num, alphas, cif_peak
def forward_chunk(self, hidden, cache=None):
- b, t, d = hidden.size()
+ batch_size, len_time, hidden_size = hidden.shape
h = hidden
context = h.transpose(1, 2)
queries = self.pad(context)
@@ -211,58 +212,81 @@ class CifPredictorV2(nn.Module):
alphas = torch.nn.functional.relu(alphas * self.smooth_factor - self.noise_threshold)
alphas = alphas.squeeze(-1)
- mask_chunk_predictor = None
- if cache is not None:
- mask_chunk_predictor = None
- mask_chunk_predictor = torch.zeros_like(alphas)
- mask_chunk_predictor[:, cache["pad_left"]:cache["stride"] + cache["pad_left"]] = 1.0
-
- if mask_chunk_predictor is not None:
- alphas = alphas * mask_chunk_predictor
-
- if cache is not None:
- if cache["is_final"]:
- alphas[:, cache["stride"] + cache["pad_left"] - 1] += 0.45
- if cache["cif_hidden"] is not None:
- hidden = torch.cat((cache["cif_hidden"], hidden), 1)
- if cache["cif_alphas"] is not None:
- alphas = torch.cat((cache["cif_alphas"], alphas), -1)
- token_num = alphas.sum(-1)
- acoustic_embeds, cif_peak = cif(hidden, alphas, self.threshold)
- len_time = alphas.size(-1)
- last_fire_place = len_time - 1
- last_fire_remainds = 0.0
- pre_alphas_length = 0
- last_fire = False
-
- mask_chunk_peak_predictor = None
- if cache is not None:
- mask_chunk_peak_predictor = None
- mask_chunk_peak_predictor = torch.zeros_like(cif_peak)
- if cache["cif_alphas"] is not None:
- pre_alphas_length = cache["cif_alphas"].size(-1)
- mask_chunk_peak_predictor[:, :pre_alphas_length] = 1.0
- mask_chunk_peak_predictor[:, pre_alphas_length + cache["pad_left"]:pre_alphas_length + cache["stride"] + cache["pad_left"]] = 1.0
-
- if mask_chunk_peak_predictor is not None:
- cif_peak = cif_peak * mask_chunk_peak_predictor.squeeze(-1)
-
- for i in range(len_time):
- if cif_peak[0][len_time - 1 - i] > self.threshold or cif_peak[0][len_time - 1 - i] == self.threshold:
- last_fire_place = len_time - 1 - i
- last_fire_remainds = cif_peak[0][len_time - 1 - i] - self.threshold
- last_fire = True
- break
- if last_fire:
- last_fire_remainds = torch.tensor([last_fire_remainds], dtype=alphas.dtype).to(alphas.device)
- cache["cif_hidden"] = hidden[:, last_fire_place:, :]
- cache["cif_alphas"] = torch.cat((last_fire_remainds.unsqueeze(0), alphas[:, last_fire_place+1:]), -1)
- else:
- cache["cif_hidden"] = hidden
- cache["cif_alphas"] = alphas
- token_num_int = token_num.floor().type(torch.int32).item()
- return acoustic_embeds[:, 0:token_num_int, :], token_num, alphas, cif_peak
+ token_length = []
+ list_fires = []
+ list_frames = []
+ cache_alphas = []
+ cache_hiddens = []
+
+ if cache is not None and "chunk_size" in cache:
+ alphas[:, :cache["chunk_size"][0]] = 0.0
+ alphas[:, sum(cache["chunk_size"][:2]):] = 0.0
+ if cache is not None and "cif_alphas" in cache and "cif_hidden" in cache:
+ cache["cif_hidden"] = to_device(cache["cif_hidden"], device=hidden.device)
+ cache["cif_alphas"] = to_device(cache["cif_alphas"], device=alphas.device)
+ hidden = torch.cat((cache["cif_hidden"], hidden), dim=1)
+ alphas = torch.cat((cache["cif_alphas"], alphas), dim=1)
+ if cache is not None and "last_chunk" in cache and cache["last_chunk"]:
+ tail_hidden = torch.zeros((batch_size, 1, hidden_size), device=hidden.device)
+ tail_alphas = torch.tensor([[self.tail_threshold]], device=alphas.device)
+ tail_alphas = torch.tile(tail_alphas, (batch_size, 1))
+ hidden = torch.cat((hidden, tail_hidden), dim=1)
+ alphas = torch.cat((alphas, tail_alphas), dim=1)
+
+ len_time = alphas.shape[1]
+ for b in range(batch_size):
+ integrate = 0.0
+ frames = torch.zeros((hidden_size), device=hidden.device)
+ list_frame = []
+ list_fire = []
+ for t in range(len_time):
+ alpha = alphas[b][t]
+ if alpha + integrate < self.threshold:
+ integrate += alpha
+ list_fire.append(integrate)
+ frames += alpha * hidden[b][t]
+ else:
+ frames += (self.threshold - integrate) * hidden[b][t]
+ list_frame.append(frames)
+ integrate += alpha
+ list_fire.append(integrate)
+ integrate -= self.threshold
+ frames = integrate * hidden[b][t]
+
+ cache_alphas.append(integrate)
+ if integrate > 0.0:
+ cache_hiddens.append(frames / integrate)
+ else:
+ cache_hiddens.append(frames)
+
+ token_length.append(torch.tensor(len(list_frame), device=alphas.device))
+ list_fires.append(list_fire)
+ list_frames.append(list_frame)
+
+ cache["cif_alphas"] = torch.stack(cache_alphas, axis=0)
+ cache["cif_alphas"] = torch.unsqueeze(cache["cif_alphas"], axis=0)
+ cache["cif_hidden"] = torch.stack(cache_hiddens, axis=0)
+ cache["cif_hidden"] = torch.unsqueeze(cache["cif_hidden"], axis=0)
+
+ max_token_len = max(token_length)
+ if max_token_len == 0:
+ return hidden, torch.stack(token_length, 0)
+ list_ls = []
+ for b in range(batch_size):
+ pad_frames = torch.zeros((max_token_len - token_length[b], hidden_size), device=alphas.device)
+ if token_length[b] == 0:
+ list_ls.append(pad_frames)
+ else:
+ list_frames[b] = torch.stack(list_frames[b])
+ list_ls.append(torch.cat((list_frames[b], pad_frames), dim=0))
+
+ cache["cif_alphas"] = torch.stack(cache_alphas, axis=0)
+ cache["cif_alphas"] = torch.unsqueeze(cache["cif_alphas"], axis=0)
+ cache["cif_hidden"] = torch.stack(cache_hiddens, axis=0)
+ cache["cif_hidden"] = torch.unsqueeze(cache["cif_hidden"], axis=0)
+ return torch.stack(list_ls, 0), torch.stack(token_length, 0)
+
def tail_process_fn(self, hidden, alphas, token_num=None, mask=None):
b, t, d = hidden.size()
diff --git a/funasr/modules/e2e_asr_common.py b/funasr/modules/e2e_asr_common.py
index f430fcb43..98006f948 100644
--- a/funasr/modules/e2e_asr_common.py
+++ b/funasr/modules/e2e_asr_common.py
@@ -296,12 +296,13 @@ class ErrorCalculatorTransducer:
self.report_wer = report_wer
def __call__(
- self, encoder_out: torch.Tensor, target: torch.Tensor
+ self, encoder_out: torch.Tensor, target: torch.Tensor, encoder_out_lens: torch.Tensor,
) -> Tuple[Optional[float], Optional[float]]:
"""Calculate sentence-level WER or/and CER score for Transducer model.
Args:
encoder_out: Encoder output sequences. (B, T, D_enc)
target: Target label ID sequences. (B, L)
+ encoder_out_lens: Encoder output sequences length. (B,)
Returns:
: Sentence-level CER score.
: Sentence-level WER score.
@@ -312,7 +313,10 @@ class ErrorCalculatorTransducer:
encoder_out = encoder_out.to(next(self.decoder.parameters()).device)
- batch_nbest = [self.beam_search(encoder_out[b]) for b in range(batchsize)]
+ batch_nbest = [
+ self.beam_search(encoder_out[b][: encoder_out_lens[b]])
+ for b in range(batchsize)
+ ]
pred = [nbest_hyp[0].yseq[1:] for nbest_hyp in batch_nbest]
char_pred, char_target = self.convert_to_char(pred, target)
diff --git a/funasr/modules/embedding.py b/funasr/modules/embedding.py
index c347e24f1..aaac80a7d 100644
--- a/funasr/modules/embedding.py
+++ b/funasr/modules/embedding.py
@@ -425,21 +425,14 @@ class StreamSinusoidalPositionEncoder(torch.nn.Module):
return encoding.type(dtype)
def forward(self, x, cache=None):
- start_idx = 0
- pad_left = 0
- pad_right = 0
batch_size, timesteps, input_dim = x.size()
+ start_idx = 0
if cache is not None:
start_idx = cache["start_idx"]
- pad_left = cache["left"]
- pad_right = cache["right"]
+ cache["start_idx"] += timesteps
positions = torch.arange(1, timesteps+start_idx+1)[None, :]
position_encoding = self.encode(positions, input_dim, x.dtype).to(x.device)
- outputs = x + position_encoding[:, start_idx: start_idx + timesteps]
- outputs = outputs.transpose(1, 2)
- outputs = F.pad(outputs, (pad_left, pad_right))
- outputs = outputs.transpose(1, 2)
- return outputs
+ return x + position_encoding[:, start_idx: start_idx + timesteps]
class StreamingRelPositionalEncoding(torch.nn.Module):
"""Relative positional encoding.
diff --git a/funasr/runtime/onnxruntime/CMakeLists.txt b/funasr/runtime/onnxruntime/CMakeLists.txt
index 9879c4aa6..25b816f98 100644
--- a/funasr/runtime/onnxruntime/CMakeLists.txt
+++ b/funasr/runtime/onnxruntime/CMakeLists.txt
@@ -1,6 +1,8 @@
-cmake_minimum_required(VERSION 3.10)
+cmake_minimum_required(VERSION 3.16)
-project(FunASRonnx)
+project(FunASROnnx)
+
+option(ENABLE_GLOG "Whether to build glog" ON)
# set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD 14 CACHE STRING "The C++ version to be used.")
@@ -26,7 +28,15 @@ ELSE()
endif()
include_directories(${PROJECT_SOURCE_DIR}/third_party/kaldi-native-fbank)
+include_directories(${PROJECT_SOURCE_DIR}/third_party/yaml-cpp/include)
add_subdirectory(third_party/yaml-cpp)
add_subdirectory(third_party/kaldi-native-fbank/kaldi-native-fbank/csrc)
add_subdirectory(src)
+
+if(ENABLE_GLOG)
+ include_directories(${PROJECT_SOURCE_DIR}/third_party/glog)
+ set(BUILD_TESTING OFF)
+ add_subdirectory(third_party/glog)
+endif()
+
diff --git a/funasr/runtime/onnxruntime/include/com-define.h b/funasr/runtime/onnxruntime/include/com-define.h
index e2c22f425..8c885178e 100644
--- a/funasr/runtime/onnxruntime/include/com-define.h
+++ b/funasr/runtime/onnxruntime/include/com-define.h
@@ -12,37 +12,51 @@
#define MODEL_SAMPLE_RATE 16000
#endif
+// model path
+#define VAD_MODEL_PATH "vad-model"
+#define VAD_CMVN_PATH "vad-cmvn"
+#define VAD_CONFIG_PATH "vad-config"
+#define AM_MODEL_PATH "am-model"
+#define AM_CMVN_PATH "am-cmvn"
+#define AM_CONFIG_PATH "am-config"
+#define PUNC_MODEL_PATH "punc-model"
+#define PUNC_CONFIG_PATH "punc-config"
+#define WAV_PATH "wav-path"
+#define WAV_SCP "wav-scp"
+#define THREAD_NUM "thread-num"
+
// vad
-#ifndef VAD_SILENCE_DYRATION
-#define VAD_SILENCE_DYRATION 15000
+#ifndef VAD_SILENCE_DURATION
+#define VAD_SILENCE_DURATION 800
#endif
#ifndef VAD_MAX_LEN
-#define VAD_MAX_LEN 800
+#define VAD_MAX_LEN 15000
#endif
#ifndef VAD_SPEECH_NOISE_THRES
#define VAD_SPEECH_NOISE_THRES 0.9
#endif
+#ifndef VAD_LFR_M
+#define VAD_LFR_M 5
+#endif
+
+#ifndef VAD_LFR_N
+#define VAD_LFR_N 1
+#endif
+
// punc
-#define PUNC_MODEL_FILE "punc_model.onnx"
-#define PUNC_YAML_FILE "punc.yaml"
#define UNK_CHAR ""
+#define TOKEN_LEN 20
-#define INPUT_NUM 2
-#define INPUT_NAME1 "input"
-#define INPUT_NAME2 "text_lengths"
-#define OUTPUT_NAME "logits"
-#define TOKEN_LEN 20
-
-#define CANDIDATE_NUM 6
+#define CANDIDATE_NUM 6
#define UNKNOW_INDEX 0
#define NOTPUNC_INDEX 1
#define COMMA_INDEX 2
#define PERIOD_INDEX 3
#define QUESTION_INDEX 4
#define DUN_INDEX 5
-#define CACHE_POP_TRIGGER_LIMIT 200
+#define CACHE_POP_TRIGGER_LIMIT 200
#endif
diff --git a/funasr/runtime/onnxruntime/include/kaldi-native-fbank/csrc/feature-fbank.h b/funasr/runtime/onnxruntime/include/kaldi-native-fbank/csrc/feature-fbank.h
deleted file mode 100644
index 0786aad10..000000000
--- a/funasr/runtime/onnxruntime/include/kaldi-native-fbank/csrc/feature-fbank.h
+++ /dev/null
@@ -1,134 +0,0 @@
-/**
- * Copyright (c) 2022 Xiaomi Corporation (authors: Fangjun Kuang)
- *
- * See LICENSE for clarification regarding multiple authors
- *
- * 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.
- */
-
-// This file is copied/modified from kaldi/src/feat/feature-fbank.h
-
-#ifndef KALDI_NATIVE_FBANK_CSRC_FEATURE_FBANK_H_
-#define KALDI_NATIVE_FBANK_CSRC_FEATURE_FBANK_H_
-
-#include
-#include
-#include
-
-#include "kaldi-native-fbank/csrc/feature-window.h"
-#include "kaldi-native-fbank/csrc/mel-computations.h"
-#include "kaldi-native-fbank/csrc/rfft.h"
-
-namespace knf {
-
-struct FbankOptions {
- FrameExtractionOptions frame_opts;
- MelBanksOptions mel_opts;
- // append an extra dimension with energy to the filter banks
- bool use_energy = false;
- float energy_floor = 0.0f; // active iff use_energy==true
-
- // If true, compute log_energy before preemphasis and windowing
- // If false, compute log_energy after preemphasis ans windowing
- bool raw_energy = true; // active iff use_energy==true
-
- // If true, put energy last (if using energy)
- // If false, put energy first
- bool htk_compat = false; // active iff use_energy==true
-
- // if true (default), produce log-filterbank, else linear
- bool use_log_fbank = true;
-
- // if true (default), use power in filterbank
- // analysis, else magnitude.
- bool use_power = true;
-
- FbankOptions() { mel_opts.num_bins = 23; }
-
- std::string ToString() const {
- std::ostringstream os;
- os << "frame_opts: \n";
- os << frame_opts << "\n";
- os << "\n";
-
- os << "mel_opts: \n";
- os << mel_opts << "\n";
-
- os << "use_energy: " << use_energy << "\n";
- os << "energy_floor: " << energy_floor << "\n";
- os << "raw_energy: " << raw_energy << "\n";
- os << "htk_compat: " << htk_compat << "\n";
- os << "use_log_fbank: " << use_log_fbank << "\n";
- os << "use_power: " << use_power << "\n";
- return os.str();
- }
-};
-
-std::ostream &operator<<(std::ostream &os, const FbankOptions &opts);
-
-class FbankComputer {
- public:
- using Options = FbankOptions;
-
- explicit FbankComputer(const FbankOptions &opts);
- ~FbankComputer();
-
- int32_t Dim() const {
- return opts_.mel_opts.num_bins + (opts_.use_energy ? 1 : 0);
- }
-
- // if true, compute log_energy_pre_window but after dithering and dc removal
- bool NeedRawLogEnergy() const { return opts_.use_energy && opts_.raw_energy; }
-
- const FrameExtractionOptions &GetFrameOptions() const {
- return opts_.frame_opts;
- }
-
- const FbankOptions &GetOptions() const { return opts_; }
-
- /**
- Function that computes one frame of features from
- one frame of signal.
-
- @param [in] signal_raw_log_energy The log-energy of the frame of the signal
- prior to windowing and pre-emphasis, or
- log(numeric_limits::min()), whichever is greater. Must be
- ignored by this function if this class returns false from
- this->NeedsRawLogEnergy().
- @param [in] vtln_warp The VTLN warping factor that the user wants
- to be applied when computing features for this utterance. Will
- normally be 1.0, meaning no warping is to be done. The value will
- be ignored for feature types that don't support VLTN, such as
- spectrogram features.
- @param [in] signal_frame One frame of the signal,
- as extracted using the function ExtractWindow() using the options
- returned by this->GetFrameOptions(). The function will use the
- vector as a workspace, which is why it's a non-const pointer.
- @param [out] feature Pointer to a vector of size this->Dim(), to which
- the computed feature will be written. It should be pre-allocated.
- */
- void Compute(float signal_raw_log_energy, float vtln_warp,
- std::vector *signal_frame, float *feature);
-
- private:
- const MelBanks *GetMelBanks(float vtln_warp);
-
- FbankOptions opts_;
- float log_energy_floor_;
- std::map mel_banks_; // float is VTLN coefficient.
- Rfft rfft_;
-};
-
-} // namespace knf
-
-#endif // KALDI_NATIVE_FBANK_CSRC_FEATURE_FBANK_H_
diff --git a/funasr/runtime/onnxruntime/include/kaldi-native-fbank/csrc/online-feature.h b/funasr/runtime/onnxruntime/include/kaldi-native-fbank/csrc/online-feature.h
deleted file mode 100644
index 5ca551157..000000000
--- a/funasr/runtime/onnxruntime/include/kaldi-native-fbank/csrc/online-feature.h
+++ /dev/null
@@ -1,142 +0,0 @@
-/**
- * Copyright (c) 2022 Xiaomi Corporation (authors: Fangjun Kuang)
- *
- * See LICENSE for clarification regarding multiple authors
- *
- * 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.
- */
-
-// The content in this file is copied/modified from
-// This file is copied/modified from kaldi/src/feat/online-feature.h
-#ifndef KALDI_NATIVE_FBANK_CSRC_ONLINE_FEATURE_H_
-#define KALDI_NATIVE_FBANK_CSRC_ONLINE_FEATURE_H_
-
-#include
-#include
-#include
-
-#include "kaldi-native-fbank/csrc/feature-fbank.h"
-
-namespace knf {
-
-/// This class serves as a storage for feature vectors with an option to limit
-/// the memory usage by removing old elements. The deleted frames indices are
-/// "remembered" so that regardless of the MAX_ITEMS setting, the user always
-/// provides the indices as if no deletion was being performed.
-/// This is useful when processing very long recordings which would otherwise
-/// cause the memory to eventually blow up when the features are not being
-/// removed.
-class RecyclingVector {
- public:
- /// By default it does not remove any elements.
- explicit RecyclingVector(int32_t items_to_hold = -1);
-
- ~RecyclingVector() = default;
- RecyclingVector(const RecyclingVector &) = delete;
- RecyclingVector &operator=(const RecyclingVector &) = delete;
-
- // The pointer is owned by RecyclingVector
- // Users should not free it
- const float *At(int32_t index) const;
-
- void PushBack(std::vector item);
-
- /// This method returns the size as if no "recycling" had happened,
- /// i.e. equivalent to the number of times the PushBack method has been
- /// called.
- int32_t Size() const;
-
- private:
- std::deque> items_;
- int32_t items_to_hold_;
- int32_t first_available_index_;
-};
-
-/// This is a templated class for online feature extraction;
-/// it's templated on a class like MfccComputer or PlpComputer
-/// that does the basic feature extraction.
-template
-class OnlineGenericBaseFeature {
- public:
- // Constructor from options class
- explicit OnlineGenericBaseFeature(const typename C::Options &opts);
-
- int32_t Dim() const { return computer_.Dim(); }
-
- float FrameShiftInSeconds() const {
- return computer_.GetFrameOptions().frame_shift_ms / 1000.0f;
- }
-
- int32_t NumFramesReady() const { return features_.Size(); }
-
- // 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 {
- return input_finished_ && frame == NumFramesReady() - 1;
- }
-
- const float *GetFrame(int32_t frame) const { return features_.At(frame); }
-
- // This would be called from the application, when you get
- // more wave data. Note: the sampling_rate is only provided so
- // the code can assert that it matches the sampling rate
- // expected in the options.
- //
- // @param sampling_rate The sampling_rate of the input waveform
- // @param waveform Pointer to a 1-D array of size n
- // @param n Number of entries in waveform
- void AcceptWaveform(float sampling_rate, const float *waveform, int32_t n);
-
- // 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();
-
- private:
- // This function computes any additional feature frames that it is possible to
- // compute from 'waveform_remainder_', which at this point may contain more
- // than just a remainder-sized quantity (because AcceptWaveform() appends to
- // waveform_remainder_ before calling this function). It adds these feature
- // frames to features_, and shifts off any now-unneeded samples of input from
- // waveform_remainder_ while incrementing waveform_offset_ by the same amount.
- void ComputeFeatures();
-
- C computer_; // class that does the MFCC or PLP or filterbank computation
-
- FeatureWindowFunction window_function_;
-
- // features_ is the Mfcc or Plp or Fbank features that we have already
- // computed.
-
- RecyclingVector features_;
-
- // True if the user has called "InputFinished()"
- bool input_finished_;
-
- // waveform_offset_ is the number of samples of waveform that we have
- // already discarded, i.e. that were prior to 'waveform_remainder_'.
- int64_t waveform_offset_;
-
- // waveform_remainder_ is a short piece of waveform that we may need to keep
- // after extracting all the whole frames we can (whatever length of feature
- // will be required for the next phase of computation).
- // It is a 1-D tensor
- std::vector waveform_remainder_;
-};
-
-using OnlineFbank = OnlineGenericBaseFeature;
-
-} // namespace knf
-
-#endif // KALDI_NATIVE_FBANK_CSRC_ONLINE_FEATURE_H_
diff --git a/funasr/runtime/onnxruntime/include/libfunasrapi.h b/funasr/runtime/onnxruntime/include/libfunasrapi.h
index 6b6e14801..8dca7f4d6 100644
--- a/funasr/runtime/onnxruntime/include/libfunasrapi.h
+++ b/funasr/runtime/onnxruntime/include/libfunasrapi.h
@@ -1,4 +1,5 @@
#pragma once
+#include
#ifdef WIN32
#ifdef _FUNASR_API_EXPORT
@@ -47,13 +48,13 @@ typedef enum {
typedef void (* QM_CALLBACK)(int cur_step, int n_total); // n_total: total steps; cur_step: Current Step.
// APIs for funasr
-_FUNASRAPI FUNASR_HANDLE FunASRInit(const char* sz_model_dir, int thread_num, bool quantize=false, bool use_vad=false, bool use_punc=false);
+_FUNASRAPI FUNASR_HANDLE FunASRInit(std::map& model_path, int thread_num);
// if not give a fn_callback ,it should be NULL
-_FUNASRAPI FUNASR_RESULT FunASRRecogBuffer(FUNASR_HANDLE handle, const char* sz_buf, int n_len, FUNASR_MODE mode, QM_CALLBACK fn_callback, bool use_vad=false, bool use_punc=false);
-_FUNASRAPI FUNASR_RESULT FunASRRecogPCMBuffer(FUNASR_HANDLE handle, const char* sz_buf, int n_len, int sampling_rate, FUNASR_MODE mode, QM_CALLBACK fn_callback, bool use_vad=false, bool use_punc=false);
-_FUNASRAPI FUNASR_RESULT FunASRRecogPCMFile(FUNASR_HANDLE handle, const char* sz_filename, int sampling_rate, FUNASR_MODE mode, QM_CALLBACK fn_callback, bool use_vad=false, bool use_punc=false);
-_FUNASRAPI FUNASR_RESULT FunASRRecogFile(FUNASR_HANDLE handle, const char* sz_wavfile, FUNASR_MODE mode, QM_CALLBACK fn_callback, bool use_vad=false, bool use_punc=false);
+_FUNASRAPI FUNASR_RESULT FunASRRecogBuffer(FUNASR_HANDLE handle, const char* sz_buf, int n_len, FUNASR_MODE mode, QM_CALLBACK fn_callback);
+_FUNASRAPI FUNASR_RESULT FunASRRecogPCMBuffer(FUNASR_HANDLE handle, const char* sz_buf, int n_len, int sampling_rate, FUNASR_MODE mode, QM_CALLBACK fn_callback);
+_FUNASRAPI FUNASR_RESULT FunASRRecogPCMFile(FUNASR_HANDLE handle, const char* sz_filename, int sampling_rate, FUNASR_MODE mode, QM_CALLBACK fn_callback);
+_FUNASRAPI FUNASR_RESULT FunASRRecogFile(FUNASR_HANDLE handle, const char* sz_wavfile, FUNASR_MODE mode, QM_CALLBACK fn_callback);
_FUNASRAPI const char* FunASRGetResult(FUNASR_RESULT result,int n_index);
_FUNASRAPI const int FunASRGetRetNumber(FUNASR_RESULT result);
diff --git a/funasr/runtime/onnxruntime/include/model.h b/funasr/runtime/onnxruntime/include/model.h
index 26a67f021..4b4b582ff 100644
--- a/funasr/runtime/onnxruntime/include/model.h
+++ b/funasr/runtime/onnxruntime/include/model.h
@@ -3,6 +3,7 @@
#define MODEL_H
#include
+#include
class Model {
public:
@@ -13,7 +14,9 @@ class Model {
virtual std::string Rescoring() = 0;
virtual std::vector> VadSeg(std::vector& pcm_data)=0;
virtual std::string AddPunc(const char* sz_input)=0;
+ virtual bool UseVad() =0;
+ virtual bool UsePunc() =0;
};
-Model *CreateModel(const char *path,int thread_num=1,bool quantize=false, bool use_vad=false, bool use_punc=false);
+Model *CreateModel(std::map& model_path,int thread_num=1);
#endif
diff --git a/funasr/runtime/onnxruntime/include/tclap/Arg.h b/funasr/runtime/onnxruntime/include/tclap/Arg.h
new file mode 100644
index 000000000..f8c4a5fc5
--- /dev/null
+++ b/funasr/runtime/onnxruntime/include/tclap/Arg.h
@@ -0,0 +1,683 @@
+// -*- Mode: c++; c-basic-offset: 4; tab-width: 4; -*-
+
+/******************************************************************************
+ *
+ * file: Arg.h
+ *
+ * Copyright (c) 2003, Michael E. Smoot .
+ * Copyright (c) 2004, Michael E. Smoot, Daniel Aarno .
+ * Copyright (c) 2017 Google Inc.
+ * All rights reserved.
+ *
+ * See the file COPYING in the top directory of this distribution for
+ * more information.
+ *
+ * THE SOFTWARE IS PROVIDED _AS IS_, WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ *****************************************************************************/
+
+
+#ifndef TCLAP_ARGUMENT_H
+#define TCLAP_ARGUMENT_H
+
+#ifdef HAVE_CONFIG_H
+#include
+#endif
+
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include
+
+#include
+#include
+#include
+#include
+#include
+
+namespace TCLAP {
+
+/**
+ * A virtual base class that defines the essential data for all arguments.
+ * This class, or one of its existing children, must be subclassed to do
+ * anything.
+ */
+class Arg
+{
+ private:
+ /**
+ * Prevent accidental copying.
+ */
+ Arg(const Arg& rhs);
+
+ /**
+ * Prevent accidental copying.
+ */
+ Arg& operator=(const Arg& rhs);
+
+ /**
+ * Indicates whether the rest of the arguments should be ignored.
+ */
+ static bool& ignoreRestRef() { static bool ign = false; return ign; }
+
+ /**
+ * The delimiter that separates an argument flag/name from the
+ * value.
+ */
+ static char& delimiterRef() { static char delim = ' '; return delim; }
+
+ protected:
+
+ /**
+ * The single char flag used to identify the argument.
+ * This value (preceded by a dash {-}), can be used to identify
+ * an argument on the command line. The _flag can be blank,
+ * in fact this is how unlabeled args work. Unlabeled args must
+ * override appropriate functions to get correct handling. Note
+ * that the _flag does NOT include the dash as part of the flag.
+ */
+ std::string _flag;
+
+ /**
+ * A single word namd identifying the argument.
+ * This value (preceded by two dashed {--}) can also be used
+ * to identify an argument on the command line. Note that the
+ * _name does NOT include the two dashes as part of the _name. The
+ * _name cannot be blank.
+ */
+ std::string _name;
+
+ /**
+ * Description of the argument.
+ */
+ std::string _description;
+
+ /**
+ * Indicating whether the argument is required.
+ */
+ bool _required;
+
+ /**
+ * Label to be used in usage description. Normally set to
+ * "required", but can be changed when necessary.
+ */
+ std::string _requireLabel;
+
+ /**
+ * Indicates whether a value is required for the argument.
+ * Note that the value may be required but the argument/value
+ * combination may not be, as specified by _required.
+ */
+ bool _valueRequired;
+
+ /**
+ * Indicates whether the argument has been set.
+ * Indicates that a value on the command line has matched the
+ * name/flag of this argument and the values have been set accordingly.
+ */
+ bool _alreadySet;
+
+ /**
+ * A pointer to a visitor object.
+ * The visitor allows special handling to occur as soon as the
+ * argument is matched. This defaults to NULL and should not
+ * be used unless absolutely necessary.
+ */
+ Visitor* _visitor;
+
+ /**
+ * Whether this argument can be ignored, if desired.
+ */
+ bool _ignoreable;
+
+ /**
+ * Indicates that the arg was set as part of an XOR and not on the
+ * command line.
+ */
+ bool _xorSet;
+
+ bool _acceptsMultipleValues;
+
+ /**
+ * Performs the special handling described by the Visitor.
+ */
+ void _checkWithVisitor() const;
+
+ /**
+ * Primary constructor. YOU (yes you) should NEVER construct an Arg
+ * directly, this is a base class that is extended by various children
+ * that are meant to be used. Use SwitchArg, ValueArg, MultiArg,
+ * UnlabeledValueArg, or UnlabeledMultiArg instead.
+ *
+ * \param flag - The flag identifying the argument.
+ * \param name - The name identifying the argument.
+ * \param desc - The description of the argument, used in the usage.
+ * \param req - Whether the argument is required.
+ * \param valreq - Whether the a value is required for the argument.
+ * \param v - The visitor checked by the argument. Defaults to NULL.
+ */
+ Arg( const std::string& flag,
+ const std::string& name,
+ const std::string& desc,
+ bool req,
+ bool valreq,
+ Visitor* v = NULL );
+
+ public:
+ /**
+ * Destructor.
+ */
+ virtual ~Arg();
+
+ /**
+ * Adds this to the specified list of Args.
+ * \param argList - The list to add this to.
+ */
+ virtual void addToList( std::list& argList ) const;
+
+ /**
+ * Begin ignoring arguments since the "--" argument was specified.
+ */
+ static void beginIgnoring() { ignoreRestRef() = true; }
+
+ /**
+ * Whether to ignore the rest.
+ */
+ static bool ignoreRest() { return ignoreRestRef(); }
+
+ /**
+ * The delimiter that separates an argument flag/name from the
+ * value.
+ */
+ static char delimiter() { return delimiterRef(); }
+
+ /**
+ * The char used as a place holder when SwitchArgs are combined.
+ * Currently set to the bell char (ASCII 7).
+ */
+ static char blankChar() { return (char)7; }
+
+ /**
+ * The char that indicates the beginning of a flag. Defaults to '-', but
+ * clients can define TCLAP_FLAGSTARTCHAR to override.
+ */
+#ifndef TCLAP_FLAGSTARTCHAR
+#define TCLAP_FLAGSTARTCHAR '-'
+#endif
+ static char flagStartChar() { return TCLAP_FLAGSTARTCHAR; }
+
+ /**
+ * The sting that indicates the beginning of a flag. Defaults to "-", but
+ * clients can define TCLAP_FLAGSTARTSTRING to override. Should be the same
+ * as TCLAP_FLAGSTARTCHAR.
+ */
+#ifndef TCLAP_FLAGSTARTSTRING
+#define TCLAP_FLAGSTARTSTRING "-"
+#endif
+ static const std::string flagStartString() { return TCLAP_FLAGSTARTSTRING; }
+
+ /**
+ * The sting that indicates the beginning of a name. Defaults to "--", but
+ * clients can define TCLAP_NAMESTARTSTRING to override.
+ */
+#ifndef TCLAP_NAMESTARTSTRING
+#define TCLAP_NAMESTARTSTRING "--"
+#endif
+ static const std::string nameStartString() { return TCLAP_NAMESTARTSTRING; }
+
+ /**
+ * The name used to identify the ignore rest argument.
+ */
+ static const std::string ignoreNameString() { return "ignore_rest"; }
+
+ /**
+ * Sets the delimiter for all arguments.
+ * \param c - The character that delimits flags/names from values.
+ */
+ static void setDelimiter( char c ) { delimiterRef() = c; }
+
+ /**
+ * Pure virtual method meant to handle the parsing and value assignment
+ * of the string on the command line.
+ * \param i - Pointer the the current argument in the list.
+ * \param args - Mutable list of strings. What is
+ * passed in from main.
+ */
+ virtual bool processArg(int *i, std::vector& args) = 0;
+
+ /**
+ * Operator ==.
+ * Equality operator. Must be virtual to handle unlabeled args.
+ * \param a - The Arg to be compared to this.
+ */
+ virtual bool operator==(const Arg& a) const;
+
+ /**
+ * Returns the argument flag.
+ */
+ const std::string& getFlag() const;
+
+ /**
+ * Returns the argument name.
+ */
+ const std::string& getName() const;
+
+ /**
+ * Returns the argument description.
+ */
+ std::string getDescription() const;
+
+ /**
+ * Indicates whether the argument is required.
+ */
+ virtual bool isRequired() const;
+
+ /**
+ * Sets _required to true. This is used by the XorHandler.
+ * You really have no reason to ever use it.
+ */
+ void forceRequired();
+
+ /**
+ * Sets the _alreadySet value to true. This is used by the XorHandler.
+ * You really have no reason to ever use it.
+ */
+ void xorSet();
+
+ /**
+ * Indicates whether a value must be specified for argument.
+ */
+ bool isValueRequired() const;
+
+ /**
+ * Indicates whether the argument has already been set. Only true
+ * if the arg has been matched on the command line.
+ */
+ bool isSet() const;
+
+ /**
+ * Indicates whether the argument can be ignored, if desired.
+ */
+ bool isIgnoreable() const;
+
+ /**
+ * A method that tests whether a string matches this argument.
+ * This is generally called by the processArg() method. This
+ * method could be re-implemented by a child to change how
+ * arguments are specified on the command line.
+ * \param s - The string to be compared to the flag/name to determine
+ * whether the arg matches.
+ */
+ virtual bool argMatches( const std::string& s ) const;
+
+ /**
+ * Returns a simple string representation of the argument.
+ * Primarily for debugging.
+ */
+ virtual std::string toString() const;
+
+ /**
+ * Returns a short ID for the usage.
+ * \param valueId - The value used in the id.
+ */
+ virtual std::string shortID( const std::string& valueId = "val" ) const;
+
+ /**
+ * Returns a long ID for the usage.
+ * \param valueId - The value used in the id.
+ */
+ virtual std::string longID( const std::string& valueId = "val" ) const;
+
+ /**
+ * Trims a value off of the flag.
+ * \param flag - The string from which the flag and value will be
+ * trimmed. Contains the flag once the value has been trimmed.
+ * \param value - Where the value trimmed from the string will
+ * be stored.
+ */
+ virtual void trimFlag( std::string& flag, std::string& value ) const;
+
+ /**
+ * Checks whether a given string has blank chars, indicating that
+ * it is a combined SwitchArg. If so, return true, otherwise return
+ * false.
+ * \param s - string to be checked.
+ */
+ bool _hasBlanks( const std::string& s ) const;
+
+ /**
+ * Sets the requireLabel. Used by XorHandler. You shouldn't ever
+ * use this.
+ * \param s - Set the requireLabel to this value.
+ */
+ void setRequireLabel( const std::string& s );
+
+ /**
+ * Used for MultiArgs and XorHandler to determine whether args
+ * can still be set.
+ */
+ virtual bool allowMore();
+
+ /**
+ * Use by output classes to determine whether an Arg accepts
+ * multiple values.
+ */
+ virtual bool acceptsMultipleValues();
+
+ /**
+ * Clears the Arg object and allows it to be reused by new
+ * command lines.
+ */
+ virtual void reset();
+};
+
+/**
+ * Typedef of an Arg list iterator.
+ */
+typedef std::list::const_iterator ArgListIterator;
+
+/**
+ * Typedef of an Arg vector iterator.
+ */
+typedef std::vector::const_iterator ArgVectorIterator;
+
+/**
+ * Typedef of a Visitor list iterator.
+ */
+typedef std::list::const_iterator VisitorListIterator;
+
+/*
+ * Extract a value of type T from it's string representation contained
+ * in strVal. The ValueLike parameter used to select the correct
+ * specialization of ExtractValue depending on the value traits of T.
+ * ValueLike traits use operator>> to assign the value from strVal.
+ */
+template void
+ExtractValue(T &destVal, const std::string& strVal, ValueLike vl)
+{
+ static_cast(vl); // Avoid warning about unused vl
+ istringstream is(strVal.c_str());
+
+ int valuesRead = 0;
+ while ( is.good() ) {
+ if ( is.peek() != EOF )
+#ifdef TCLAP_SETBASE_ZERO
+ is >> std::setbase(0) >> destVal;
+#else
+ is >> destVal;
+#endif
+ else
+ break;
+
+ valuesRead++;
+ }
+
+ if ( is.fail() )
+ throw( ArgParseException("Couldn't read argument value "
+ "from string '" + strVal + "'"));
+
+
+ if ( valuesRead > 1 )
+ throw( ArgParseException("More than one valid value parsed from "
+ "string '" + strVal + "'"));
+
+}
+
+/*
+ * Extract a value of type T from it's string representation contained
+ * in strVal. The ValueLike parameter used to select the correct
+ * specialization of ExtractValue depending on the value traits of T.
+ * StringLike uses assignment (operator=) to assign from strVal.
+ */
+template void
+ExtractValue(T &destVal, const std::string& strVal, StringLike sl)
+{
+ static_cast(sl); // Avoid warning about unused sl
+ SetString(destVal, strVal);
+}
+
+//////////////////////////////////////////////////////////////////////
+//BEGIN Arg.cpp
+//////////////////////////////////////////////////////////////////////
+
+inline Arg::Arg(const std::string& flag,
+ const std::string& name,
+ const std::string& desc,
+ bool req,
+ bool valreq,
+ Visitor* v) :
+ _flag(flag),
+ _name(name),
+ _description(desc),
+ _required(req),
+ _requireLabel("required"),
+ _valueRequired(valreq),
+ _alreadySet(false),
+ _visitor( v ),
+ _ignoreable(true),
+ _xorSet(false),
+ _acceptsMultipleValues(false)
+{
+ if ( _flag.length() > 1 )
+ throw(SpecificationException(
+ "Argument flag can only be one character long", toString() ) );
+
+ if ( _name != ignoreNameString() &&
+ ( _flag == Arg::flagStartString() ||
+ _flag == Arg::nameStartString() ||
+ _flag == " " ) )
+ throw(SpecificationException("Argument flag cannot be either '" +
+ Arg::flagStartString() + "' or '" +
+ Arg::nameStartString() + "' or a space.",
+ toString() ) );
+
+ if ( ( _name.substr( 0, Arg::flagStartString().length() ) == Arg::flagStartString() ) ||
+ ( _name.substr( 0, Arg::nameStartString().length() ) == Arg::nameStartString() ) ||
+ ( _name.find( " ", 0 ) != std::string::npos ) )
+ throw(SpecificationException("Argument name begin with either '" +
+ Arg::flagStartString() + "' or '" +
+ Arg::nameStartString() + "' or space.",
+ toString() ) );
+
+}
+
+inline Arg::~Arg() { }
+
+inline std::string Arg::shortID( const std::string& valueId ) const
+{
+ std::string id = "";
+
+ if ( _flag != "" )
+ id = Arg::flagStartString() + _flag;
+ else
+ id = Arg::nameStartString() + _name;
+
+ if ( _valueRequired )
+ id += std::string( 1, Arg::delimiter() ) + "<" + valueId + ">";
+
+ if ( !_required )
+ id = "[" + id + "]";
+
+ return id;
+}
+
+inline std::string Arg::longID( const std::string& valueId ) const
+{
+ std::string id = "";
+
+ if ( _flag != "" )
+ {
+ id += Arg::flagStartString() + _flag;
+
+ if ( _valueRequired )
+ id += std::string( 1, Arg::delimiter() ) + "<" + valueId + ">";
+
+ id += ", ";
+ }
+
+ id += Arg::nameStartString() + _name;
+
+ if ( _valueRequired )
+ id += std::string( 1, Arg::delimiter() ) + "<" + valueId + ">";
+
+ return id;
+
+}
+
+inline bool Arg::operator==(const Arg& a) const
+{
+ if ( ( _flag != "" && _flag == a._flag ) || _name == a._name)
+ return true;
+ else
+ return false;
+}
+
+inline std::string Arg::getDescription() const
+{
+ std::string desc = "";
+ if ( _required )
+ desc = "(" + _requireLabel + ") ";
+
+// if ( _valueRequired )
+// desc += "(value required) ";
+
+ desc += _description;
+ return desc;
+}
+
+inline const std::string& Arg::getFlag() const { return _flag; }
+
+inline const std::string& Arg::getName() const { return _name; }
+
+inline bool Arg::isRequired() const { return _required; }
+
+inline bool Arg::isValueRequired() const { return _valueRequired; }
+
+inline bool Arg::isSet() const
+{
+ if ( _alreadySet && !_xorSet )
+ return true;
+ else
+ return false;
+}
+
+inline bool Arg::isIgnoreable() const { return _ignoreable; }
+
+inline void Arg::setRequireLabel( const std::string& s)
+{
+ _requireLabel = s;
+}
+
+inline bool Arg::argMatches( const std::string& argFlag ) const
+{
+ if ( ( argFlag == Arg::flagStartString() + _flag && _flag != "" ) ||
+ argFlag == Arg::nameStartString() + _name )
+ return true;
+ else
+ return false;
+}
+
+inline std::string Arg::toString() const
+{
+ std::string s = "";
+
+ if ( _flag != "" )
+ s += Arg::flagStartString() + _flag + " ";
+
+ s += "(" + Arg::nameStartString() + _name + ")";
+
+ return s;
+}
+
+inline void Arg::_checkWithVisitor() const
+{
+ if ( _visitor != NULL )
+ _visitor->visit();
+}
+
+/**
+ * Implementation of trimFlag.
+ */
+inline void Arg::trimFlag(std::string& flag, std::string& value) const
+{
+ int stop = 0;
+ for ( int i = 0; static_cast(i) < flag.length(); i++ )
+ if ( flag[i] == Arg::delimiter() )
+ {
+ stop = i;
+ break;
+ }
+
+ if ( stop > 1 )
+ {
+ value = flag.substr(stop+1);
+ flag = flag.substr(0,stop);
+ }
+
+}
+
+/**
+ * Implementation of _hasBlanks.
+ */
+inline bool Arg::_hasBlanks( const std::string& s ) const
+{
+ for ( int i = 1; static_cast(i) < s.length(); i++ )
+ if ( s[i] == Arg::blankChar() )
+ return true;
+
+ return false;
+}
+
+inline void Arg::forceRequired()
+{
+ _required = true;
+}
+
+inline void Arg::xorSet()
+{
+ _alreadySet = true;
+ _xorSet = true;
+}
+
+/**
+ * Overridden by Args that need to added to the end of the list.
+ */
+inline void Arg::addToList( std::list& argList ) const
+{
+ argList.push_front( const_cast(this) );
+}
+
+inline bool Arg::allowMore()
+{
+ return false;
+}
+
+inline bool Arg::acceptsMultipleValues()
+{
+ return _acceptsMultipleValues;
+}
+
+inline void Arg::reset()
+{
+ _xorSet = false;
+ _alreadySet = false;
+}
+
+//////////////////////////////////////////////////////////////////////
+//END Arg.cpp
+//////////////////////////////////////////////////////////////////////
+
+} //namespace TCLAP
+
+#endif
+
diff --git a/funasr/runtime/onnxruntime/include/tclap/ArgException.h b/funasr/runtime/onnxruntime/include/tclap/ArgException.h
new file mode 100644
index 000000000..1e0f65919
--- /dev/null
+++ b/funasr/runtime/onnxruntime/include/tclap/ArgException.h
@@ -0,0 +1,213 @@
+// -*- Mode: c++; c-basic-offset: 4; tab-width: 4; -*-
+
+/******************************************************************************
+ *
+ * file: ArgException.h
+ *
+ * Copyright (c) 2003, Michael E. Smoot .
+ * Copyright (c) 2017 Google LLC
+ * All rights reserved.
+ *
+ * See the file COPYING in the top directory of this distribution for
+ * more information.
+ *
+ * THE SOFTWARE IS PROVIDED _AS IS_, WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ *****************************************************************************/
+
+
+#ifndef TCLAP_ARG_EXCEPTION_H
+#define TCLAP_ARG_EXCEPTION_H
+
+#include
+#include
+
+namespace TCLAP {
+
+/**
+ * A simple class that defines and argument exception. Should be caught
+ * whenever a CmdLine is created and parsed.
+ */
+class ArgException : public std::exception
+{
+ public:
+
+ /**
+ * Constructor.
+ * \param text - The text of the exception.
+ * \param id - The text identifying the argument source.
+ * \param td - Text describing the type of ArgException it is.
+ * of the exception.
+ */
+ ArgException( const std::string& text = "undefined exception",
+ const std::string& id = "undefined",
+ const std::string& td = "Generic ArgException")
+ : std::exception(),
+ _errorText(text),
+ _argId( id ),
+ _typeDescription(td)
+ { }
+
+ /**
+ * Destructor.
+ */
+ virtual ~ArgException() throw() { }
+
+ /**
+ * Returns the error text.
+ */
+ std::string error() const { return ( _errorText ); }
+
+ /**
+ * Returns the argument id.
+ */
+ std::string argId() const
+ {
+ if ( _argId == "undefined" )
+ return " ";
+ else
+ return ( "Argument: " + _argId );
+ }
+
+ /**
+ * Returns the arg id and error text.
+ */
+ const char* what() const throw()
+ {
+ static std::string ex;
+ ex = _argId + " -- " + _errorText;
+ return ex.c_str();
+ }
+
+ /**
+ * Returns the type of the exception. Used to explain and distinguish
+ * between different child exceptions.
+ */
+ std::string typeDescription() const
+ {
+ return _typeDescription;
+ }
+
+
+ private:
+
+ /**
+ * The text of the exception message.
+ */
+ std::string _errorText;
+
+ /**
+ * The argument related to this exception.
+ */
+ std::string _argId;
+
+ /**
+ * Describes the type of the exception. Used to distinguish
+ * between different child exceptions.
+ */
+ std::string _typeDescription;
+
+};
+
+/**
+ * Thrown from within the child Arg classes when it fails to properly
+ * parse the argument it has been passed.
+ */
+class ArgParseException : public ArgException
+{
+ public:
+ /**
+ * Constructor.
+ * \param text - The text of the exception.
+ * \param id - The text identifying the argument source
+ * of the exception.
+ */
+ ArgParseException( const std::string& text = "undefined exception",
+ const std::string& id = "undefined" )
+ : ArgException( text,
+ id,
+ std::string( "Exception found while parsing " ) +
+ std::string( "the value the Arg has been passed." ))
+ { }
+};
+
+/**
+ * Thrown from CmdLine when the arguments on the command line are not
+ * properly specified, e.g. too many arguments, required argument missing, etc.
+ */
+class CmdLineParseException : public ArgException
+{
+ public:
+ /**
+ * Constructor.
+ * \param text - The text of the exception.
+ * \param id - The text identifying the argument source
+ * of the exception.
+ */
+ CmdLineParseException( const std::string& text = "undefined exception",
+ const std::string& id = "undefined" )
+ : ArgException( text,
+ id,
+ std::string( "Exception found when the values ") +
+ std::string( "on the command line do not meet ") +
+ std::string( "the requirements of the defined ") +
+ std::string( "Args." ))
+ { }
+};
+
+/**
+ * Thrown from Arg and CmdLine when an Arg is improperly specified, e.g.
+ * same flag as another Arg, same name, etc.
+ */
+class SpecificationException : public ArgException
+{
+ public:
+ /**
+ * Constructor.
+ * \param text - The text of the exception.
+ * \param id - The text identifying the argument source
+ * of the exception.
+ */
+ SpecificationException( const std::string& text = "undefined exception",
+ const std::string& id = "undefined" )
+ : ArgException( text,
+ id,
+ std::string("Exception found when an Arg object ")+
+ std::string("is improperly defined by the ") +
+ std::string("developer." ))
+ { }
+
+};
+
+/**
+ * Thrown when TCLAP thinks the program should exit.
+ *
+ * For example after parse error this exception will be thrown (and
+ * normally caught). This allows any resource to be clened properly
+ * before exit.
+ *
+ * If exception handling is disabled (CmdLine::setExceptionHandling),
+ * this exception will propagate to the call site, allowing the
+ * program to catch it and avoid program termination, or do it's own
+ * cleanup. See for example, https://sourceforge.net/p/tclap/bugs/29.
+ */
+class ExitException {
+public:
+ ExitException(int estat) : _estat(estat) {}
+
+ int getExitStatus() const { return _estat; }
+
+private:
+ int _estat;
+};
+
+} // namespace TCLAP
+
+#endif
+
diff --git a/funasr/runtime/onnxruntime/include/tclap/ArgTraits.h b/funasr/runtime/onnxruntime/include/tclap/ArgTraits.h
new file mode 100644
index 000000000..0ccf5e36b
--- /dev/null
+++ b/funasr/runtime/onnxruntime/include/tclap/ArgTraits.h
@@ -0,0 +1,122 @@
+// -*- Mode: c++; c-basic-offset: 4; tab-width: 4; -*-
+
+/******************************************************************************
+ *
+ * file: ArgTraits.h
+ *
+ * Copyright (c) 2007, Daniel Aarno, Michael E. Smoot .
+ * Copyright (c) 2017 Google LLC
+ * All rights reserved.
+ *
+ * See the file COPYING in the top directory of this distribution for
+ * more information.
+ *
+ * THE SOFTWARE IS PROVIDED _AS IS_, WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ *****************************************************************************/
+
+// This is an internal tclap file, you should probably not have to
+// include this directly
+
+#ifndef TCLAP_ARGTRAITS_H
+#define TCLAP_ARGTRAITS_H
+
+namespace TCLAP {
+
+// We use two empty structs to get compile type specialization
+// function to work
+
+/**
+ * A value like argument value type is a value that can be set using
+ * operator>>. This is the default value type.
+ */
+struct ValueLike {
+ typedef ValueLike ValueCategory;
+ virtual ~ValueLike() {}
+};
+
+/**
+ * A string like argument value type is a value that can be set using
+ * operator=(string). Useful if the value type contains spaces which
+ * will be broken up into individual tokens by operator>>.
+ */
+struct StringLike {
+ virtual ~StringLike() {}
+};
+
+/**
+ * A class can inherit from this object to make it have string like
+ * traits. This is a compile time thing and does not add any overhead
+ * to the inherenting class.
+ */
+struct StringLikeTrait {
+ typedef StringLike ValueCategory;
+ virtual ~StringLikeTrait() {}
+};
+
+/**
+ * A class can inherit from this object to make it have value like
+ * traits. This is a compile time thing and does not add any overhead
+ * to the inherenting class.
+ */
+struct ValueLikeTrait {
+ typedef ValueLike ValueCategory;
+ virtual ~ValueLikeTrait() {}
+};
+
+/**
+ * Arg traits are used to get compile type specialization when parsing
+ * argument values. Using an ArgTraits you can specify the way that
+ * values gets assigned to any particular type during parsing. The two
+ * supported types are StringLike and ValueLike. ValueLike is the
+ * default and means that operator>> will be used to assign values to
+ * the type.
+ */
+template
+class ArgTraits {
+ // This is a bit silly, but what we want to do is:
+ // 1) If there exists a specialization of ArgTraits for type X,
+ // use it.
+ //
+ // 2) If no specialization exists but X has the typename
+ // X::ValueCategory, use the specialization for X::ValueCategory.
+ //
+ // 3) If neither (1) nor (2) defines the trait, use the default
+ // which is ValueLike.
+
+ // This is the "how":
+ //
+ // test(0) (where 0 is the NULL ptr) will match
+ // test(typename C::ValueCategory*) iff type T has the
+ // corresponding typedef. If it does not test(...) will be
+ // matched. This allows us to determine if T::ValueCategory
+ // exists by checking the sizeof for the test function (return
+ // value must have different sizeof).
+ template static short test(typename C::ValueCategory*);
+ template static long test(...);
+ static const bool hasTrait = sizeof(test(0)) == sizeof(short);
+
+ template
+ struct DefaultArgTrait {
+ typedef ValueLike ValueCategory;
+ };
+
+ template
+ struct DefaultArgTrait {
+ typedef typename C::ValueCategory ValueCategory;
+ };
+
+public:
+ typedef typename DefaultArgTrait::ValueCategory ValueCategory;
+};
+
+} // namespace
+
+#endif
+
diff --git a/funasr/runtime/onnxruntime/include/tclap/CmdLine.h b/funasr/runtime/onnxruntime/include/tclap/CmdLine.h
new file mode 100644
index 000000000..dc49bae24
--- /dev/null
+++ b/funasr/runtime/onnxruntime/include/tclap/CmdLine.h
@@ -0,0 +1,657 @@
+// -*- Mode: c++; c-basic-offset: 4; tab-width: 4; -*-
+
+/******************************************************************************
+ *
+ * file: CmdLine.h
+ *
+ * Copyright (c) 2003, Michael E. Smoot .
+ * Copyright (c) 2004, Michael E. Smoot, Daniel Aarno.
+ * All rights reserved.
+ *
+ * See the file COPYING in the top directory of this distribution for
+ * more information.
+ *
+ * THE SOFTWARE IS PROVIDED _AS IS_, WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ *****************************************************************************/
+
+#ifndef TCLAP_CMDLINE_H
+#define TCLAP_CMDLINE_H
+
+#include
+#include
+#include
+#include
+
+#include
+#include
+#include
+#include
+
+#include
+#include
+
+#include
+#include
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include // Needed for exit(), which isn't defined in some envs.
+
+namespace TCLAP {
+
+template void DelPtr(T ptr)
+{
+ delete ptr;
+}
+
+template void ClearContainer(C &c)
+{
+ typedef typename C::value_type value_type;
+ std::for_each(c.begin(), c.end(), DelPtr);
+ c.clear();
+}
+
+
+/**
+ * The base class that manages the command line definition and passes
+ * along the parsing to the appropriate Arg classes.
+ */
+class CmdLine : public CmdLineInterface
+{
+ protected:
+
+ /**
+ * The list of arguments that will be tested against the
+ * command line.
+ */
+ std::list _argList;
+
+ /**
+ * The name of the program. Set to argv[0].
+ */
+ std::string _progName;
+
+ /**
+ * A message used to describe the program. Used in the usage output.
+ */
+ std::string _message;
+
+ /**
+ * The version to be displayed with the --version switch.
+ */
+ std::string _version;
+
+ /**
+ * The number of arguments that are required to be present on
+ * the command line. This is set dynamically, based on the
+ * Args added to the CmdLine object.
+ */
+ int _numRequired;
+
+ /**
+ * The character that is used to separate the argument flag/name
+ * from the value. Defaults to ' ' (space).
+ */
+ char _delimiter;
+
+ /**
+ * The handler that manages xoring lists of args.
+ */
+ XorHandler _xorHandler;
+
+ /**
+ * A list of Args to be explicitly deleted when the destructor
+ * is called. At the moment, this only includes the three default
+ * Args.
+ */
+ std::list _argDeleteOnExitList;
+
+ /**
+ * A list of Visitors to be explicitly deleted when the destructor
+ * is called. At the moment, these are the Visitors created for the
+ * default Args.
+ */
+ std::list _visitorDeleteOnExitList;
+
+ /**
+ * Object that handles all output for the CmdLine.
+ */
+ CmdLineOutput* _output;
+
+ /**
+ * Should CmdLine handle parsing exceptions internally?
+ */
+ bool _handleExceptions;
+
+ /**
+ * Throws an exception listing the missing args.
+ */
+ void missingArgsException();
+
+ /**
+ * Checks whether a name/flag string matches entirely matches
+ * the Arg::blankChar. Used when multiple switches are combined
+ * into a single argument.
+ * \param s - The message to be used in the usage.
+ */
+ bool _emptyCombined(const std::string& s);
+
+ /**
+ * Perform a delete ptr; operation on ptr when this object is deleted.
+ */
+ void deleteOnExit(Arg* ptr);
+
+ /**
+ * Perform a delete ptr; operation on ptr when this object is deleted.
+ */
+ void deleteOnExit(Visitor* ptr);
+
+private:
+
+ /**
+ * Prevent accidental copying.
+ */
+ CmdLine(const CmdLine& rhs);
+ CmdLine& operator=(const CmdLine& rhs);
+
+ /**
+ * Encapsulates the code common to the constructors
+ * (which is all of it).
+ */
+ void _constructor();
+
+
+ /**
+ * Is set to true when a user sets the output object. We use this so
+ * that we don't delete objects that are created outside of this lib.
+ */
+ bool _userSetOutput;
+
+ /**
+ * Whether or not to automatically create help and version switches.
+ */
+ bool _helpAndVersion;
+
+ /**
+ * Whether or not to ignore unmatched args.
+ */
+ bool _ignoreUnmatched;
+
+ public:
+
+ /**
+ * Command line constructor. Defines how the arguments will be
+ * parsed.
+ * \param message - The message to be used in the usage
+ * output.
+ * \param delimiter - The character that is used to separate
+ * the argument flag/name from the value. Defaults to ' ' (space).
+ * \param version - The version number to be used in the
+ * --version switch.
+ * \param helpAndVersion - Whether or not to create the Help and
+ * Version switches. Defaults to true.
+ */
+ CmdLine(const std::string& message,
+ const char delimiter = ' ',
+ const std::string& version = "none",
+ bool helpAndVersion = true);
+
+ /**
+ * Deletes any resources allocated by a CmdLine object.
+ */
+ virtual ~CmdLine();
+
+ /**
+ * Adds an argument to the list of arguments to be parsed.
+ * \param a - Argument to be added.
+ */
+ void add( Arg& a );
+
+ /**
+ * An alternative add. Functionally identical.
+ * \param a - Argument to be added.
+ */
+ void add( Arg* a );
+
+ /**
+ * Add two Args that will be xor'd. If this method is used, add does
+ * not need to be called.
+ * \param a - Argument to be added and xor'd.
+ * \param b - Argument to be added and xor'd.
+ */
+ void xorAdd( Arg& a, Arg& b );
+
+ /**
+ * Add a list of Args that will be xor'd. If this method is used,
+ * add does not need to be called.
+ * \param xors - List of Args to be added and xor'd.
+ */
+ void xorAdd( const std::vector& xors );
+
+ /**
+ * Parses the command line.
+ * \param argc - Number of arguments.
+ * \param argv - Array of arguments.
+ */
+ void parse(int argc, const char * const * argv);
+
+ /**
+ * Parses the command line.
+ * \param args - A vector of strings representing the args.
+ * args[0] is still the program name.
+ */
+ void parse(std::vector& args);
+
+ /**
+ *
+ */
+ CmdLineOutput* getOutput();
+
+ /**
+ *
+ */
+ void setOutput(CmdLineOutput* co);
+
+ /**
+ *
+ */
+ std::string& getVersion();
+
+ /**
+ *
+ */
+ std::string& getProgramName();
+
+ /**
+ *
+ */
+ std::list& getArgList();
+
+ /**
+ *
+ */
+ XorHandler& getXorHandler();
+
+ /**
+ *
+ */
+ char getDelimiter();
+
+ /**
+ *
+ */
+ std::string& getMessage();
+
+ /**
+ *
+ */
+ bool hasHelpAndVersion();
+
+ /**
+ * Disables or enables CmdLine's internal parsing exception handling.
+ *
+ * @param state Should CmdLine handle parsing exceptions internally?
+ */
+ void setExceptionHandling(const bool state);
+
+ /**
+ * Returns the current state of the internal exception handling.
+ *
+ * @retval true Parsing exceptions are handled internally.
+ * @retval false Parsing exceptions are propagated to the caller.
+ */
+ bool getExceptionHandling() const;
+
+ /**
+ * Allows the CmdLine object to be reused.
+ */
+ void reset();
+
+ /**
+ * Allows unmatched args to be ignored. By default false.
+ *
+ * @param ignore If true the cmdline will ignore any unmatched args
+ * and if false it will behave as normal.
+ */
+ void ignoreUnmatched(const bool ignore);
+};
+
+
+///////////////////////////////////////////////////////////////////////////////
+//Begin CmdLine.cpp
+///////////////////////////////////////////////////////////////////////////////
+
+inline CmdLine::CmdLine(const std::string& m,
+ char delim,
+ const std::string& v,
+ bool help )
+ :
+ _argList(std::list()),
+ _progName("not_set_yet"),
+ _message(m),
+ _version(v),
+ _numRequired(0),
+ _delimiter(delim),
+ _xorHandler(XorHandler()),
+ _argDeleteOnExitList(std::list()),
+ _visitorDeleteOnExitList(std::list()),
+ _output(0),
+ _handleExceptions(true),
+ _userSetOutput(false),
+ _helpAndVersion(help),
+ _ignoreUnmatched(false)
+{
+ _constructor();
+}
+
+inline CmdLine::~CmdLine()
+{
+ ClearContainer(_argDeleteOnExitList);
+ ClearContainer(_visitorDeleteOnExitList);
+
+ if ( !_userSetOutput ) {
+ delete _output;
+ _output = 0;
+ }
+}
+
+inline void CmdLine::_constructor()
+{
+ _output = new StdOutput;
+
+ Arg::setDelimiter( _delimiter );
+
+ Visitor* v;
+
+ if ( _helpAndVersion )
+ {
+ v = new HelpVisitor( this, &_output );
+ SwitchArg* help = new SwitchArg("h","help",
+ "Displays usage information and exits.",
+ false, v);
+ add( help );
+ deleteOnExit(help);
+ deleteOnExit(v);
+
+ v = new VersionVisitor( this, &_output );
+ SwitchArg* vers = new SwitchArg("","version",
+ "Displays version information and exits.",
+ false, v);
+ add( vers );
+ deleteOnExit(vers);
+ deleteOnExit(v);
+ }
+
+ v = new IgnoreRestVisitor();
+ SwitchArg* ignore = new SwitchArg(Arg::flagStartString(),
+ Arg::ignoreNameString(),
+ "Ignores the rest of the labeled arguments following this flag.",
+ false, v);
+ add( ignore );
+ deleteOnExit(ignore);
+ deleteOnExit(v);
+}
+
+inline void CmdLine::xorAdd( const std::vector& ors )
+{
+ _xorHandler.add( ors );
+
+ for (ArgVectorIterator it = ors.begin(); it != ors.end(); it++)
+ {
+ (*it)->forceRequired();
+ (*it)->setRequireLabel( "OR required" );
+ add( *it );
+ }
+}
+
+inline void CmdLine::xorAdd( Arg& a, Arg& b )
+{
+ std::vector ors;
+ ors.push_back( &a );
+ ors.push_back( &b );
+ xorAdd( ors );
+}
+
+inline void CmdLine::add( Arg& a )
+{
+ add( &a );
+}
+
+inline void CmdLine::add( Arg* a )
+{
+ for( ArgListIterator it = _argList.begin(); it != _argList.end(); it++ )
+ if ( *a == *(*it) )
+ throw( SpecificationException(
+ "Argument with same flag/name already exists!",
+ a->longID() ) );
+
+ a->addToList( _argList );
+
+ if ( a->isRequired() )
+ _numRequired++;
+}
+
+
+inline void CmdLine::parse(int argc, const char * const * argv)
+{
+ // this step is necessary so that we have easy access to
+ // mutable strings.
+ std::vector args;
+ for (int i = 0; i < argc; i++)
+ args.push_back(argv[i]);
+
+ parse(args);
+}
+
+inline void CmdLine::parse(std::vector& args)
+{
+ bool shouldExit = false;
+ int estat = 0;
+ try {
+ if (args.empty()) {
+ // https://sourceforge.net/p/tclap/bugs/30/
+ throw CmdLineParseException("The args vector must not be empty, "
+ "the first entry should contain the "
+ "program's name.");
+ }
+
+ _progName = args.front();
+ args.erase(args.begin());
+
+ int requiredCount = 0;
+
+ for (int i = 0; static_cast(i) < args.size(); i++)
+ {
+ bool matched = false;
+ for (ArgListIterator it = _argList.begin();
+ it != _argList.end(); it++) {
+ if ( (*it)->processArg( &i, args ) )
+ {
+ requiredCount += _xorHandler.check( *it );
+ matched = true;
+ break;
+ }
+ }
+
+ // checks to see if the argument is an empty combined
+ // switch and if so, then we've actually matched it
+ if ( !matched && _emptyCombined( args[i] ) )
+ matched = true;
+
+ if ( !matched && !Arg::ignoreRest() && !_ignoreUnmatched)
+ throw(CmdLineParseException("Couldn't find match "
+ "for argument",
+ args[i]));
+ }
+
+ if ( requiredCount < _numRequired )
+ missingArgsException();
+
+ if ( requiredCount > _numRequired )
+ throw(CmdLineParseException("Too many arguments!"));
+
+ } catch ( ArgException& e ) {
+ // If we're not handling the exceptions, rethrow.
+ if ( !_handleExceptions) {
+ throw;
+ }
+
+ try {
+ _output->failure(*this,e);
+ } catch ( ExitException &ee ) {
+ estat = ee.getExitStatus();
+ shouldExit = true;
+ }
+ } catch (ExitException &ee) {
+ // If we're not handling the exceptions, rethrow.
+ if ( !_handleExceptions) {
+ throw;
+ }
+
+ estat = ee.getExitStatus();
+ shouldExit = true;
+ }
+
+ if (shouldExit)
+ exit(estat);
+}
+
+inline bool CmdLine::_emptyCombined(const std::string& s)
+{
+ if ( s.length() > 0 && s[0] != Arg::flagStartChar() )
+ return false;
+
+ for ( int i = 1; static_cast(i) < s.length(); i++ )
+ if ( s[i] != Arg::blankChar() )
+ return false;
+
+ return true;
+}
+
+inline void CmdLine::missingArgsException()
+{
+ int count = 0;
+
+ std::string missingArgList;
+ for (ArgListIterator it = _argList.begin(); it != _argList.end(); it++)
+ {
+ if ( (*it)->isRequired() && !(*it)->isSet() )
+ {
+ missingArgList += (*it)->getName();
+ missingArgList += ", ";
+ count++;
+ }
+ }
+ missingArgList = missingArgList.substr(0,missingArgList.length()-2);
+
+ std::string msg;
+ if ( count > 1 )
+ msg = "Required arguments missing: ";
+ else
+ msg = "Required argument missing: ";
+
+ msg += missingArgList;
+
+ throw(CmdLineParseException(msg));
+}
+
+inline void CmdLine::deleteOnExit(Arg* ptr)
+{
+ _argDeleteOnExitList.push_back(ptr);
+}
+
+inline void CmdLine::deleteOnExit(Visitor* ptr)
+{
+ _visitorDeleteOnExitList.push_back(ptr);
+}
+
+inline CmdLineOutput* CmdLine::getOutput()
+{
+ return _output;
+}
+
+inline void CmdLine::setOutput(CmdLineOutput* co)
+{
+ if ( !_userSetOutput )
+ delete _output;
+ _userSetOutput = true;
+ _output = co;
+}
+
+inline std::string& CmdLine::getVersion()
+{
+ return _version;
+}
+
+inline std::string& CmdLine::getProgramName()
+{
+ return _progName;
+}
+
+inline std::list& CmdLine::getArgList()
+{
+ return _argList;
+}
+
+inline XorHandler& CmdLine::getXorHandler()
+{
+ return _xorHandler;
+}
+
+inline char CmdLine::getDelimiter()
+{
+ return _delimiter;
+}
+
+inline std::string& CmdLine::getMessage()
+{
+ return _message;
+}
+
+inline bool CmdLine::hasHelpAndVersion()
+{
+ return _helpAndVersion;
+}
+
+inline void CmdLine::setExceptionHandling(const bool state)
+{
+ _handleExceptions = state;
+}
+
+inline bool CmdLine::getExceptionHandling() const
+{
+ return _handleExceptions;
+}
+
+inline void CmdLine::reset()
+{
+ for( ArgListIterator it = _argList.begin(); it != _argList.end(); it++ )
+ (*it)->reset();
+
+ _progName.clear();
+}
+
+inline void CmdLine::ignoreUnmatched(const bool ignore)
+{
+ _ignoreUnmatched = ignore;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+//End CmdLine.cpp
+///////////////////////////////////////////////////////////////////////////////
+
+
+
+} //namespace TCLAP
+#endif
diff --git a/funasr/runtime/onnxruntime/include/tclap/CmdLineInterface.h b/funasr/runtime/onnxruntime/include/tclap/CmdLineInterface.h
new file mode 100644
index 000000000..a9bdca09b
--- /dev/null
+++ b/funasr/runtime/onnxruntime/include/tclap/CmdLineInterface.h
@@ -0,0 +1,153 @@
+// -*- Mode: c++; c-basic-offset: 4; tab-width: 4; -*-
+
+
+/******************************************************************************
+ *
+ * file: CmdLineInterface.h
+ *
+ * Copyright (c) 2003, Michael E. Smoot .
+ * Copyright (c) 2004, Michael E. Smoot, Daniel Aarno.
+ * Copyright (c) 2017, Google LLC
+ * All rights reserved.
+ *
+ * See the file COPYING in the top directory of this distribution for
+ * more information.
+ *
+ * THE SOFTWARE IS PROVIDED _AS IS_, WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ *****************************************************************************/
+
+#ifndef TCLAP_COMMANDLINE_INTERFACE_H
+#define TCLAP_COMMANDLINE_INTERFACE_H
+
+#include
+#include
+#include
+#include
+#include
+
+
+namespace TCLAP {
+
+class Arg;
+class CmdLineOutput;
+class XorHandler;
+
+/**
+ * The base class that manages the command line definition and passes
+ * along the parsing to the appropriate Arg classes.
+ */
+class CmdLineInterface
+{
+ public:
+
+ /**
+ * Destructor
+ */
+ virtual ~CmdLineInterface() {}
+
+ /**
+ * Adds an argument to the list of arguments to be parsed.
+ * \param a - Argument to be added.
+ */
+ virtual void add( Arg& a )=0;
+
+ /**
+ * An alternative add. Functionally identical.
+ * \param a - Argument to be added.
+ */
+ virtual void add( Arg* a )=0;
+
+ /**
+ * Add two Args that will be xor'd.
+ * If this method is used, add does
+ * not need to be called.
+ * \param a - Argument to be added and xor'd.
+ * \param b - Argument to be added and xor'd.
+ */
+ virtual void xorAdd( Arg& a, Arg& b )=0;
+
+ /**
+ * Add a list of Args that will be xor'd. If this method is used,
+ * add does not need to be called.
+ * \param xors - List of Args to be added and xor'd.
+ */
+ virtual void xorAdd( const std::vector& xors )=0;
+
+ /**
+ * Parses the command line.
+ * \param argc - Number of arguments.
+ * \param argv - Array of arguments.
+ */
+ virtual void parse(int argc, const char * const * argv)=0;
+
+ /**
+ * Parses the command line.
+ * \param args - A vector of strings representing the args.
+ * args[0] is still the program name.
+ */
+ void parse(std::vector& args);
+
+ /**
+ * Returns the CmdLineOutput object.
+ */
+ virtual CmdLineOutput* getOutput()=0;
+
+ /**
+ * \param co - CmdLineOutput object that we want to use instead.
+ */
+ virtual void setOutput(CmdLineOutput* co)=0;
+
+ /**
+ * Returns the version string.
+ */
+ virtual std::string& getVersion()=0;
+
+ /**
+ * Returns the program name string.
+ */
+ virtual std::string& getProgramName()=0;
+
+ /**
+ * Returns the argList.
+ */
+ virtual std::list& getArgList()=0;
+
+ /**
+ * Returns the XorHandler.
+ */
+ virtual XorHandler& getXorHandler()=0;
+
+ /**
+ * Returns the delimiter string.
+ */
+ virtual char getDelimiter()=0;
+
+ /**
+ * Returns the message string.
+ */
+ virtual std::string& getMessage()=0;
+
+ /**
+ * Indicates whether or not the help and version switches were created
+ * automatically.
+ */
+ virtual bool hasHelpAndVersion()=0;
+
+ /**
+ * Resets the instance as if it had just been constructed so that the
+ * instance can be reused.
+ */
+ virtual void reset()=0;
+};
+
+} //namespace
+
+
+#endif
diff --git a/funasr/runtime/onnxruntime/include/tclap/CmdLineOutput.h b/funasr/runtime/onnxruntime/include/tclap/CmdLineOutput.h
new file mode 100644
index 000000000..cbc9a327a
--- /dev/null
+++ b/funasr/runtime/onnxruntime/include/tclap/CmdLineOutput.h
@@ -0,0 +1,77 @@
+// -*- Mode: c++; c-basic-offset: 4; tab-width: 4; -*-
+
+
+
+/******************************************************************************
+ *
+ * file: CmdLineOutput.h
+ *
+ * Copyright (c) 2004, Michael E. Smoot
+ * Copyright (c) 2017, Google LLC
+ * All rights reserved.
+ *
+ * See the file COPYING in the top directory of this distribution for
+ * more information.
+ *
+ * THE SOFTWARE IS PROVIDED _AS IS_, WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ *****************************************************************************/
+
+#ifndef TCLAP_CMDLINEOUTPUT_H
+#define TCLAP_CMDLINEOUTPUT_H
+
+#include
+#include
+#include
+#include
+#include
+#include
+
+namespace TCLAP {
+
+class CmdLineInterface;
+class ArgException;
+
+/**
+ * The interface that any output object must implement.
+ */
+class CmdLineOutput
+{
+
+ public:
+
+ /**
+ * Virtual destructor.
+ */
+ virtual ~CmdLineOutput() {}
+
+ /**
+ * Generates some sort of output for the USAGE.
+ * \param c - The CmdLine object the output is generated for.
+ */
+ virtual void usage(CmdLineInterface& c)=0;
+
+ /**
+ * Generates some sort of output for the version.
+ * \param c - The CmdLine object the output is generated for.
+ */
+ virtual void version(CmdLineInterface& c)=0;
+
+ /**
+ * Generates some sort of output for a failure.
+ * \param c - The CmdLine object the output is generated for.
+ * \param e - The ArgException that caused the failure.
+ */
+ virtual void failure( CmdLineInterface& c,
+ ArgException& e )=0;
+
+};
+
+} //namespace TCLAP
+#endif
diff --git a/funasr/runtime/onnxruntime/include/tclap/Constraint.h b/funasr/runtime/onnxruntime/include/tclap/Constraint.h
new file mode 100644
index 000000000..ff869cc78
--- /dev/null
+++ b/funasr/runtime/onnxruntime/include/tclap/Constraint.h
@@ -0,0 +1,78 @@
+// -*- Mode: c++; c-basic-offset: 4; tab-width: 4; -*-
+
+
+/******************************************************************************
+ *
+ * file: Constraint.h
+ *
+ * Copyright (c) 2005, Michael E. Smoot
+ * Copyright (c) 2017, Google LLC
+ * All rights reserved.
+ *
+ * See the file COPYING in the top directory of this distribution for
+ * more information.
+ *
+ * THE SOFTWARE IS PROVIDED _AS IS_, WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ *****************************************************************************/
+
+#ifndef TCLAP_CONSTRAINT_H
+#define TCLAP_CONSTRAINT_H
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+namespace TCLAP {
+
+/**
+ * The interface that defines the interaction between the Arg and Constraint.
+ */
+template
+class Constraint
+{
+
+ public:
+ /**
+ * Returns a description of the Constraint.
+ */
+ virtual std::string description() const =0;
+
+ /**
+ * Returns the short ID for the Constraint.
+ */
+ virtual std::string shortID() const =0;
+
+ /**
+ * The method used to verify that the value parsed from the command
+ * line meets the constraint.
+ * \param value - The value that will be checked.
+ */
+ virtual bool check(const T& value) const =0;
+
+ /**
+ * Destructor.
+ * Silences warnings about Constraint being a base class with virtual
+ * functions but without a virtual destructor.
+ */
+ virtual ~Constraint() { ; }
+
+ static std::string shortID(Constraint *constraint) {
+ if (!constraint)
+ throw std::logic_error("Cannot create a ValueArg with a NULL constraint");
+ return constraint->shortID();
+ }
+};
+
+} //namespace TCLAP
+#endif
diff --git a/funasr/runtime/onnxruntime/include/tclap/DocBookOutput.h b/funasr/runtime/onnxruntime/include/tclap/DocBookOutput.h
new file mode 100644
index 000000000..80b10e522
--- /dev/null
+++ b/funasr/runtime/onnxruntime/include/tclap/DocBookOutput.h
@@ -0,0 +1,303 @@
+// -*- Mode: c++; c-basic-offset: 4; tab-width: 4; -*-
+
+/******************************************************************************
+ *
+ * file: DocBookOutput.h
+ *
+ * Copyright (c) 2004, Michael E. Smoot
+ * Copyright (c) 2017, Google LLC
+ * All rights reserved.
+ *
+ * See the file COPYING in the top directory of this distribution for
+ * more information.
+ *
+ * THE SOFTWARE IS PROVIDED _AS IS_, WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ *****************************************************************************/
+
+#ifndef TCLAP_DOCBOOKOUTPUT_H
+#define TCLAP_DOCBOOKOUTPUT_H
+
+#include
+#include
+#include
+#include
+#include
+
+#include
+#include
+#include
+#include
+
+namespace TCLAP {
+
+/**
+ * A class that generates DocBook output for usage() method for the
+ * given CmdLine and its Args.
+ */
+class DocBookOutput : public CmdLineOutput
+{
+
+ public:
+
+ /**
+ * Prints the usage to stdout. Can be overridden to
+ * produce alternative behavior.
+ * \param c - The CmdLine object the output is generated for.
+ */
+ virtual void usage(CmdLineInterface& c);
+
+ /**
+ * Prints the version to stdout. Can be overridden
+ * to produce alternative behavior.
+ * \param c - The CmdLine object the output is generated for.
+ */
+ virtual void version(CmdLineInterface& c);
+
+ /**
+ * Prints (to stderr) an error message, short usage
+ * Can be overridden to produce alternative behavior.
+ * \param c - The CmdLine object the output is generated for.
+ * \param e - The ArgException that caused the failure.
+ */
+ virtual void failure(CmdLineInterface& c,
+ ArgException& e );
+
+ DocBookOutput() : theDelimiter('=') {}
+ protected:
+
+ /**
+ * Substitutes the char r for string x in string s.
+ * \param s - The string to operate on.
+ * \param r - The char to replace.
+ * \param x - What to replace r with.
+ */
+ void substituteSpecialChars( std::string& s, char r, std::string& x );
+ void removeChar( std::string& s, char r);
+ void basename( std::string& s );
+
+ void printShortArg(Arg* it);
+ void printLongArg(Arg* it);
+
+ char theDelimiter;
+};
+
+
+inline void DocBookOutput::version(CmdLineInterface& _cmd)
+{
+ std::cout << _cmd.getVersion() << std::endl;
+}
+
+inline void DocBookOutput::usage(CmdLineInterface& _cmd )
+{
+ std::list argList = _cmd.getArgList();
+ std::string progName = _cmd.getProgramName();
+ std::string xversion = _cmd.getVersion();
+ theDelimiter = _cmd.getDelimiter();
+ XorHandler xorHandler = _cmd.getXorHandler();
+ const std::vector< std::vector > xorList = xorHandler.getXorList();
+ basename(progName);
+
+ std::cout << "" << std::endl;
+ std::cout << "" << std::endl << std::endl;
+
+ std::cout << "" << std::endl;
+
+ std::cout << "" << std::endl;
+ std::cout << "" << progName << " " << std::endl;
+ std::cout << "1 " << std::endl;
+ std::cout << " " << std::endl;
+
+ std::cout << "" << std::endl;
+ std::cout << "" << progName << " " << std::endl;
+ std::cout << "" << _cmd.getMessage() << " " << std::endl;
+ std::cout << " " << std::endl;
+
+ std::cout << "" << std::endl;
+ std::cout << "" << std::endl;
+
+ std::cout << "" << progName << " " << std::endl;
+
+ // xor
+ for ( int i = 0; (unsigned int)i < xorList.size(); i++ )
+ {
+ std::cout << "" << std::endl;
+ for ( ArgVectorIterator it = xorList[i].begin();
+ it != xorList[i].end(); it++ )
+ printShortArg((*it));
+
+ std::cout << " " << std::endl;
+ }
+
+ // rest of args
+ for (ArgListIterator it = argList.begin(); it != argList.end(); it++)
+ if ( !xorHandler.contains( (*it) ) )
+ printShortArg((*it));
+
+ std::cout << " " << std::endl;
+ std::cout << " " << std::endl;
+
+ std::cout << "" << std::endl;
+ std::cout << "Description " << std::endl;
+ std::cout << "" << std::endl;
+ std::cout << _cmd.getMessage() << std::endl;
+ std::cout << " " << std::endl;
+ std::cout << " " << std::endl;
+
+ std::cout << "" << std::endl;
+ std::cout << "Options " << std::endl;
+
+ std::cout << "" << std::endl;
+
+ for (ArgListIterator it = argList.begin(); it != argList.end(); it++)
+ printLongArg((*it));
+
+ std::cout << " " << std::endl;
+ std::cout << " " << std::endl;
+
+ std::cout << "" << std::endl;
+ std::cout << "Version " << std::endl;
+ std::cout << "" << std::endl;
+ std::cout << xversion << std::endl;
+ std::cout << " " << std::endl;
+ std::cout << " " << std::endl;
+
+ std::cout << " " << std::endl;
+
+}
+
+inline void DocBookOutput::failure( CmdLineInterface& _cmd,
+ ArgException& e )
+{
+ static_cast(_cmd); // unused
+ std::cout << e.what() << std::endl;
+ throw ExitException(1);
+}
+
+inline void DocBookOutput::substituteSpecialChars( std::string& s,
+ char r,
+ std::string& x )
+{
+ size_t p;
+ while ( (p = s.find_first_of(r)) != std::string::npos )
+ {
+ s.erase(p,1);
+ s.insert(p,x);
+ }
+}
+
+inline void DocBookOutput::removeChar( std::string& s, char r)
+{
+ size_t p;
+ while ( (p = s.find_first_of(r)) != std::string::npos )
+ {
+ s.erase(p,1);
+ }
+}
+
+inline void DocBookOutput::basename( std::string& s )
+{
+ size_t p = s.find_last_of('/');
+ if ( p != std::string::npos )
+ {
+ s.erase(0, p + 1);
+ }
+}
+
+inline void DocBookOutput::printShortArg(Arg* a)
+{
+ std::string lt = "<";
+ std::string gt = ">";
+
+ std::string id = a->shortID();
+ substituteSpecialChars(id,'<',lt);
+ substituteSpecialChars(id,'>',gt);
+ removeChar(id,'[');
+ removeChar(id,']');
+
+ std::string choice = "opt";
+ if ( a->isRequired() )
+ choice = "plain";
+
+ std::cout << "acceptsMultipleValues() )
+ std::cout << " rep='repeat'";
+
+
+ std::cout << '>';
+ if ( !a->getFlag().empty() )
+ std::cout << a->flagStartChar() << a->getFlag();
+ else
+ std::cout << a->nameStartString() << a->getName();
+ if ( a->isValueRequired() )
+ {
+ std::string arg = a->shortID();
+ removeChar(arg,'[');
+ removeChar(arg,']');
+ removeChar(arg,'<');
+ removeChar(arg,'>');
+ removeChar(arg,'.');
+ arg.erase(0, arg.find_last_of(theDelimiter) + 1);
+ std::cout << theDelimiter;
+ std::cout << "" << arg << " ";
+ }
+ std::cout << " " << std::endl;
+
+}
+
+inline void DocBookOutput::printLongArg(Arg* a)
+{
+ std::string lt = "<";
+ std::string gt = ">";
+
+ std::string desc = a->getDescription();
+ substituteSpecialChars(desc,'<',lt);
+ substituteSpecialChars(desc,'>',gt);
+
+ std::cout << "" << std::endl;
+
+ if ( !a->getFlag().empty() )
+ {
+ std::cout << "" << std::endl;
+ std::cout << "";
+ std::cout << a->flagStartChar() << a->getFlag();
+ std::cout << " " << std::endl;
+ std::cout << " " << std::endl;
+ }
+
+ std::cout << "" << std::endl;
+ std::cout << "";
+ std::cout << a->nameStartString() << a->getName();
+ if ( a->isValueRequired() )
+ {
+ std::string arg = a->shortID();
+ removeChar(arg,'[');
+ removeChar(arg,']');
+ removeChar(arg,'<');
+ removeChar(arg,'>');
+ removeChar(arg,'.');
+ arg.erase(0, arg.find_last_of(theDelimiter) + 1);
+ std::cout << theDelimiter;
+ std::cout << "" << arg << " ";
+ }
+ std::cout << " " << std::endl;
+ std::cout << " " << std::endl;
+
+ std::cout << "" << std::endl;
+ std::cout << "" << std::endl;
+ std::cout << desc << std::endl;
+ std::cout << " " << std::endl;
+ std::cout << " " << std::endl;
+
+ std::cout << " " << std::endl;
+}
+
+} //namespace TCLAP
+#endif
diff --git a/funasr/runtime/onnxruntime/include/tclap/HelpVisitor.h b/funasr/runtime/onnxruntime/include/tclap/HelpVisitor.h
new file mode 100644
index 000000000..5ee3756fa
--- /dev/null
+++ b/funasr/runtime/onnxruntime/include/tclap/HelpVisitor.h
@@ -0,0 +1,78 @@
+// -*- Mode: c++; c-basic-offset: 4; tab-width: 4; -*-
+
+
+/******************************************************************************
+ *
+ * file: HelpVisitor.h
+ *
+ * Copyright (c) 2003, Michael E. Smoot .
+ * All rights reserved.
+ *
+ * See the file COPYING in the top directory of this distribution for
+ * more information.
+ *
+ * THE SOFTWARE IS PROVIDED _AS IS_, WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ *****************************************************************************/
+
+#ifndef TCLAP_HELP_VISITOR_H
+#define TCLAP_HELP_VISITOR_H
+
+#include
+#include
+#include
+
+namespace TCLAP {
+
+/**
+ * A Visitor object that calls the usage method of the given CmdLineOutput
+ * object for the specified CmdLine object.
+ */
+class HelpVisitor: public Visitor
+{
+ private:
+ /**
+ * Prevent accidental copying.
+ */
+ HelpVisitor(const HelpVisitor& rhs);
+ HelpVisitor& operator=(const HelpVisitor& rhs);
+
+ protected:
+
+ /**
+ * The CmdLine the output will be generated for.
+ */
+ CmdLineInterface* _cmd;
+
+ /**
+ * The output object.
+ */
+ CmdLineOutput** _out;
+
+ public:
+
+ /**
+ * Constructor.
+ * \param cmd - The CmdLine the output will be generated for.
+ * \param out - The type of output.
+ */
+ HelpVisitor(CmdLineInterface* cmd, CmdLineOutput** out)
+ : Visitor(), _cmd( cmd ), _out( out ) { }
+
+ /**
+ * Calls the usage method of the CmdLineOutput for the
+ * specified CmdLine.
+ */
+ void visit() { (*_out)->usage(*_cmd); throw ExitException(0); }
+
+};
+
+}
+
+#endif
diff --git a/funasr/runtime/onnxruntime/include/tclap/IgnoreRestVisitor.h b/funasr/runtime/onnxruntime/include/tclap/IgnoreRestVisitor.h
new file mode 100644
index 000000000..1824c3c4b
--- /dev/null
+++ b/funasr/runtime/onnxruntime/include/tclap/IgnoreRestVisitor.h
@@ -0,0 +1,54 @@
+// -*- Mode: c++; c-basic-offset: 4; tab-width: 4; -*-
+
+
+/******************************************************************************
+ *
+ * file: IgnoreRestVisitor.h
+ *
+ * Copyright (c) 2003, Michael E. Smoot .
+ * All rights reserved.
+ *
+ * See the file COPYING in the top directory of this distribution for
+ * more information.
+ *
+ * THE SOFTWARE IS PROVIDED _AS IS_, WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ *****************************************************************************/
+
+
+#ifndef TCLAP_IGNORE_REST_VISITOR_H
+#define TCLAP_IGNORE_REST_VISITOR_H
+
+#include
+#include
+
+namespace TCLAP {
+
+/**
+ * A Visitor that tells the CmdLine to begin ignoring arguments after
+ * this one is parsed.
+ */
+class IgnoreRestVisitor: public Visitor
+{
+ public:
+
+ /**
+ * Constructor.
+ */
+ IgnoreRestVisitor() : Visitor() {}
+
+ /**
+ * Sets Arg::_ignoreRest.
+ */
+ void visit() { Arg::beginIgnoring(); }
+};
+
+}
+
+#endif
diff --git a/funasr/runtime/onnxruntime/include/tclap/MultiArg.h b/funasr/runtime/onnxruntime/include/tclap/MultiArg.h
new file mode 100644
index 000000000..e0df8b957
--- /dev/null
+++ b/funasr/runtime/onnxruntime/include/tclap/MultiArg.h
@@ -0,0 +1,433 @@
+// -*- Mode: c++; c-basic-offset: 4; tab-width: 4; -*-
+
+/******************************************************************************
+ *
+ * file: MultiArg.h
+ *
+ * Copyright (c) 2003, Michael E. Smoot .
+ * Copyright (c) 2004, Michael E. Smoot, Daniel Aarno.
+ * Copyright (c) 2017, Google LLC
+ * All rights reserved.
+ *
+ * See the file COPYING in the top directory of this distribution for
+ * more information.
+ *
+ * THE SOFTWARE IS PROVIDED _AS IS_, WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ *****************************************************************************/
+
+
+#ifndef TCLAP_MULTIPLE_ARGUMENT_H
+#define TCLAP_MULTIPLE_ARGUMENT_H
+
+#include
+#include
+
+#include
+#include
+
+namespace TCLAP {
+/**
+ * An argument that allows multiple values of type T to be specified. Very
+ * similar to a ValueArg, except a vector of values will be returned
+ * instead of just one.
+ */
+template
+class MultiArg : public Arg
+{
+public:
+ typedef std::vector container_type;
+ typedef typename container_type::iterator iterator;
+ typedef typename container_type::const_iterator const_iterator;
+
+protected:
+
+ /**
+ * The list of values parsed from the CmdLine.
+ */
+ std::vector _values;
+
+ /**
+ * The description of type T to be used in the usage.
+ */
+ std::string _typeDesc;
+
+ /**
+ * A list of constraint on this Arg.
+ */
+ Constraint* _constraint;
+
+ /**
+ * Extracts the value from the string.
+ * Attempts to parse string as type T, if this fails an exception
+ * is thrown.
+ * \param val - The string to be read.
+ */
+ void _extractValue( const std::string& val );
+
+ /**
+ * Used by XorHandler to decide whether to keep parsing for this arg.
+ */
+ bool _allowMore;
+
+public:
+
+ /**
+ * Constructor.
+ * \param flag - The one character flag that identifies this
+ * argument on the command line.
+ * \param name - A one word name for the argument. Can be
+ * used as a long flag on the command line.
+ * \param desc - A description of what the argument is for or
+ * does.
+ * \param req - Whether the argument is required on the command
+ * line.
+ * \param typeDesc - A short, human readable description of the
+ * type that this object expects. This is used in the generation
+ * of the USAGE statement. The goal is to be helpful to the end user
+ * of the program.
+ * \param v - An optional visitor. You probably should not
+ * use this unless you have a very good reason.
+ */
+ MultiArg( const std::string& flag,
+ const std::string& name,
+ const std::string& desc,
+ bool req,
+ const std::string& typeDesc,
+ Visitor* v = NULL);
+
+ /**
+ * Constructor.
+ * \param flag - The one character flag that identifies this
+ * argument on the command line.
+ * \param name - A one word name for the argument. Can be
+ * used as a long flag on the command line.
+ * \param desc - A description of what the argument is for or
+ * does.
+ * \param req - Whether the argument is required on the command
+ * line.
+ * \param typeDesc - A short, human readable description of the
+ * type that this object expects. This is used in the generation
+ * of the USAGE statement. The goal is to be helpful to the end user
+ * of the program.
+ * \param parser - A CmdLine parser object to add this Arg to
+ * \param v - An optional visitor. You probably should not
+ * use this unless you have a very good reason.
+ */
+ MultiArg( const std::string& flag,
+ const std::string& name,
+ const std::string& desc,
+ bool req,
+ const std::string& typeDesc,
+ CmdLineInterface& parser,
+ Visitor* v = NULL );
+
+ /**
+ * Constructor.
+ * \param flag - The one character flag that identifies this
+ * argument on the command line.
+ * \param name - A one word name for the argument. Can be
+ * used as a long flag on the command line.
+ * \param desc - A description of what the argument is for or
+ * does.
+ * \param req - Whether the argument is required on the command
+ * line.
+ * \param constraint - A pointer to a Constraint object used
+ * to constrain this Arg.
+ * \param v - An optional visitor. You probably should not
+ * use this unless you have a very good reason.
+ */
+ MultiArg( const std::string& flag,
+ const std::string& name,
+ const std::string& desc,
+ bool req,
+ Constraint* constraint,
+ Visitor* v = NULL );
+
+ /**
+ * Constructor.
+ * \param flag - The one character flag that identifies this
+ * argument on the command line.
+ * \param name - A one word name for the argument. Can be
+ * used as a long flag on the command line.
+ * \param desc - A description of what the argument is for or
+ * does.
+ * \param req - Whether the argument is required on the command
+ * line.
+ * \param constraint - A pointer to a Constraint object used
+ * to constrain this Arg.
+ * \param parser - A CmdLine parser object to add this Arg to
+ * \param v - An optional visitor. You probably should not
+ * use this unless you have a very good reason.
+ */
+ MultiArg( const std::string& flag,
+ const std::string& name,
+ const std::string& desc,
+ bool req,
+ Constraint* constraint,
+ CmdLineInterface& parser,
+ Visitor* v = NULL );
+
+ /**
+ * Handles the processing of the argument.
+ * This re-implements the Arg version of this method to set the
+ * _value of the argument appropriately. It knows the difference
+ * between labeled and unlabeled.
+ * \param i - Pointer the the current argument in the list.
+ * \param args - Mutable list of strings. Passed from main().
+ */
+ virtual bool processArg(int* i, std::vector& args);
+
+ /**
+ * Returns a vector of type T containing the values parsed from
+ * the command line.
+ */
+ const std::vector& getValue() const { return _values; }
+
+ /**
+ * Returns an iterator over the values parsed from the command
+ * line.
+ */
+ const_iterator begin() const { return _values.begin(); }
+
+ /**
+ * Returns the end of the values parsed from the command
+ * line.
+ */
+ const_iterator end() const { return _values.end(); }
+
+ /**
+ * Returns the a short id string. Used in the usage.
+ * \param val - value to be used.
+ */
+ virtual std::string shortID(const std::string& val="val") const;
+
+ /**
+ * Returns the a long id string. Used in the usage.
+ * \param val - value to be used.
+ */
+ virtual std::string longID(const std::string& val="val") const;
+
+ /**
+ * Once we've matched the first value, then the arg is no longer
+ * required.
+ */
+ virtual bool isRequired() const;
+
+ virtual bool allowMore();
+
+ virtual void reset();
+
+private:
+ /**
+ * Prevent accidental copying
+ */
+ MultiArg(const MultiArg& rhs);
+ MultiArg& operator=(const MultiArg& rhs);
+
+};
+
+template
+MultiArg::MultiArg(const std::string& flag,
+ const std::string& name,
+ const std::string& desc,
+ bool req,
+ const std::string& typeDesc,
+ Visitor* v) :
+ Arg( flag, name, desc, req, true, v ),
+ _values(std::vector()),
+ _typeDesc( typeDesc ),
+ _constraint( NULL ),
+ _allowMore(false)
+{
+ _acceptsMultipleValues = true;
+}
+
+template
+MultiArg::MultiArg(const std::string& flag,
+ const std::string& name,
+ const std::string& desc,
+ bool req,
+ const std::string& typeDesc,
+ CmdLineInterface& parser,
+ Visitor* v)
+: Arg( flag, name, desc, req, true, v ),
+ _values(std::vector()),
+ _typeDesc( typeDesc ),
+ _constraint( NULL ),
+ _allowMore(false)
+{
+ parser.add( this );
+ _acceptsMultipleValues = true;
+}
+
+/**
+ *
+ */
+template
+MultiArg::MultiArg(const std::string& flag,
+ const std::string& name,
+ const std::string& desc,
+ bool req,
+ Constraint* constraint,
+ Visitor* v)
+: Arg( flag, name, desc, req, true, v ),
+ _values(std::vector()),
+ _typeDesc( Constraint::shortID(constraint) ),
+ _constraint( constraint ),
+ _allowMore(false)
+{
+ _acceptsMultipleValues = true;
+}
+
+template
+MultiArg::MultiArg(const std::string& flag,
+ const std::string& name,
+ const std::string& desc,
+ bool req,
+ Constraint* constraint,
+ CmdLineInterface& parser,
+ Visitor* v)
+: Arg( flag, name, desc, req, true, v ),
+ _values(std::vector()),
+ _typeDesc( Constraint::shortID(constraint) ),
+ _constraint( constraint ),
+ _allowMore(false)
+{
+ parser.add( this );
+ _acceptsMultipleValues = true;
+}
+
+template
+bool MultiArg::processArg(int *i, std::vector& args)
+{
+ if ( _ignoreable && Arg::ignoreRest() )
+ return false;
+
+ if ( _hasBlanks( args[*i] ) )
+ return false;
+
+ std::string flag = args[*i];
+ std::string value = "";
+
+ trimFlag( flag, value );
+
+ if ( argMatches( flag ) )
+ {
+ if ( Arg::delimiter() != ' ' && value == "" )
+ throw( ArgParseException(
+ "Couldn't find delimiter for this argument!",
+ toString() ) );
+
+ // always take the first one, regardless of start string
+ if ( value == "" )
+ {
+ (*i)++;
+ if ( static_cast(*i) < args.size() )
+ _extractValue( args[*i] );
+ else
+ throw( ArgParseException("Missing a value for this argument!",
+ toString() ) );
+ }
+ else
+ _extractValue( value );
+
+ /*
+ // continuing taking the args until we hit one with a start string
+ while ( (unsigned int)(*i)+1 < args.size() &&
+ args[(*i)+1].find_first_of( Arg::flagStartString() ) != 0 &&
+ args[(*i)+1].find_first_of( Arg::nameStartString() ) != 0 )
+ _extractValue( args[++(*i)] );
+ */
+
+ _alreadySet = true;
+ _checkWithVisitor();
+
+ return true;
+ }
+ else
+ return false;
+}
+
+/**
+ *
+ */
+template
+std::string MultiArg::shortID(const std::string& val) const
+{
+ static_cast(val); // Ignore input, don't warn
+ return Arg::shortID(_typeDesc) + " ...";
+}
+
+/**
+ *
+ */
+template
+std::string MultiArg::longID(const std::string& val) const
+{
+ static_cast(val); // Ignore input, don't warn
+ return Arg::longID(_typeDesc) + " (accepted multiple times)";
+}
+
+/**
+ * Once we've matched the first value, then the arg is no longer
+ * required.
+ */
+template
+bool MultiArg::isRequired() const
+{
+ if ( _required )
+ {
+ if ( _values.size() > 1 )
+ return false;
+ else
+ return true;
+ }
+ else
+ return false;
+
+}
+
+template
+void MultiArg::_extractValue( const std::string& val )
+{
+ try {
+ T tmp;
+ ExtractValue(tmp, val, typename ArgTraits::ValueCategory());
+ _values.push_back(tmp);
+ } catch( ArgParseException &e) {
+ throw ArgParseException(e.error(), toString());
+ }
+
+ if ( _constraint != NULL )
+ if ( ! _constraint->check( _values.back() ) )
+ throw( CmdLineParseException( "Value '" + val +
+ "' does not meet constraint: " +
+ _constraint->description(),
+ toString() ) );
+}
+
+template
+bool MultiArg::allowMore()
+{
+ bool am = _allowMore;
+ _allowMore = true;
+ return am;
+}
+
+template
+void MultiArg::reset()
+{
+ Arg::reset();
+ _values.clear();
+}
+
+} // namespace TCLAP
+
+#endif
diff --git a/funasr/runtime/onnxruntime/include/tclap/MultiSwitchArg.h b/funasr/runtime/onnxruntime/include/tclap/MultiSwitchArg.h
new file mode 100644
index 000000000..e333ea7b1
--- /dev/null
+++ b/funasr/runtime/onnxruntime/include/tclap/MultiSwitchArg.h
@@ -0,0 +1,217 @@
+// -*- Mode: c++; c-basic-offset: 4; tab-width: 4; -*-
+
+
+/******************************************************************************
+*
+* file: MultiSwitchArg.h
+*
+* Copyright (c) 2003, Michael E. Smoot .
+* Copyright (c) 2004, Michael E. Smoot, Daniel Aarno.
+* Copyright (c) 2005, Michael E. Smoot, Daniel Aarno, Erik Zeek.
+* Copyright (c) 2017, Google LLC
+* All rights reserved.
+*
+* See the file COPYING in the top directory of this distribution for
+* more information.
+*
+* THE SOFTWARE IS PROVIDED _AS IS_, WITHOUT WARRANTY OF ANY KIND, EXPRESS
+* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+* DEALINGS IN THE SOFTWARE.
+*
+*****************************************************************************/
+
+
+#ifndef TCLAP_MULTI_SWITCH_ARG_H
+#define TCLAP_MULTI_SWITCH_ARG_H
+
+#include
+#include
+
+#include
+
+namespace TCLAP {
+
+/**
+* A multiple switch argument. If the switch is set on the command line, then
+* the getValue method will return the number of times the switch appears.
+*/
+class MultiSwitchArg : public SwitchArg
+{
+ protected:
+
+ /**
+ * The value of the switch.
+ */
+ int _value;
+
+ /**
+ * Used to support the reset() method so that ValueArg can be
+ * reset to their constructed value.
+ */
+ int _default;
+
+ public:
+
+ /**
+ * MultiSwitchArg constructor.
+ * \param flag - The one character flag that identifies this
+ * argument on the command line.
+ * \param name - A one word name for the argument. Can be
+ * used as a long flag on the command line.
+ * \param desc - A description of what the argument is for or
+ * does.
+ * \param init - Optional. The initial/default value of this Arg.
+ * Defaults to 0.
+ * \param v - An optional visitor. You probably should not
+ * use this unless you have a very good reason.
+ */
+ MultiSwitchArg(const std::string& flag,
+ const std::string& name,
+ const std::string& desc,
+ int init = 0,
+ Visitor* v = NULL);
+
+
+ /**
+ * MultiSwitchArg constructor.
+ * \param flag - The one character flag that identifies this
+ * argument on the command line.
+ * \param name - A one word name for the argument. Can be
+ * used as a long flag on the command line.
+ * \param desc - A description of what the argument is for or
+ * does.
+ * \param parser - A CmdLine parser object to add this Arg to
+ * \param init - Optional. The initial/default value of this Arg.
+ * Defaults to 0.
+ * \param v - An optional visitor. You probably should not
+ * use this unless you have a very good reason.
+ */
+ MultiSwitchArg(const std::string& flag,
+ const std::string& name,
+ const std::string& desc,
+ CmdLineInterface& parser,
+ int init = 0,
+ Visitor* v = NULL);
+
+
+ /**
+ * Handles the processing of the argument.
+ * This re-implements the SwitchArg version of this method to set the
+ * _value of the argument appropriately.
+ * \param i - Pointer the the current argument in the list.
+ * \param args - Mutable list of strings. Passed
+ * in from main().
+ */
+ virtual bool processArg(int* i, std::vector& args);
+
+ /**
+ * Returns int, the number of times the switch has been set.
+ */
+ int getValue() const { return _value; }
+
+ /**
+ * Returns the shortID for this Arg.
+ */
+ std::string shortID(const std::string& val) const;
+
+ /**
+ * Returns the longID for this Arg.
+ */
+ std::string longID(const std::string& val) const;
+
+ void reset();
+
+};
+
+//////////////////////////////////////////////////////////////////////
+//BEGIN MultiSwitchArg.cpp
+//////////////////////////////////////////////////////////////////////
+inline MultiSwitchArg::MultiSwitchArg(const std::string& flag,
+ const std::string& name,
+ const std::string& desc,
+ int init,
+ Visitor* v )
+: SwitchArg(flag, name, desc, false, v),
+_value( init ),
+_default( init )
+{ }
+
+inline MultiSwitchArg::MultiSwitchArg(const std::string& flag,
+ const std::string& name,
+ const std::string& desc,
+ CmdLineInterface& parser,
+ int init,
+ Visitor* v )
+: SwitchArg(flag, name, desc, false, v),
+_value( init ),
+_default( init )
+{
+ parser.add( this );
+}
+
+inline bool MultiSwitchArg::processArg(int *i, std::vector& args)
+{
+ if ( _ignoreable && Arg::ignoreRest() )
+ return false;
+
+ if ( argMatches( args[*i] ))
+ {
+ // so the isSet() method will work
+ _alreadySet = true;
+
+ // Matched argument: increment value.
+ ++_value;
+
+ _checkWithVisitor();
+
+ return true;
+ }
+ else if ( combinedSwitchesMatch( args[*i] ) )
+ {
+ // so the isSet() method will work
+ _alreadySet = true;
+
+ // Matched argument: increment value.
+ ++_value;
+
+ // Check for more in argument and increment value.
+ while ( combinedSwitchesMatch( args[*i] ) )
+ ++_value;
+
+ _checkWithVisitor();
+
+ return false;
+ }
+ else
+ return false;
+}
+
+inline std::string
+MultiSwitchArg::shortID(const std::string& val) const
+{
+ return Arg::shortID(val) + " ...";
+}
+
+inline std::string
+MultiSwitchArg::longID(const std::string& val) const
+{
+ return Arg::longID(val) + " (accepted multiple times)";
+}
+
+inline void
+MultiSwitchArg::reset()
+{
+ MultiSwitchArg::_value = MultiSwitchArg::_default;
+}
+
+//////////////////////////////////////////////////////////////////////
+//END MultiSwitchArg.cpp
+//////////////////////////////////////////////////////////////////////
+
+} //namespace TCLAP
+
+#endif
diff --git a/funasr/runtime/onnxruntime/include/tclap/OptionalUnlabeledTracker.h b/funasr/runtime/onnxruntime/include/tclap/OptionalUnlabeledTracker.h
new file mode 100644
index 000000000..aa64116dc
--- /dev/null
+++ b/funasr/runtime/onnxruntime/include/tclap/OptionalUnlabeledTracker.h
@@ -0,0 +1,64 @@
+// -*- Mode: c++; c-basic-offset: 4; tab-width: 4; -*-
+
+
+
+/******************************************************************************
+ *
+ * file: OptionalUnlabeledTracker.h
+ *
+ * Copyright (c) 2005, Michael E. Smoot .
+ * All rights reserved.
+ *
+ * See the file COPYING in the top directory of this distribution for
+ * more information.
+ *
+ * THE SOFTWARE IS PROVIDED _AS IS_, WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ *****************************************************************************/
+
+
+#ifndef TCLAP_OPTIONAL_UNLABELED_TRACKER_H
+#define TCLAP_OPTIONAL_UNLABELED_TRACKER_H
+
+#include
+
+namespace TCLAP {
+
+class OptionalUnlabeledTracker
+{
+
+ public:
+
+ static void check( bool req, const std::string& argName );
+
+ static void gotOptional() { alreadyOptionalRef() = true; }
+
+ static bool& alreadyOptional() { return alreadyOptionalRef(); }
+
+ private:
+
+ static bool& alreadyOptionalRef() { static bool ct = false; return ct; }
+};
+
+
+inline void OptionalUnlabeledTracker::check( bool req, const std::string& argName )
+{
+ if ( OptionalUnlabeledTracker::alreadyOptional() )
+ throw( SpecificationException(
+ "You can't specify ANY Unlabeled Arg following an optional Unlabeled Arg",
+ argName ) );
+
+ if ( !req )
+ OptionalUnlabeledTracker::gotOptional();
+}
+
+
+} // namespace TCLAP
+
+#endif
diff --git a/funasr/runtime/onnxruntime/include/tclap/StandardTraits.h b/funasr/runtime/onnxruntime/include/tclap/StandardTraits.h
new file mode 100644
index 000000000..5864f7787
--- /dev/null
+++ b/funasr/runtime/onnxruntime/include/tclap/StandardTraits.h
@@ -0,0 +1,63 @@
+// -*- Mode: c++; c-basic-offset: 4; tab-width: 4; -*-
+
+/******************************************************************************
+ *
+ * file: StandardTraits.h
+ *
+ * Copyright (c) 2007, Daniel Aarno, Michael E. Smoot .
+ * Copyright (c) 2017, Google LLC
+ * All rights reserved.
+ *
+ * See the file COPYING in the top directory of this distribution for
+ * more information.
+ *
+ * THE SOFTWARE IS PROVIDED _AS IS_, WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ *****************************************************************************/
+
+// This is an internal tclap file, you should probably not have to
+// include this directly
+
+#ifndef TCLAP_STANDARD_TRAITS_H
+#define TCLAP_STANDARD_TRAITS_H
+
+#ifdef HAVE_CONFIG_H
+#include // To check for long long
+#endif
+
+// If Microsoft has already typedef'd wchar_t as an unsigned
+// short, then compiles will break because it's as if we're
+// creating ArgTraits twice for unsigned short. Thus...
+#ifdef _MSC_VER
+#ifndef _NATIVE_WCHAR_T_DEFINED
+#define TCLAP_DONT_DECLARE_WCHAR_T_ARGTRAITS
+#endif
+#endif
+
+namespace TCLAP {
+
+// Integer types (signed, unsigned and bool) and floating point types all
+// have value-like semantics.
+
+// Strings have string like argument traits.
+template<>
+struct ArgTraits {
+ typedef StringLike ValueCategory;
+};
+
+template
+void SetString(T &dst, const std::string &src)
+{
+ dst = src;
+}
+
+} // namespace
+
+#endif
+
diff --git a/funasr/runtime/onnxruntime/include/tclap/StdOutput.h b/funasr/runtime/onnxruntime/include/tclap/StdOutput.h
new file mode 100644
index 000000000..cfef79a14
--- /dev/null
+++ b/funasr/runtime/onnxruntime/include/tclap/StdOutput.h
@@ -0,0 +1,300 @@
+// -*- Mode: c++; c-basic-offset: 4; tab-width: 4; -*-
+
+/******************************************************************************
+ *
+ * file: StdOutput.h
+ *
+ * Copyright (c) 2004, Michael E. Smoot
+ * Copyright (c) 2017, Google LLC
+ * All rights reserved.
+ *
+ * See the file COPYING in the top directory of this distribution for
+ * more information.
+ *
+ * THE SOFTWARE IS PROVIDED _AS IS_, WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ *****************************************************************************/
+
+#ifndef TCLAP_STDCMDLINEOUTPUT_H
+#define TCLAP_STDCMDLINEOUTPUT_H
+
+#include
+#include
+#include
+#include
+#include
+
+#include
+#include
+#include
+#include
+
+namespace TCLAP {
+
+/**
+ * A class that isolates any output from the CmdLine object so that it
+ * may be easily modified.
+ */
+class StdOutput : public CmdLineOutput
+{
+
+ public:
+
+ /**
+ * Prints the usage to stdout. Can be overridden to
+ * produce alternative behavior.
+ * \param c - The CmdLine object the output is generated for.
+ */
+ virtual void usage(CmdLineInterface& c);
+
+ /**
+ * Prints the version to stdout. Can be overridden
+ * to produce alternative behavior.
+ * \param c - The CmdLine object the output is generated for.
+ */
+ virtual void version(CmdLineInterface& c);
+
+ /**
+ * Prints (to stderr) an error message, short usage
+ * Can be overridden to produce alternative behavior.
+ * \param c - The CmdLine object the output is generated for.
+ * \param e - The ArgException that caused the failure.
+ */
+ virtual void failure(CmdLineInterface& c,
+ ArgException& e );
+
+ protected:
+
+ /**
+ * Writes a brief usage message with short args.
+ * \param c - The CmdLine object the output is generated for.
+ * \param os - The stream to write the message to.
+ */
+ void _shortUsage( CmdLineInterface& c, std::ostream& os ) const;
+
+ /**
+ * Writes a longer usage message with long and short args,
+ * provides descriptions and prints message.
+ * \param c - The CmdLine object the output is generated for.
+ * \param os - The stream to write the message to.
+ */
+ void _longUsage( CmdLineInterface& c, std::ostream& os ) const;
+
+ /**
+ * This function inserts line breaks and indents long strings
+ * according the params input. It will only break lines at spaces,
+ * commas and pipes.
+ * \param os - The stream to be printed to.
+ * \param s - The string to be printed.
+ * \param maxWidth - The maxWidth allowed for the output line.
+ * \param indentSpaces - The number of spaces to indent the first line.
+ * \param secondLineOffset - The number of spaces to indent the second
+ * and all subsequent lines in addition to indentSpaces.
+ */
+ void spacePrint( std::ostream& os,
+ const std::string& s,
+ int maxWidth,
+ int indentSpaces,
+ int secondLineOffset ) const;
+
+};
+
+
+inline void StdOutput::version(CmdLineInterface& _cmd)
+{
+ std::string progName = _cmd.getProgramName();
+ std::string xversion = _cmd.getVersion();
+
+ std::cout << std::endl << progName << " version: "
+ << xversion << std::endl << std::endl;
+}
+
+inline void StdOutput::usage(CmdLineInterface& _cmd )
+{
+ std::cout << std::endl << "USAGE: " << std::endl << std::endl;
+
+ _shortUsage( _cmd, std::cout );
+
+ std::cout << std::endl << std::endl << "Where: " << std::endl << std::endl;
+
+ _longUsage( _cmd, std::cout );
+
+ std::cout << std::endl;
+
+}
+
+inline void StdOutput::failure( CmdLineInterface& _cmd,
+ ArgException& e )
+{
+ std::string progName = _cmd.getProgramName();
+
+ std::cerr << "PARSE ERROR: " << e.argId() << std::endl
+ << " " << e.error() << std::endl << std::endl;
+
+ if ( _cmd.hasHelpAndVersion() )
+ {
+ std::cerr << "Brief USAGE: " << std::endl;
+
+ _shortUsage( _cmd, std::cerr );
+
+ std::cerr << std::endl << "For complete USAGE and HELP type: "
+ << std::endl << " " << progName << " "
+ << Arg::nameStartString() << "help"
+ << std::endl << std::endl;
+ }
+ else
+ usage(_cmd);
+
+ throw ExitException(1);
+}
+
+inline void
+StdOutput::_shortUsage( CmdLineInterface& _cmd,
+ std::ostream& os ) const
+{
+ std::list argList = _cmd.getArgList();
+ std::string progName = _cmd.getProgramName();
+ XorHandler xorHandler = _cmd.getXorHandler();
+ std::vector< std::vector > xorList = xorHandler.getXorList();
+
+ std::string s = progName + " ";
+
+ // first the xor
+ for ( int i = 0; static_cast(i) < xorList.size(); i++ )
+ {
+ s += " {";
+ for ( ArgVectorIterator it = xorList[i].begin();
+ it != xorList[i].end(); it++ )
+ s += (*it)->shortID() + "|";
+
+ s[s.length()-1] = '}';
+ }
+
+ // then the rest
+ for (ArgListIterator it = argList.begin(); it != argList.end(); it++)
+ if ( !xorHandler.contains( (*it) ) )
+ s += " " + (*it)->shortID();
+
+ // if the program name is too long, then adjust the second line offset
+ int secondLineOffset = static_cast(progName.length()) + 2;
+ if ( secondLineOffset > 75/2 )
+ secondLineOffset = static_cast(75/2);
+
+ spacePrint( os, s, 75, 3, secondLineOffset );
+}
+
+inline void
+StdOutput::_longUsage( CmdLineInterface& _cmd,
+ std::ostream& os ) const
+{
+ std::list argList = _cmd.getArgList();
+ std::string message = _cmd.getMessage();
+ XorHandler xorHandler = _cmd.getXorHandler();
+ std::vector< std::vector > xorList = xorHandler.getXorList();
+
+ // first the xor
+ for ( int i = 0; static_cast(i) < xorList.size(); i++ )
+ {
+ for ( ArgVectorIterator it = xorList[i].begin();
+ it != xorList[i].end();
+ it++ )
+ {
+ spacePrint( os, (*it)->longID(), 75, 3, 3 );
+ spacePrint( os, (*it)->getDescription(), 75, 5, 0 );
+
+ if ( it+1 != xorList[i].end() )
+ spacePrint(os, "-- OR --", 75, 9, 0);
+ }
+ os << std::endl << std::endl;
+ }
+
+ // then the rest
+ for (ArgListIterator it = argList.begin(); it != argList.end(); it++)
+ if ( !xorHandler.contains( (*it) ) )
+ {
+ spacePrint( os, (*it)->longID(), 75, 3, 3 );
+ spacePrint( os, (*it)->getDescription(), 75, 5, 0 );
+ os << std::endl;
+ }
+
+ os << std::endl;
+
+ spacePrint( os, message, 75, 3, 0 );
+}
+
+inline void StdOutput::spacePrint( std::ostream& os,
+ const std::string& s,
+ int maxWidth,
+ int indentSpaces,
+ int secondLineOffset ) const
+{
+ int len = static_cast(s.length());
+
+ if ( (len + indentSpaces > maxWidth) && maxWidth > 0 )
+ {
+ int allowedLen = maxWidth - indentSpaces;
+ int start = 0;
+ while ( start < len )
+ {
+ // find the substring length
+ // int stringLen = std::min( len - start, allowedLen );
+ // doing it this way to support a VisualC++ 2005 bug
+ using namespace std;
+ int stringLen = min( len - start, allowedLen );
+
+ // trim the length so it doesn't end in middle of a word
+ if ( stringLen == allowedLen )
+ while ( stringLen >= 0 &&
+ s[stringLen+start] != ' ' &&
+ s[stringLen+start] != ',' &&
+ s[stringLen+start] != '|' )
+ stringLen--;
+
+ // ok, the word is longer than the line, so just split
+ // wherever the line ends
+ if ( stringLen <= 0 )
+ stringLen = allowedLen;
+
+ // check for newlines
+ for ( int i = 0; i < stringLen; i++ )
+ if ( s[start+i] == '\n' )
+ stringLen = i+1;
+
+ // print the indent
+ for ( int i = 0; i < indentSpaces; i++ )
+ os << " ";
+
+ if ( start == 0 )
+ {
+ // handle second line offsets
+ indentSpaces += secondLineOffset;
+
+ // adjust allowed len
+ allowedLen -= secondLineOffset;
+ }
+
+ os << s.substr(start,stringLen) << std::endl;
+
+ // so we don't start a line with a space
+ while ( s[stringLen+start] == ' ' && start < len )
+ start++;
+
+ start += stringLen;
+ }
+ }
+ else
+ {
+ for ( int i = 0; i < indentSpaces; i++ )
+ os << " ";
+ os << s << std::endl;
+ }
+}
+
+} //namespace TCLAP
+#endif
diff --git a/funasr/runtime/onnxruntime/include/tclap/SwitchArg.h b/funasr/runtime/onnxruntime/include/tclap/SwitchArg.h
new file mode 100644
index 000000000..4ca130da4
--- /dev/null
+++ b/funasr/runtime/onnxruntime/include/tclap/SwitchArg.h
@@ -0,0 +1,273 @@
+// -*- Mode: c++; c-basic-offset: 4; tab-width: 4; -*-
+
+/******************************************************************************
+ *
+ * file: SwitchArg.h
+ *
+ * Copyright (c) 2003, Michael E. Smoot .
+ * Copyright (c) 2004, Michael E. Smoot, Daniel Aarno.
+ * Copyright (c) 2017, Google LLC
+ * All rights reserved.
+ *
+ * See the file COPYING in the top directory of this distribution for
+ * more information.
+ *
+ * THE SOFTWARE IS PROVIDED _AS IS_, WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ *****************************************************************************/
+
+
+#ifndef TCLAP_SWITCH_ARG_H
+#define TCLAP_SWITCH_ARG_H
+
+#include
+#include
+
+#include
+
+namespace TCLAP {
+
+/**
+ * A simple switch argument. If the switch is set on the command line, then
+ * the getValue method will return the opposite of the default value for the
+ * switch.
+ */
+class SwitchArg : public Arg
+{
+protected:
+
+ /**
+ * The value of the switch.
+ */
+ bool _value;
+
+ /**
+ * Used to support the reset() method so that ValueArg can be
+ * reset to their constructed value.
+ */
+ bool _default;
+
+public:
+
+ /**
+ * SwitchArg constructor.
+ * \param flag - The one character flag that identifies this
+ * argument on the command line.
+ * \param name - A one word name for the argument. Can be
+ * used as a long flag on the command line.
+ * \param desc - A description of what the argument is for or
+ * does.
+ * \param def - The default value for this Switch.
+ * \param v - An optional visitor. You probably should not
+ * use this unless you have a very good reason.
+ */
+ SwitchArg(const std::string& flag,
+ const std::string& name,
+ const std::string& desc,
+ bool def = false,
+ Visitor* v = NULL);
+
+
+ /**
+ * SwitchArg constructor.
+ * \param flag - The one character flag that identifies this
+ * argument on the command line.
+ * \param name - A one word name for the argument. Can be
+ * used as a long flag on the command line.
+ * \param desc - A description of what the argument is for or
+ * does.
+ * \param parser - A CmdLine parser object to add this Arg to
+ * \param def - The default value for this Switch.
+ * \param v - An optional visitor. You probably should not
+ * use this unless you have a very good reason.
+ */
+ SwitchArg(const std::string& flag,
+ const std::string& name,
+ const std::string& desc,
+ CmdLineInterface& parser,
+ bool def = false,
+ Visitor* v = NULL);
+
+
+ /**
+ * Handles the processing of the argument.
+ * This re-implements the Arg version of this method to set the
+ * _value of the argument appropriately.
+ * \param i - Pointer the the current argument in the list.
+ * \param args - Mutable list of strings. Passed
+ * in from main().
+ */
+ virtual bool processArg(int* i, std::vector& args);
+
+ /**
+ * Checks a string to see if any of the chars in the string
+ * match the flag for this Switch.
+ */
+ bool combinedSwitchesMatch(std::string& combined);
+
+ /**
+ * Returns bool, whether or not the switch has been set.
+ */
+ bool getValue() const { return _value; }
+
+ /**
+ * A SwitchArg can be used as a boolean, indicating
+ * whether or not the switch has been set. This is the
+ * same as calling getValue()
+ */
+ operator bool() const { return _value; }
+
+ virtual void reset();
+
+private:
+ /**
+ * Checks to see if we've found the last match in
+ * a combined string.
+ */
+ bool lastCombined(std::string& combined);
+
+ /**
+ * Does the common processing of processArg.
+ */
+ void commonProcessing();
+};
+
+//////////////////////////////////////////////////////////////////////
+//BEGIN SwitchArg.cpp
+//////////////////////////////////////////////////////////////////////
+inline SwitchArg::SwitchArg(const std::string& flag,
+ const std::string& name,
+ const std::string& desc,
+ bool default_val,
+ Visitor* v )
+ : Arg(flag, name, desc, false, false, v),
+ _value( default_val ),
+ _default( default_val )
+{ }
+
+inline SwitchArg::SwitchArg(const std::string& flag,
+ const std::string& name,
+ const std::string& desc,
+ CmdLineInterface& parser,
+ bool default_val,
+ Visitor* v )
+ : Arg(flag, name, desc, false, false, v),
+ _value( default_val ),
+ _default(default_val)
+{
+ parser.add( this );
+}
+
+inline bool SwitchArg::lastCombined(std::string& combinedSwitches )
+{
+ for ( unsigned int i = 1; i < combinedSwitches.length(); i++ )
+ if ( combinedSwitches[i] != Arg::blankChar() )
+ return false;
+
+ return true;
+}
+
+inline bool SwitchArg::combinedSwitchesMatch(std::string& combinedSwitches )
+{
+ // make sure this is actually a combined switch
+ if ( combinedSwitches.length() > 0 &&
+ combinedSwitches[0] != Arg::flagStartString()[0] )
+ return false;
+
+ // make sure it isn't a long name
+ if ( combinedSwitches.substr( 0, Arg::nameStartString().length() ) ==
+ Arg::nameStartString() )
+ return false;
+
+ // make sure the delimiter isn't in the string
+ if ( combinedSwitches.find_first_of(Arg::delimiter()) != std::string::npos)
+ return false;
+
+ // ok, we're not specifying a ValueArg, so we know that we have
+ // a combined switch list.
+ for ( unsigned int i = 1; i < combinedSwitches.length(); i++ )
+ if ( _flag.length() > 0 &&
+ combinedSwitches[i] == _flag[0] &&
+ _flag[0] != Arg::flagStartString()[0] )
+ {
+ // update the combined switches so this one is no longer present
+ // this is necessary so that no unlabeled args are matched
+ // later in the processing.
+ //combinedSwitches.erase(i,1);
+ combinedSwitches[i] = Arg::blankChar();
+ return true;
+ }
+
+ // none of the switches passed in the list match.
+ return false;
+}
+
+inline void SwitchArg::commonProcessing()
+{
+ if ( _xorSet )
+ throw(CmdLineParseException(
+ "Mutually exclusive argument already set!", toString()));
+
+ if ( _alreadySet )
+ throw(CmdLineParseException("Argument already set!", toString()));
+
+ _alreadySet = true;
+
+ if ( _value == true )
+ _value = false;
+ else
+ _value = true;
+
+ _checkWithVisitor();
+}
+
+inline bool SwitchArg::processArg(int *i, std::vector& args)
+{
+ if ( _ignoreable && Arg::ignoreRest() )
+ return false;
+
+ // if the whole string matches the flag or name string
+ if ( argMatches( args[*i] ) )
+ {
+ commonProcessing();
+
+ return true;
+ }
+ // if a substring matches the flag as part of a combination
+ else if ( combinedSwitchesMatch( args[*i] ) )
+ {
+ // check again to ensure we don't misinterpret
+ // this as a MultiSwitchArg
+ if ( combinedSwitchesMatch( args[*i] ) )
+ throw(CmdLineParseException("Argument already set!",
+ toString()));
+
+ commonProcessing();
+
+ // We only want to return true if we've found the last combined
+ // match in the string, otherwise we return true so that other
+ // switches in the combination will have a chance to match.
+ return lastCombined( args[*i] );
+ }
+ else
+ return false;
+}
+
+inline void SwitchArg::reset()
+{
+ Arg::reset();
+ _value = _default;
+}
+//////////////////////////////////////////////////////////////////////
+//End SwitchArg.cpp
+//////////////////////////////////////////////////////////////////////
+
+} //namespace TCLAP
+
+#endif
diff --git a/funasr/runtime/onnxruntime/include/tclap/UnlabeledMultiArg.h b/funasr/runtime/onnxruntime/include/tclap/UnlabeledMultiArg.h
new file mode 100644
index 000000000..48feb84ed
--- /dev/null
+++ b/funasr/runtime/onnxruntime/include/tclap/UnlabeledMultiArg.h
@@ -0,0 +1,304 @@
+// -*- Mode: c++; c-basic-offset: 4; tab-width: 4; -*-
+
+
+/******************************************************************************
+ *
+ * file: UnlabeledMultiArg.h
+ *
+ * Copyright (c) 2003, Michael E. Smoot.
+ * Copyright (c) 2017, Google LLC
+ * All rights reserved.
+ *
+ * See the file COPYING in the top directory of this distribution for
+ * more information.
+ *
+ * THE SOFTWARE IS PROVIDED _AS IS_, WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ *****************************************************************************/
+
+
+#ifndef TCLAP_MULTIPLE_UNLABELED_ARGUMENT_H
+#define TCLAP_MULTIPLE_UNLABELED_ARGUMENT_H
+
+#include
+#include
+
+#include
+#include
+
+namespace TCLAP {
+
+/**
+ * Just like a MultiArg, except that the arguments are unlabeled. Basically,
+ * this Arg will slurp up everything that hasn't been matched to another
+ * Arg.
+ */
+template
+class UnlabeledMultiArg : public MultiArg
+{
+
+ // If compiler has two stage name lookup (as gcc >= 3.4 does)
+ // this is required to prevent undef. symbols
+ using MultiArg::_ignoreable;
+ using MultiArg::_hasBlanks;
+ using MultiArg::_extractValue;
+ using MultiArg::_typeDesc;
+ using MultiArg::_name;
+ using MultiArg::_description;
+ using MultiArg::_alreadySet;
+ using MultiArg::toString;
+
+ public:
+
+ /**
+ * Constructor.
+ * \param name - The name of the Arg. Note that this is used for
+ * identification, not as a long flag.
+ * \param desc - A description of what the argument is for or
+ * does.
+ * \param req - Whether the argument is required on the command
+ * line.
+ * \param typeDesc - A short, human readable description of the
+ * type that this object expects. This is used in the generation
+ * of the USAGE statement. The goal is to be helpful to the end user
+ * of the program.
+ * \param ignoreable - Whether or not this argument can be ignored
+ * using the "--" flag.
+ * \param v - An optional visitor. You probably should not
+ * use this unless you have a very good reason.
+ */
+ UnlabeledMultiArg( const std::string& name,
+ const std::string& desc,
+ bool req,
+ const std::string& typeDesc,
+ bool ignoreable = false,
+ Visitor* v = NULL );
+ /**
+ * Constructor.
+ * \param name - The name of the Arg. Note that this is used for
+ * identification, not as a long flag.
+ * \param desc - A description of what the argument is for or
+ * does.
+ * \param req - Whether the argument is required on the command
+ * line.
+ * \param typeDesc - A short, human readable description of the
+ * type that this object expects. This is used in the generation
+ * of the USAGE statement. The goal is to be helpful to the end user
+ * of the program.
+ * \param parser - A CmdLine parser object to add this Arg to
+ * \param ignoreable - Whether or not this argument can be ignored
+ * using the "--" flag.
+ * \param v - An optional visitor. You probably should not
+ * use this unless you have a very good reason.
+ */
+ UnlabeledMultiArg( const std::string& name,
+ const std::string& desc,
+ bool req,
+ const std::string& typeDesc,
+ CmdLineInterface& parser,
+ bool ignoreable = false,
+ Visitor* v = NULL );
+
+ /**
+ * Constructor.
+ * \param name - The name of the Arg. Note that this is used for
+ * identification, not as a long flag.
+ * \param desc - A description of what the argument is for or
+ * does.
+ * \param req - Whether the argument is required on the command
+ * line.
+ * \param constraint - A pointer to a Constraint object used
+ * to constrain this Arg.
+ * \param ignoreable - Whether or not this argument can be ignored
+ * using the "--" flag.
+ * \param v - An optional visitor. You probably should not
+ * use this unless you have a very good reason.
+ */
+ UnlabeledMultiArg( const std::string& name,
+ const std::string& desc,
+ bool req,
+ Constraint* constraint,
+ bool ignoreable = false,
+ Visitor* v = NULL );
+
+ /**
+ * Constructor.
+ * \param name - The name of the Arg. Note that this is used for
+ * identification, not as a long flag.
+ * \param desc - A description of what the argument is for or
+ * does.
+ * \param req - Whether the argument is required on the command
+ * line.
+ * \param constraint - A pointer to a Constraint object used
+ * to constrain this Arg.
+ * \param parser - A CmdLine parser object to add this Arg to
+ * \param ignoreable - Whether or not this argument can be ignored
+ * using the "--" flag.
+ * \param v - An optional visitor. You probably should not
+ * use this unless you have a very good reason.
+ */
+ UnlabeledMultiArg( const std::string& name,
+ const std::string& desc,
+ bool req,
+ Constraint* constraint,
+ CmdLineInterface& parser,
+ bool ignoreable = false,
+ Visitor* v = NULL );
+
+ /**
+ * Handles the processing of the argument.
+ * This re-implements the Arg version of this method to set the
+ * _value of the argument appropriately. It knows the difference
+ * between labeled and unlabeled.
+ * \param i - Pointer the the current argument in the list.
+ * \param args - Mutable list of strings. Passed from main().
+ */
+ virtual bool processArg(int* i, std::vector& args);
+
+ /**
+ * Returns the a short id string. Used in the usage.
+ * \param val - value to be used.
+ */
+ virtual std::string shortID(const std::string& val="val") const;
+
+ /**
+ * Returns the a long id string. Used in the usage.
+ * \param val - value to be used.
+ */
+ virtual std::string longID(const std::string& val="val") const;
+
+ /**
+ * Operator ==.
+ * \param a - The Arg to be compared to this.
+ */
+ virtual bool operator==(const Arg& a) const;
+
+ /**
+ * Pushes this to back of list rather than front.
+ * \param argList - The list this should be added to.
+ */
+ virtual void addToList( std::list& argList ) const;
+};
+
+template
+UnlabeledMultiArg::UnlabeledMultiArg(const std::string& name,
+ const std::string& desc,
+ bool req,
+ const std::string& typeDesc,
+ bool ignoreable,
+ Visitor* v)
+: MultiArg("", name, desc, req, typeDesc, v)
+{
+ _ignoreable = ignoreable;
+ OptionalUnlabeledTracker::check(true, toString());
+}
+
+template
+UnlabeledMultiArg::UnlabeledMultiArg(const std::string& name,
+ const std::string& desc,
+ bool req,
+ const std::string& typeDesc,
+ CmdLineInterface& parser,
+ bool ignoreable,
+ Visitor* v)
+: MultiArg("", name, desc, req, typeDesc, v)
+{
+ _ignoreable = ignoreable;
+ OptionalUnlabeledTracker::check(true, toString());
+ parser.add( this );
+}
+
+
+template