This commit is contained in:
2025-09-06 17:25:13 +08:00
parent b9de5438ec
commit 074c4b9384
9 changed files with 350 additions and 84 deletions

257
dsLightRag/KeDaXunFei/1.xml Normal file
View File

@@ -0,0 +1,257 @@
<?xml version="1.0" encoding="UTF-8"?>
<xml_result>
<read_sentence lan="cn" type="study" version="7,0,0,1024">
<rec_paper>
<read_sentence accuracy_score="3.262373" beg_pos="0" content="大家好。很高兴认识你们。今天天气很好。我正在使用这个工具练习中文发音。" emotion_score="3.634518" end_pos="2597" except_info="28676" fluency_score="0.826676" integrity_score="19.354837" is_rejected="true" phone_score="5.322581" time_len="2597" tone_score="22.580650" total_score="2.362523">
<sentence beg_pos="0" content="大家好" end_pos="903" fluency_score="0.000000" phone_score="5.000001" time_len="903" tone_score="9.999998" total_score="3.771080">
<word beg_pos="0" content="大" end_pos="80" symbol="da4" time_len="80">
<syll beg_pos="0" content="sil" dp_message="0" end_pos="62" rec_node_type="sil" time_len="62">
<phone beg_pos="0" content="sil" dp_message="0" end_pos="62" rec_node_type="sil" time_len="62"></phone>
</syll>
<syll beg_pos="62" content="大" dp_message="0" end_pos="80" rec_node_type="paper" symbol="da4" time_len="18">
<phone beg_pos="62" content="d" dp_message="0" end_pos="75" is_yun="0" perr_level_msg="3" perr_msg="1" rec_node_type="paper" time_len="13"></phone>
<phone beg_pos="75" content="a" dp_message="0" end_pos="80" is_yun="1" mono_tone="TONE4" perr_level_msg="3" perr_msg="3" rec_node_type="paper" time_len="5"></phone>
</syll>
</word>
<word beg_pos="80" content="家" end_pos="498" symbol="jia1" time_len="418">
<syll beg_pos="80" content="sil" dp_message="0" end_pos="90" rec_node_type="sil" time_len="10">
<phone beg_pos="80" content="sil" dp_message="0" end_pos="90" rec_node_type="sil" time_len="10"></phone>
</syll>
<syll beg_pos="90" content="fil" dp_message="32" end_pos="126" rec_node_type="fil" time_len="36">
<phone beg_pos="90" content="fil" dp_message="32" end_pos="126" rec_node_type="fil" time_len="36"></phone>
</syll>
<syll beg_pos="126" content="sil" dp_message="0" end_pos="448" rec_node_type="sil" time_len="322">
<phone beg_pos="126" content="sil" dp_message="0" end_pos="448" rec_node_type="sil" time_len="322"></phone>
</syll>
<syll beg_pos="448" content="fil" dp_message="32" end_pos="464" rec_node_type="fil" time_len="16">
<phone beg_pos="448" content="fil" dp_message="32" end_pos="464" rec_node_type="fil" time_len="16"></phone>
</syll>
<syll beg_pos="464" content="sil" dp_message="0" end_pos="489" rec_node_type="sil" time_len="25">
<phone beg_pos="464" content="sil" dp_message="0" end_pos="489" rec_node_type="sil" time_len="25"></phone>
</syll>
<syll beg_pos="489" content="家" dp_message="0" end_pos="498" rec_node_type="paper" symbol="jia1" time_len="9">
<phone beg_pos="489" content="j" dp_message="0" end_pos="492" is_yun="0" perr_level_msg="3" perr_msg="1" rec_node_type="paper" time_len="3"></phone>
<phone beg_pos="492" content="ia" dp_message="0" end_pos="498" is_yun="1" mono_tone="TONE1" perr_level_msg="3" perr_msg="3" rec_node_type="paper" time_len="6"></phone>
</syll>
</word>
<word beg_pos="498" content="好" end_pos="903" symbol="hao3" time_len="405">
<syll beg_pos="498" content="sil" dp_message="0" end_pos="874" rec_node_type="sil" time_len="376">
<phone beg_pos="498" content="sil" dp_message="0" end_pos="874" rec_node_type="sil" time_len="376"></phone>
</syll>
<syll beg_pos="874" content="好" dp_message="0" end_pos="903" rec_node_type="paper" symbol="hao3" time_len="29">
<phone beg_pos="874" content="h" dp_message="0" end_pos="898" is_yun="0" perr_level_msg="1" perr_msg="0" rec_node_type="paper" time_len="24"></phone>
<phone beg_pos="898" content="ao" dp_message="0" end_pos="903" is_yun="1" mono_tone="TONE3" perr_level_msg="3" perr_msg="1" rec_node_type="paper" time_len="5"></phone>
</syll>
</word>
</sentence>
<sentence beg_pos="903" content="很高兴认识你们" end_pos="1502" fluency_score="0.000000" phone_score="10.714286" time_len="1502" tone_score="12.857141" total_score="3.771080">
<word beg_pos="903" content="很" end_pos="1020" symbol="hen3" time_len="117">
<syll beg_pos="903" content="sil" dp_message="0" end_pos="972" rec_node_type="sil" time_len="69">
<phone beg_pos="903" content="sil" dp_message="0" end_pos="972" rec_node_type="sil" time_len="69"></phone>
</syll>
<syll beg_pos="972" content="很" dp_message="0" end_pos="1020" rec_node_type="paper" symbol="hen3" time_len="48">
<phone beg_pos="972" content="h" dp_message="0" end_pos="999" is_yun="0" perr_level_msg="1" perr_msg="0" rec_node_type="paper" time_len="27"></phone>
<phone beg_pos="999" content="en" dp_message="0" end_pos="1020" is_yun="1" mono_tone="TONE3" perr_level_msg="2" perr_msg="0" rec_node_type="paper" time_len="21"></phone>
</syll>
</word>
<word beg_pos="1020" content="高" end_pos="1028" symbol="gao1" time_len="8">
<syll beg_pos="1020" content="高" dp_message="0" end_pos="1028" rec_node_type="paper" symbol="gao1" time_len="8">
<phone beg_pos="1020" content="g" dp_message="0" end_pos="1023" is_yun="0" perr_level_msg="3" perr_msg="1" rec_node_type="paper" time_len="3"></phone>
<phone beg_pos="1023" content="ao" dp_message="0" end_pos="1028" is_yun="1" mono_tone="TONE1" perr_level_msg="3" perr_msg="3" rec_node_type="paper" time_len="5"></phone>
</syll>
</word>
<word beg_pos="1028" content="兴" end_pos="1401" symbol="xing4" time_len="373">
<syll beg_pos="1028" content="sil" dp_message="0" end_pos="1378" rec_node_type="sil" time_len="350">
<phone beg_pos="1028" content="sil" dp_message="0" end_pos="1378" rec_node_type="sil" time_len="350"></phone>
</syll>
<syll beg_pos="1378" content="兴" dp_message="0" end_pos="1401" rec_node_type="paper" symbol="xing4" time_len="23">
<phone beg_pos="1378" content="x" dp_message="0" end_pos="1381" is_yun="0" perr_level_msg="3" perr_msg="1" rec_node_type="paper" time_len="3"></phone>
<phone beg_pos="1381" content="ing" dp_message="0" end_pos="1401" is_yun="1" mono_tone="TONE4" perr_level_msg="3" perr_msg="3" rec_node_type="paper" time_len="20"></phone>
</syll>
</word>
<word beg_pos="1401" content="认" end_pos="1429" symbol="ren4" time_len="28">
<syll beg_pos="1401" content="sil" dp_message="0" end_pos="1421" rec_node_type="sil" time_len="20">
<phone beg_pos="1401" content="sil" dp_message="0" end_pos="1421" rec_node_type="sil" time_len="20"></phone>
</syll>
<syll beg_pos="1421" content="认" dp_message="0" end_pos="1429" rec_node_type="paper" symbol="ren4" time_len="8">
<phone beg_pos="1421" content="r" dp_message="0" end_pos="1424" is_yun="0" perr_level_msg="3" perr_msg="1" rec_node_type="paper" time_len="3"></phone>
<phone beg_pos="1424" content="en" dp_message="0" end_pos="1429" is_yun="1" mono_tone="TONE4" perr_level_msg="2" perr_msg="2" rec_node_type="paper" time_len="5"></phone>
</syll>
</word>
<word beg_pos="1429" content="识" end_pos="1429" symbol="shi7" time_len="0">
<syll beg_pos="1429" content="识" dp_message="16" end_pos="1429" rec_node_type="paper" symbol="shi0" time_len="0">
<phone content="sh" dp_message="16" is_yun="0" perr_msg="16" rec_node_type="paper"></phone>
<phone content="iii" dp_message="16" is_yun="1" mono_tone="TONE0" perr_msg="16" rec_node_type="paper"></phone>
</syll>
</word>
<word beg_pos="1429" content="你" end_pos="1467" symbol="ni3" time_len="38">
<syll beg_pos="1429" content="你" dp_message="0" end_pos="1467" rec_node_type="paper" symbol="ni3" time_len="38">
<phone beg_pos="1429" content="n" dp_message="0" end_pos="1462" is_yun="0" perr_level_msg="1" perr_msg="0" rec_node_type="paper" time_len="33"></phone>
<phone beg_pos="1462" content="i" dp_message="0" end_pos="1467" is_yun="1" mono_tone="TONE3" perr_level_msg="3" perr_msg="1" rec_node_type="paper" time_len="5"></phone>
</syll>
</word>
<word beg_pos="1467" content="们" end_pos="1502" symbol="men5" time_len="35">
<syll beg_pos="1467" content="们" dp_message="0" end_pos="1502" rec_node_type="paper" symbol="men0" time_len="35">
<phone beg_pos="1467" content="m" dp_message="0" end_pos="1470" is_yun="0" perr_level_msg="3" perr_msg="1" rec_node_type="paper" time_len="3"></phone>
<phone beg_pos="1470" content="en" dp_message="0" end_pos="1502" is_yun="1" mono_tone="TONE0" perr_level_msg="1" perr_msg="0" rec_node_type="paper" time_len="32"></phone>
</syll>
</word>
</sentence>
<sentence beg_pos="1502" content="今天天气很好" end_pos="1505" fluency_score="0.000000" phone_score="0.000000" time_len="1505" tone_score="0.000000" total_score="0.000000">
<word beg_pos="1502" content="今" end_pos="1505" symbol="jin1" time_len="3">
<syll beg_pos="1502" content="sil" dp_message="0" end_pos="1505" rec_node_type="sil" time_len="3">
<phone beg_pos="1502" content="sil" dp_message="0" end_pos="1505" rec_node_type="sil" time_len="3"></phone>
</syll>
<syll beg_pos="1505" content="今" dp_message="16" end_pos="1505" rec_node_type="paper" symbol="jin1" time_len="0">
<phone content="j" dp_message="16" is_yun="0" perr_msg="16" rec_node_type="paper"></phone>
<phone content="in" dp_message="16" is_yun="1" mono_tone="TONE1" perr_msg="16" rec_node_type="paper"></phone>
</syll>
</word>
<word beg_pos="1505" content="天" end_pos="1505" symbol="tian1" time_len="0">
<syll beg_pos="1505" content="天" dp_message="16" end_pos="1505" rec_node_type="paper" symbol="tian1" time_len="0">
<phone content="t" dp_message="16" is_yun="0" perr_msg="16" rec_node_type="paper"></phone>
<phone content="ian" dp_message="16" is_yun="1" mono_tone="TONE1" perr_msg="16" rec_node_type="paper"></phone>
</syll>
</word>
<word beg_pos="1505" content="天" end_pos="1505" symbol="tian1" time_len="0">
<syll beg_pos="1505" content="天" dp_message="16" end_pos="1505" rec_node_type="paper" symbol="tian1" time_len="0">
<phone content="t" dp_message="16" is_yun="0" perr_msg="16" rec_node_type="paper"></phone>
<phone content="ian" dp_message="16" is_yun="1" mono_tone="TONE1" perr_msg="16" rec_node_type="paper"></phone>
</syll>
</word>
<word beg_pos="1505" content="气" end_pos="1505" symbol="qi9" time_len="0">
<syll beg_pos="1505" content="气" dp_message="16" end_pos="1505" rec_node_type="paper" symbol="qi0" time_len="0">
<phone content="q" dp_message="16" is_yun="0" perr_msg="16" rec_node_type="paper"></phone>
<phone content="i" dp_message="16" is_yun="1" mono_tone="TONE0" perr_msg="16" rec_node_type="paper"></phone>
</syll>
</word>
<word beg_pos="1505" content="很" end_pos="1505" symbol="hen2" time_len="0">
<syll beg_pos="1505" content="很" dp_message="16" end_pos="1505" rec_node_type="paper" symbol="hen2" time_len="0">
<phone content="h" dp_message="16" is_yun="0" perr_msg="16" rec_node_type="paper"></phone>
<phone content="en" dp_message="16" is_yun="1" mono_tone="TONE2" perr_msg="16" rec_node_type="paper"></phone>
</syll>
</word>
<word beg_pos="1505" content="好" end_pos="1505" symbol="hao3" time_len="0">
<syll beg_pos="1505" content="好" dp_message="16" end_pos="1505" rec_node_type="paper" symbol="hao3" time_len="0">
<phone content="h" dp_message="16" is_yun="0" perr_msg="16" rec_node_type="paper"></phone>
<phone content="ao" dp_message="16" is_yun="1" mono_tone="TONE3" perr_msg="16" rec_node_type="paper"></phone>
</syll>
</word>
</sentence>
<sentence beg_pos="1505" content="我正在使用这个工具练习中文发音" end_pos="2597" fluency_score="0.000000" phone_score="5.000001" time_len="2597" tone_score="6.000000" total_score="3.771080">
<word beg_pos="1505" content="我" end_pos="1514" symbol="wo3" time_len="9">
<syll beg_pos="1505" content="我" dp_message="0" end_pos="1514" rec_node_type="paper" symbol="wo3" time_len="9">
<phone beg_pos="1505" content="_u" dp_message="0" end_pos="1508" is_yun="0" perr_level_msg="3" perr_msg="1" rec_node_type="paper" time_len="3"></phone>
<phone beg_pos="1508" content="uo" dp_message="0" end_pos="1514" is_yun="1" mono_tone="TONE3" perr_level_msg="2" perr_msg="0" rec_node_type="paper" time_len="6"></phone>
</syll>
</word>
<word beg_pos="1514" content="正" end_pos="1666" symbol="zheng4" time_len="152">
<syll beg_pos="1514" content="sil" dp_message="0" end_pos="1617" rec_node_type="sil" time_len="103">
<phone beg_pos="1514" content="sil" dp_message="0" end_pos="1617" rec_node_type="sil" time_len="103"></phone>
</syll>
<syll beg_pos="1617" content="正" dp_message="0" end_pos="1666" rec_node_type="paper" symbol="zheng4" time_len="49">
<phone beg_pos="1617" content="zh" dp_message="0" end_pos="1620" is_yun="0" perr_level_msg="2" perr_msg="0" rec_node_type="paper" time_len="3"></phone>
<phone beg_pos="1620" content="eng" dp_message="0" end_pos="1666" is_yun="1" mono_tone="TONE4" perr_level_msg="2" perr_msg="3" rec_node_type="paper" time_len="46"></phone>
</syll>
</word>
<word beg_pos="1666" content="在" end_pos="1884" symbol="zai4" time_len="218">
<syll beg_pos="1666" content="sil" dp_message="0" end_pos="1836" rec_node_type="sil" time_len="170">
<phone beg_pos="1666" content="sil" dp_message="0" end_pos="1836" rec_node_type="sil" time_len="170"></phone>
</syll>
<syll beg_pos="1836" content="在" dp_message="0" end_pos="1884" rec_node_type="paper" symbol="zai4" time_len="48">
<phone beg_pos="1836" content="z" dp_message="0" end_pos="1839" is_yun="0" perr_level_msg="3" perr_msg="1" rec_node_type="paper" time_len="3"></phone>
<phone beg_pos="1839" content="ai" dp_message="0" end_pos="1884" is_yun="1" mono_tone="TONE4" perr_level_msg="1" perr_msg="0" rec_node_type="paper" time_len="45"></phone>
</syll>
</word>
<word beg_pos="1884" content="使" end_pos="2087" symbol="shi3" time_len="203">
<syll beg_pos="1884" content="sil" dp_message="0" end_pos="1910" rec_node_type="sil" time_len="26">
<phone beg_pos="1884" content="sil" dp_message="0" end_pos="1910" rec_node_type="sil" time_len="26"></phone>
</syll>
<syll beg_pos="1910" content="fil" dp_message="32" end_pos="1918" rec_node_type="fil" time_len="8">
<phone beg_pos="1910" content="fil" dp_message="32" end_pos="1918" rec_node_type="fil" time_len="8"></phone>
</syll>
<syll beg_pos="1918" content="sil" dp_message="0" end_pos="2044" rec_node_type="sil" time_len="126">
<phone beg_pos="1918" content="sil" dp_message="0" end_pos="2044" rec_node_type="sil" time_len="126"></phone>
</syll>
<syll beg_pos="2044" content="使" dp_message="0" end_pos="2087" rec_node_type="paper" symbol="shi3" time_len="43">
<phone beg_pos="2044" content="sh" dp_message="0" end_pos="2060" is_yun="0" perr_level_msg="2" perr_msg="0" rec_node_type="paper" time_len="16"></phone>
<phone beg_pos="2060" content="iii" dp_message="0" end_pos="2087" is_yun="1" mono_tone="TONE3" perr_level_msg="2" perr_msg="0" rec_node_type="paper" time_len="27"></phone>
</syll>
</word>
<word beg_pos="2087" content="用" end_pos="2597" symbol="yong4" time_len="510">
<syll beg_pos="2087" content="fil" dp_message="32" end_pos="2146" rec_node_type="fil" time_len="59">
<phone beg_pos="2087" content="fil" dp_message="32" end_pos="2146" rec_node_type="fil" time_len="59"></phone>
</syll>
<syll beg_pos="2146" content="sil" dp_message="0" end_pos="2597" rec_node_type="sil" time_len="451">
<phone beg_pos="2146" content="sil" dp_message="0" end_pos="2597" rec_node_type="sil" time_len="451"></phone>
</syll>
<syll beg_pos="2597" content="用" dp_message="16" end_pos="2597" rec_node_type="paper" symbol="yong4" time_len="0">
<phone content="_i" dp_message="16" is_yun="0" perr_msg="16" rec_node_type="paper"></phone>
<phone content="iong" dp_message="16" is_yun="1" mono_tone="TONE4" perr_msg="16" rec_node_type="paper"></phone>
</syll>
</word>
<word beg_pos="2597" content="这" end_pos="2597" symbol="zhe4" time_len="0">
<syll beg_pos="2597" content="这" dp_message="16" end_pos="2597" rec_node_type="paper" symbol="zhe4" time_len="0">
<phone content="zh" dp_message="16" is_yun="0" perr_msg="16" rec_node_type="paper"></phone>
<phone content="e" dp_message="16" is_yun="1" mono_tone="TONE4" perr_msg="16" rec_node_type="paper"></phone>
</syll>
</word>
<word beg_pos="2597" content="个" end_pos="2597" symbol="ge9" time_len="0">
<syll beg_pos="2597" content="个" dp_message="16" end_pos="2597" rec_node_type="paper" symbol="ge0" time_len="0">
<phone content="g" dp_message="16" is_yun="0" perr_msg="16" rec_node_type="paper"></phone>
<phone content="e" dp_message="16" is_yun="1" mono_tone="TONE0" perr_msg="16" rec_node_type="paper"></phone>
</syll>
</word>
<word beg_pos="2597" content="工" end_pos="2597" symbol="gong1" time_len="0">
<syll beg_pos="2597" content="工" dp_message="16" end_pos="2597" rec_node_type="paper" symbol="gong1" time_len="0">
<phone content="g" dp_message="16" is_yun="0" perr_msg="16" rec_node_type="paper"></phone>
<phone content="ong" dp_message="16" is_yun="1" mono_tone="TONE1" perr_msg="16" rec_node_type="paper"></phone>
</syll>
</word>
<word beg_pos="2597" content="具" end_pos="2597" symbol="ju4" time_len="0">
<syll beg_pos="2597" content="具" dp_message="16" end_pos="2597" rec_node_type="paper" symbol="ju4" time_len="0">
<phone content="j" dp_message="16" is_yun="0" perr_msg="16" rec_node_type="paper"></phone>
<phone content="v" dp_message="16" is_yun="1" mono_tone="TONE4" perr_msg="16" rec_node_type="paper"></phone>
</syll>
</word>
<word beg_pos="2597" content="练" end_pos="2597" symbol="lian4" time_len="0">
<syll beg_pos="2597" content="练" dp_message="16" end_pos="2597" rec_node_type="paper" symbol="lian4" time_len="0">
<phone content="l" dp_message="16" is_yun="0" perr_msg="16" rec_node_type="paper"></phone>
<phone content="ian" dp_message="16" is_yun="1" mono_tone="TONE4" perr_msg="16" rec_node_type="paper"></phone>
</syll>
</word>
<word beg_pos="2597" content="习" end_pos="2597" symbol="xi2" time_len="0">
<syll beg_pos="2597" content="习" dp_message="16" end_pos="2597" rec_node_type="paper" symbol="xi2" time_len="0">
<phone content="x" dp_message="16" is_yun="0" perr_msg="16" rec_node_type="paper"></phone>
<phone content="i" dp_message="16" is_yun="1" mono_tone="TONE2" perr_msg="16" rec_node_type="paper"></phone>
</syll>
</word>
<word beg_pos="2597" content="中" end_pos="2597" symbol="zhong1" time_len="0">
<syll beg_pos="2597" content="中" dp_message="16" end_pos="2597" rec_node_type="paper" symbol="zhong1" time_len="0">
<phone content="zh" dp_message="16" is_yun="0" perr_msg="16" rec_node_type="paper"></phone>
<phone content="ong" dp_message="16" is_yun="1" mono_tone="TONE1" perr_msg="16" rec_node_type="paper"></phone>
</syll>
</word>
<word beg_pos="2597" content="文" end_pos="2597" symbol="wen2" time_len="0">
<syll beg_pos="2597" content="文" dp_message="16" end_pos="2597" rec_node_type="paper" symbol="wen2" time_len="0">
<phone content="_u" dp_message="16" is_yun="0" perr_msg="16" rec_node_type="paper"></phone>
<phone content="uen" dp_message="16" is_yun="1" mono_tone="TONE2" perr_msg="16" rec_node_type="paper"></phone>
</syll>
</word>
<word beg_pos="2597" content="发" end_pos="2597" symbol="fa1" time_len="0">
<syll beg_pos="2597" content="发" dp_message="16" end_pos="2597" rec_node_type="paper" symbol="fa1" time_len="0">
<phone content="f" dp_message="16" is_yun="0" perr_msg="16" rec_node_type="paper"></phone>
<phone content="a" dp_message="16" is_yun="1" mono_tone="TONE1" perr_msg="16" rec_node_type="paper"></phone>
</syll>
</word>
<word beg_pos="2597" content="音" end_pos="2597" symbol="yin1" time_len="0">
<syll beg_pos="2597" content="音" dp_message="16" end_pos="2597" rec_node_type="paper" symbol="yin1" time_len="0">
<phone content="_i" dp_message="16" is_yun="0" perr_msg="16" rec_node_type="paper"></phone>
<phone content="in" dp_message="16" is_yun="1" mono_tone="TONE1" perr_msg="16" rec_node_type="paper"></phone>
</syll>
</word>
</sentence>
</read_sentence>
</rec_paper>
</read_sentence>
</xml_result>

