Maintainer:郭奕玮、陈谐老师 2024.03.14
这一听测系统是从BeaqleJS(https://github.com/HSU-ANT/beaqlejs)fork而来,并做了一些改动得到的。现有如下功能:
ssh xlance@4.191.73.44
使用你所知道的密码登录。
⚠️⚠️请避免使用VScode连接此服务器,个人发现偶有崩溃现象。直接在终端连接则一切正常。⚠️⚠️
和服务器之间的文件传输可以通过sftp。例如
sftp xlance@4.191.73.44
# 然后通过put上传,get下载。
该服务器上安装了oh-my-zsh
,上键可进行前缀搜索。
该听测服务的运行依赖于docker实现。运行sudo docker ps -a
,如果出现以下输出,则说明有正在运行的容器,可以进行下一步。
如果没有正在运行的容器,则可以用如下命令启动一个:
sudo docker run -d -p 80:80 -v /home/xlance/beaqlejs:/var/www/html --name server php:7.0-apache
这一命令将服务器的80端口映射到容器内的80端口,从而直接用浏览器访问4.191.73.44即可出现界面。
注意:该服务器上docker命令前须加sudo。
cd beaqlejs # 听测全都在这里
cp -r template yiwei.guo.202403 # 改成自己的“名.姓.当前年月”
上面的命令新建了自己的目录,并将听测的模板进行复制。此时,可在浏览器中直接用4.191.73.44/yiwei.guo.202403进行访问。
⚠️template
是模板目录,请保证其不被修改!⚠️
之后为了方便修改,请将自己的目录(用SFTP等方式)下载到本地,在本地修改、测试完了之后再到服务器部署。
以mos.html
为例,其中第17行
<script src="config/example_config_mos.js" type="text/javascript"></script>
指定了这个测试使用的配置文件。这一配置文件长这样:
x
var TestConfig = {
"TestName": "MOS demo test", // 测试名字。改变它会使得保存下来的听测结果命名不同。
"RateScalePng": "img/mos.png",
"RateScaleBgPng": "img/mos-background.png",
"RateMinValue": 1,
"RateMaxValue": 9, // 打分最大值。MOS听测相当于9档(网站上没实现0.5这样的间隔)。
"RateDefaultValue":0,
"ShowFileIDs": false,
"ShowResults": false,
"LoopByDefault": false,
"EnableABLoop": true,
"EnableOnlineSubmission": true,
"BeaqleServiceURL": "./web_service/beaqleJS_Service.php", // 提交结果相关
"SupervisorContact": "",
"RandomizeTestOrder": false,
"MaxTestsPerRun": 3, // 这个测试有多少轮
"RequireMaxRating": false,
"AudioRoot": "",
"Testsets": [ // 以下开始是样本池,是一个由dict组成的list。
//
{
"Name": "Schubert 1", // 显示在每轮测试上的文本。可以使用HTML语法来改字体、颜色等等。
"TestID": "id1_1",
"Files": {
"1": "audio/schubert_1.wav",
"2": "audio/schubert_2.wav",
"3": "audio/schubert_3.wav",
"4": "audio/schubert_anch.wav",
}
},
// 后面省略
其他测试的配置文件大同小异。因此,需要将你的听测音频放到你目录下的audio/
中,然后填充你的js配置文件,这样听测就能从这些样本中随机抽取。
完成数据和配置修改之后,把对应听测的HTML中内容进行一些替换即可。在这里,请给听测人写一个明确的instruction。随后,如果想使用index.html
这个主页,则对其中的HTML进行相应修改(路径、文本等等)即可。
这一步做完之后可以在本地打开HTML进行听测,看看音频能否正常加载等。但此时尚不能进行结果的自动提交。
将你在本地修改好的目录传到服务器上自己的位置,然后需要按这个命令添加权限:
x
chmod 777 web_service/results
随后,可以自己通过浏览器访问一下你的HTML,看看听测到最后能否成功提交。在服务器上,听测结果被保存在web_service/results/
下,文件名的格式例如20240314-1445_YourName_MOS_demo_test_a06daf1.txt
,即“日期-时间-测试者名字-测试名字-随机数”。
⚠️因此如果有多个同类的测试,比如MOS1、MOS2,请务必在js配置中更改两个测试的名字,以防实验结果混淆⚠️。
到这里便大功告成!
听测如果不再使用,建议在本地备份结果后删除相关数据,以免过多占用服务器空间。
由于目前每个人登上去都是root权限,请在执行危险操作(比如rm
)前三思!
如果你对具体实现感兴趣,或想要实现一个新的听测类型,或遇到bug无从下手,可以阅读这一章节。
在每个测试HTML中,会构造某个听测类的实例,比如mos.html
的第37行:
testHandle = new MushraNoRefTest(TestConfig)
同理还有PrefTest
、MushraTest
、AbxTest
几个类。它们都实现在js/beaqle.js
中,都属于ListeningTest
的子类。js/beaqle.js
实现了听测服务相关的几乎所有内核代码。在每个类中,createTestDOM
函数实现了每一轮听测时的界面,因此每个听测类的这一函数均有不同。如果需要自定义听测类,大概率也需要会写这一函数。
SubmitTestResults
函数是听测提交结果的接口,这里可以看到发送了一个POST请求。这个请求在web_service/beaqleJS_Service.php
中被处理。在这个php文件中,可以看到52行
$filename = date("Ymd-Hi")."_".$username."_".$testname;
即指定了文件名格式。如果想修改格式可以从这里入手。必要时可以修改js/beaqle.js
的841行,即向php传送的数据dict。
xxxxxxxxxx
data: {'testresults':JSON.stringify(EvalResults), 'username':UserObj.UserName, 'testname':this.TestConfig.TestName}
这个听测服务尚未经过广泛“拷打”,可能还有不少问题,欢迎有兴趣的同学来优化代码或服务器管理方式!