View File

@@ -56,25 +56,75 @@ class XunFeiAudioEvaluator_cn:
return self.host_url + '?' + urlencode(dict_data)
def parse_evaluation_results(self, xml_content):
"""解析评测结果XML并提得分信息整合版"""
try:
root = ET.fromstring(xml_content)
# 查找包含评分数据的节点优先read_chapter兼容read_sentence
score_nodes = root.findall('.//read_chapter') + root.findall('.//read_sentence')
if not score_nodes:
print("未找到评分节点")
return
# 优先使用第一个包含total_score的节点
target_node = None
for node in score_nodes:
if 'total_score' in node.attrib:
target_node = node
break
if not target_node:
print("未找到包含评分数据的有效节点")
return
# 提取核心评分字段
self.evaluation_results = {
'total_score': float(target_node.get('total_score', 0)),
'accuracy_score': float(target_node.get('accuracy_score', 0)),
'fluency_score': float(target_node.get('fluency_score', 0)),
'integrity_score': float(target_node.get('integrity_score', 0)),
'tone_score': float(target_node.get('tone_score', 0)),
'phone_score': float(target_node.get('phone_score', 0)),
'emotion_score': float(target_node.get('emotion_score', 0)),
'is_rejected': target_node.get('is_rejected', 'false') == 'true'
}
# 提取句子级得分
sentences = []
for sent in target_node.findall('.//sentence'):
sentences.append({
'content': sent.get('content', ''),
'total_score': float(sent.get('total_score', 0)),
'fluency_score': float(sent.get('fluency_score', 0))
})
self.evaluation_results['sentences'] = sentences
print(f"解析成功,提取到{len(self.evaluation_results)}个评分字段")
except ET.ParseError as e:
print(f"XML解析失败: {e}, 内容: {xml_content[:200]}")
self.evaluation_results = {'error': f'解析失败: {str(e)}'}
def on_message(self, ws, message):
"""WebSocket消息处理"""
print(f"Received message: {message}")
try:
data = json.loads(message)
if data.get('code') != 0:
self.results = {'error': data.get('message', 'Unknown error')}
self.evaluation_results = {'error': data.get('message', 'Unknown error')}
return
# 修复移除状态码为2的硬性检查只要有数据就解析
inner_data = data.get('data', {})
xml_b64 = inner_data.get('data', '')
if xml_b64:
xml_data = base64.b64decode(xml_b64)
xml_content = xml_data.decode("utf-8")
self.parse_evaluation_results(xml_content) # 确保中文也能进入解析
self.parse_evaluation_results(xml_content) # 直接调用整合后的解析方法
ws.close()
except Exception as e:
print(f"Error processing message: {e}")
self.results = {'error': str(e)}
self.evaluation_results = {'error': str(e)}
# 安全获取data字段
response_data = data.get("data", {})
@@ -164,81 +214,6 @@ class XunFeiAudioEvaluator_cn:
total_sent += len(buffer)
time.sleep(0.04)
def parse_evaluation_results(self, xml_content):
"""解析中文评测XML结果仅处理read_sentence节点"""
try:
root = ET.fromstring(xml_content)
# 中文专用查找read_chapter节点原read_sentence
read_chapter = root.find('.//read_chapter')
if read_chapter is not None:
# 中文评分字段映射(修正节点名称和属性)
self.evaluation_results = {
'total_score': float(read_chapter.get('total_score', 0)),
'accuracy_score': float(read_chapter.get('accuracy_score', 0)),
'fluency_score': float(read_chapter.get('fluency_score', 0)),
'integrity_score': float(read_chapter.get('integrity_score', 0)), # 修正字段名
'tone_score': float(read_chapter.get('tone_score', 0)),
'is_rejected': read_chapter.get('is_rejected', 'false') == 'true'
}
# 提取句子级得分
sentences = []
for sent in read_chapter.findall('.//sentence'):
sentences.append({
'content': sent.get('content', ''),
'total_score': float(sent.get('total_score', 0)),
'fluency_score': float(sent.get('fluency_score', 0))
})
self.evaluation_results['sentences'] = sentences
print(f"中文评测结果解析成功: {self.evaluation_results}")
else:
print(f"未找到中文评分节点: {xml_content[:200]}") # 打印前200字符调试
self.evaluation_results = {'error': '未找到read_sentence节点'}
except ET.ParseError as e:
print(f"XML解析失败: {e}, 内容: {xml_content[:200]}")
self.evaluation_results = {'error': f'解析失败: {str(e)}'}
"""解析评测结果XML并提得分信息"""
try:
print(xml_content)
root = ET.fromstring(xml_content)
# 查找read_chapter节点
read_chapter = root.find('.//read_chapter')
if read_chapter is not None:
# 保持字段名一致使用completeness_score
self.evaluation_results = {
'accuracy_score': float(read_chapter.get('accuracy_score', 0)),
'fluency_score': float(read_chapter.get('fluency_score', 0)),
'completeness_score': float(read_chapter.get('integrity_score', 0)),
'standard_score': float(read_chapter.get('standard_score', 0)),
'total_score': float(read_chapter.get('total_score', 0)),
'word_count': int(read_chapter.get('word_count', 0)),
'is_rejected': read_chapter.get('is_rejected', 'false') == 'true'
}
# 提取句子级别得分
sentence = read_chapter.find('.//sentence')
if sentence is not None:
self.evaluation_results['sentence'] = {
'accuracy_score': float(sentence.get('accuracy_score', 0)),
'fluency_score': float(sentence.get('fluency_score', 0)),
'total_score': float(sentence.get('total_score', 0))
}
# 提取单词级别得分
words = []
for word in read_chapter.findall('.//word'):
word_data = {
'content': word.get('content', ''),
'total_score': float(word.get('total_score', 0)),
'dp_message': int(word.get('dp_message', 0))
}
words.append(word_data)
self.evaluation_results['words'] = words
except ET.ParseError as e:
print(f"XML解析错误: {e}")
def get_evaluation_summary(self):
"""获取评测结果摘要"""
if not self.evaluation_results:

View File

@@ -0,0 +1,28 @@
import os
from XunFeiAudioEvaluator_cn import XunFeiAudioEvaluator_cn
import xml.etree.ElementTree as ET
if __name__ == "__main__":
log_path = r"1.xml"
evaluator = XunFeiAudioEvaluator_cn(None, None, None, None, "") # 使用空字符串代替None作为txt参数
if os.path.exists(log_path):
try:
# 读取XML文件内容
with open(log_path, 'r', encoding='utf-8') as f:
xml_content = f.read()
# 使用XunFeiAudioEvaluator_cn类的解析方法
evaluator.parse_evaluation_results(xml_content)
results = evaluator.evaluation_results
if results and 'total_score' in results:
print("解析成功!以下是评分数据:")
for key, value in results.items():
print(f"{key}: {value}")
else:
print("未找到有效的评分数据")
except Exception as e:
print(f"解析日志时出错:{str(e)}")
else:
print(f"文件不存在:{log_path}")

View File

@@ -39,16 +39,17 @@ async def save_audio(audio: UploadFile = File(...), txt: str = Form(...), langua
# 添加wav转mp3功能
import subprocess
mp3_temp_file = os.path.join(temp_dir, f"temp_{uuid.uuid4().hex}.mp3")
mp3_file_path = os.path.join(temp_dir, f"temp_{uuid.uuid4().hex}.mp3")
try:
# 使用ffmpeg将wav转换为mp3
subprocess.run(
["ffmpeg", "-i", temp_file, "-y", mp3_temp_file],
["ffmpeg", "-i", temp_file, "-ar", "16000", "-ac", "1", "-acodec", "libmp3lame", "-b:a", "128k", "-y",
mp3_file_path],
check=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE
)
logger.info(f"已将wav转换为mp3: {mp3_temp_file}")
logger.info(f"已将wav转换为mp3: {mp3_file_path}")
except subprocess.CalledProcessError as e:
logger.error(f"ffmpeg转换失败: {e.stderr.decode()}")
raise Exception(f"音频格式转换失败: {e.stderr.decode()}")
@@ -59,7 +60,7 @@ async def save_audio(audio: UploadFile = File(...), txt: str = Form(...), langua
appid=XF_APPID,
api_key=XF_APIKEY,
api_secret=XF_APISECRET,
audio_file=mp3_temp_file,
audio_file=mp3_file_path,
language=language, # 使用动态参数
txt=txt
)

View File

@@ -83,4 +83,9 @@ document.addEventListener('DOMContentLoaded', function() {
// 初始化轮播
initCarousel();
});
});
// 修复前可能存在字段名不匹配问题
$(".accuracy-score").text(response.evaluation.accuracy_score.toFixed(4));
$(".fluency-score").text(response.evaluation.fluency_score.toFixed(4));
$(".total-score").text(response.evaluation.total_score.toFixed(4));