表演者走向网络

作者:Patricia Jung

作家、音乐家、画家、电影制作人以及各种艺术家都在使用网络作为平台。只有一种传统的艺术形式在网络空间中尚未形成强大的影响力——戏剧。但是,一旦有人愿意适应这种媒介,一种新的艺术形式就会演变出来,即网络表演。

“网络表演”一词由新西兰表演艺术家海伦·瓦利·杰米森(Helen Varley Jamieson)创造,用来描述“使用互联网将远程表演者聚集在一起,实时进行现场戏剧表演”。她与网络表演团体 Avatar Body Collision 合作多年,使用免费的互联网聊天应用程序在网络空间中创作表演。为了给她、她的合作表演者和观众提供一个基于网络的舞台,她发起了一个名为 UpStage 的开源项目,该项目由道格拉斯·巴格纳尔(Douglas Bagnall)编写(请参阅在线资源)。第一个版本于 2004 年 1 月发布,由新西兰研究、科学和技术部以及新西兰创意基金资助,目前正在寻求资金以继续其开发。

当然,该软件不仅限于在线表演。UpStage 也是在线教学以及产品和其他类型的演示的有趣工具。它甚至可以作为虚拟工作组的协作工具。UpStage 的优势在于其用户友好且高度可访问的界面:玩家和观众都只需要一个标准的浏览器和互联网连接即可参与。新手可以很快学会基础知识,并发现自己可以愉快地进行文本说唱和头像跳跃。

您的剧院需要仔细规划

服务器软件本身是用 Python 编写的,并带有自己的 Web 服务器,使艺术家有机会轻松地设置舞台,无论他们的笔记本电脑位于在线何处。除了需要 Python Twisted 框架的 Web 服务器外,该软件还广泛使用了其他通常安装在 Linux 系统上的开源程序,例如文本到语音系统 Festival、netpbm 工具和 gif2png。有关更多详细信息,请参阅本文的“GIF 问题”边栏。

Linux 发行版通常不附带 swfttools 和 MP3 编码器 lame。语音合成期间使用的 Coroner's Toolkit 中的 timeout 程序通常也不包含在内。但是,如果不怕修改源代码,通常可以省略它。

舞台是一个 Flash 客户端,swfttools 在这里发挥作用。它们将用于舞台装饰和作为头像的 PNG 和 JPEG 转换为 Flash 格式。因此,表演者和观众都需要 Macromedia Flash 插件才能用于他们的 Web 浏览器。基于 KHTML 和 Mozilla 的浏览器可以正常工作,但目前 Opera 并不适用。

不幸的是,在撰写本文时,当前版本的 UpStage 不遵守 PATH 设置。因此,明智的做法是检查上述所有程序是否都位于硬编码到 /bin/sh 中的目录之一中

$ strings /bin/sh | grep -E "/(bin|sbin)"
[...]
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:
/sbin:/bin

如果不是,则应设置适当的链接。否则,错误查找可能会变得棘手,因为 UpStage 并不擅长在每种情况下都提供有意义的错误消息。当使用声音工具时,事情变得更加复杂。尽管 UpStage 在 /usr/local/bin 中使用图形工具,但它不一定在那里找到 lame。因此,对于不打算破解源代码的用户来说,创建一个名为 /usr/bin/lame 的链接似乎是不可避免的。

设置剧院

现在是启动服务器的时候了。解压缩源存档 Upstage-2004-09-28.tar.gz,然后进入新创建的 Upstage 目录。在这里,您可以找到 shell 脚本 go.sh,该脚本尝试杀死文件 Upstage/twistd.pid 中提到的旧 twisted-server 并启动一个新的服务器。因此,当您第一次以非特权用户身份运行以下命令时,不必担心相关的错误消息./go.sh只有在那时,Upstage 才会创建 pid 文件。

出于安全原因,不建议以 root 身份运行 UpStage。这就是为什么服务器使用 1024 以上的非特权端口的原因。可以配置您的 UpStage 服务器运行的端口。如果您不喜欢默认端口 8081,请更改行

WEB_PORT  =  8081

在 Upstage/upstage/config.py 中,然后重新运行./go.sh.

由于 2004 年 9 月版本的 UpStage 缺少服务器用于存储临时 MP3 文件的目录,因此如果您手动创建它,可以省去很多麻烦

mkdir html/speech

现在,将您的本地 Web 浏览器指向以下地址:https://:8081/,您应该最终到达剧院的入口(图 1)。要根据您的需要对其进行自定义,请更改 Upstage/html/index.html 中的 HTML 代码以及相应的样式表 Upstage/html/style/main.css。最好保留相对链接"<a href="/stages"></a>"到舞台——您的观众会感激不尽——以及艺术家的登录名。

Performers Go Web

图 1. 默认入口大厅清楚地显示了该软件的起源。

剧院还为其工作人员设有后门。URL https://:8081/admin 和 https://:8081/login.html 将您直接带到登录对话框,该对话框可以在 Upstage/html/login.html 中更改。

聘请人员

UpStage 的默认剧院导演的名字是 z,z 没有密码。您可能想要更改此设置,因此请登录并输入剧院的导演。使用“添加新玩家”链接,转到 https://:8081/admin/new/player 并添加新导演的姓名和密码。要让他或她成为可以雇佣和解雇的大老板,请确保您勾选了“添加或删除玩家”的权限(图 2)。

Performers Go Web

图 2. LJ 成为大老板。

这个新玩家被写入用户配置文件 Upstage/config/players.xml,如下所示

<player password="551a9c1c68844936b0d182080fe7dcc0"
 name="lj" rights="act,admin,su">
</player>

password 属性不包含实际密码(在本例中为 upstage),而是其 md5sum。如果您想使用您喜欢的文本编辑器添加用户,您可以像这样生成密码

$ echo -n "upstage" | md5sum
551a9c1c68844936b0d182080fe7dcc0  -

name 属性包含玩家的用户名,您可以授予最多三个权限。大老板需要 su 权限。每个应该创建和编辑可以在舞台上看到和使用的东西的人都需要 admin 权限,所有玩家都需要 act 权限。

不幸的是,在删除和编辑用户方面,Web 前端非常不稳定。它不显示正确的权限,不允许您更改它们(即使具有超级用户权限也不行),也不允许您删除用户。如果您在 https://:8081/admin/edit/player/ 中的相关用户条目之前单击复选框,然后按下“以超级用户身份删除玩家”按钮,UpStage 将删除相关玩家,直到会话结束,但不会从 players.xml 中删除他或她。重新启动服务器后,所有玩家都将再次活跃起来。道格拉斯·巴格纳尔(Douglas Bagnall)承诺很快会修复此错误。

GIF 问题

即使您已正确安装 gif2png,2004 年 9 月版本的 UpStage 也无法转换 GIF 图片以用作头像、道具或背景。在新版本可用之前,您可以通过取消注释 Upstage/img2swf.py 中的第 38 行并删除来自行修复此错误"giftopnm" flag "--background "#fff""在第 63 行中。然后,相关行应如下所示

[...]
35 def do_gif(tfn, swf):
[...]
38 #    os.path.remove(png)
[...]
57 def thumbnailer(filetype, tfn, thumb, log):
[...]
63           'image/gif'      :     'giftopnm %s |
pnmscale -height=10 | pnmtojpeg > %s'
修复角色和道具

用户和权限的这些问题不会出现在您的剧院库存中。您可以使用 workshop https://:8081/admin/ URL 添加和编辑舞台、头像(头像符合您表演中的一个角色伪装)、背景幕或舞台设计以及道具。后者可以由您的头像携带,它们始终出现在头像的左上角,例如图 6 中附加到炸弹上的蓝色气泡。

创建新的头像、道具和背景幕时,您有多种选择:二维图片、Flash 动画和视频流。但是,请注意移动图片;它们需要带宽,并且是真正的性能杀手。

视频流必须在本地可用,并且应存储在 Upstage/html/media/ 中。对于 Linux,UpStage 用户手册建议使用 webcamd 作为通过 FTP 上传视频流的软件。不幸的是,webcamd 的原始项目站点似乎已关闭(请参阅资源),但它仍然可以作为二进制文件和 Debian 服务器的源存档获得。

与真实世界的剧院不同,头像、背景幕或道具可以同时分配给多个舞台。这在“管理现有舞台”部分完成(https://:8081/admin/edit/stage/<stagename>/,图 3)。

Performers Go Web

图 3. 尽管库存名称是可点击的,但这些链接不会链接到相关项目的编辑对话框,而是指向 Flash 文件。

舞台的配置数据以 XML 格式存储在 Upstage/config/stages.xml 和 Upstage/config/stages/<stage-id>/config.xml 中。第一个文件列出了所有可用的舞台;后一个文件保存了有关分配给相应舞台的库存的信息。

毋庸置疑,这三种类型的库存都有自己的文本配置文件,即 Upstage/config/props.xml、avatars.xml 和 backdrops.xml。它们都遵循列表 1 中所示的结构。

列表 1. avatars.xml 的结构

configuration file

<avatars>
<avatar url="/media/Pbp9_q8I.swf" voice="ked"
name="huge penguin" file="Pbp9_q8I.swf"
thumbnail="/media/thumb/Pbp9_q8I.jpg">
</avatar>
<avatar url="/media/clock.swf" name="clock"
file="clock.swf" thumbnail="/media/thumb/clock.jpg">
</avatar>
</avatars>

尽管根元素的名称实际上并不重要,但 UpStage 在生成文件时分别使用 avatars、props 和 swamp。重要的是子元素的名称:avatar、prop 和 backdrop。每个子元素都有四个必填属性和一个可选属性,如表 1 所述。

表 1. 舞台库存和头像元素的属性

属性
url相关 Flash 文件的路径,从 Upstage/html 下的媒体目录开始。UpStage 生成随机文件名。如果您手动编辑条目,则可以使用适合人类的文件名。
name项目的名称。它出现在舞台上,因此请仔细选择。要在表演期间更改它,请使用/nick <name>命令,在聊天窗口下方的文本输入字段中键入。
file重复的相关 Flash 文件的文件名,不带路径。缩略图路径 JPEG 格式缩略图的路径,相对于 Upstage/html 目录。UpStage 将它们存储在 Upstage/html/media/thumb 中。这些缩略图出现在舞台上以帮助玩家选择项目。
voice此属性仅影响头像,即使在这里也是可选的。它定义了文本到语音合成中使用的语音。语音名称在 Upstage/upstage/config.py 中定义。

从 workshop 中选择 https://:8081/admin/edit/avatar/ 链接,然后单击相关项目的名称以编辑现有头像。相应的对话框(图 4)为您提供了两个选项,即更改项目的名称和语音。

Performers Go Web

图 4. 此头像的“编辑”对话框没有告诉您这只企鹅非常大,几乎占据了整个屏幕。

不幸的是,当估计舞台上图片的大小时,此对话框几乎没有帮助。UpStage 客户端渲染背景幕以适合浏览器窗口的大小,而道具和头像的大小约为其原始尺寸的三倍。《用户手册》(请参阅资源)包含一个章节,其中提供了有关创建图形的尺寸和格式的建议。

发出声音

当涉及到语音定义时,人们不再需要处理 XML——现在是 Python 了。文件 Upstage/upstage/config.py 包含一个部分,实际上是一个字典对象,名为 VOICES,它定义了文本到语音合成中使用的命令(列表 2)。话虽如此,UpStage 语音生成并不完全依赖 Festival。这对于非英语使用者来说尤为重要,因为 Festival 发行版本身仅限于英语。

如果您想添加新的语音,只需在 VOICES 关键字后面的花括号内开始新的一行。在单引号标记中键入新语音的名称,然后添加

: ("| ", _fest),

确保您以尽可能多的空格开始该行,以便将您的起始单引号直接放在其他语音定义的开头下方。Python 对缩进很挑剔,不正确的缩进意味着 UpStage 停止工作。

列表 2. config.py 中的语音定义

VOICES = {
          'kal': ("| timeout 15 text2wave -eval
'(voice_kal_diphone)' -otype raw",
                 _fest),
         [...]
         }

在管道字符 (|) 之后,输入您喜欢的任何命令(管道),前提是它从 stdin 读取文本并在 stdout 上提供 16kHz 原始 PCM 输出。要对其进行测试,请发出以下命令

echo "Say something in the relevant language" |
<command> | timeout 15 lame -S -x -m s -r -s 16
--resample 22.05 --preset phone - /tmp/test.mp3

如果播放生成的 /tmp/test.mp3 文件的 MP3 播放器说出了它应该说的内容,请将您的命令插入 config.py。由于 UpStage 对路径特别挑剔,请确保您在此文件中使用绝对路径。

原始 config.py 文件包含比您的安装可能工作的更多的文本到语音命令。由于它们都出现在添加或编辑头像时的语音下拉菜单中,因此明智的做法是使用 # 符号将它们注释掉。请注意,对于原始语音定义,您必须注释掉每个项目的两行或三行。如果您遗漏了一个,您将收到如下错误消息

Failed to load application: invalid syntax
(config.py, line 92)

在重新启动服务器时使用./go.sh为了激活更改。

如果在此之后您的所有头像都失去了声音,您可能也注释掉了默认语音定义。坏主意!重新定义默认条目后面的命令是完全可以的,但您绝不能让 UpStage 没有默认条目。

排练时间

当您的舞台准备好后,就该开始排练了。这意味着所有玩家都需要登录并使用 workshop 中的“舞台”链接 https://:8081/stages/ 进入相关舞台。进入后,他们首先会发现一个大的空旷空间,即舞台,右侧环绕着聊天窗口,所有说出的文本都可以在其中阅读。图像库位于聊天窗口下方。单击图像库左侧部分的背景幕图标会更改舞台设计。右侧部分包含道具(图 5)。

Performers Go Web

图 5. 选择背景幕时,需要考虑到外右侧部分将被聊天窗口遮挡。

在聊天窗口上方,用户会看到一个按钮栏,该按钮栏主要用于控制头像。角色本身可以在右侧按钮上方的衣柜中找到。在这里,用户可以找到为此舞台激活的所有头像的缩略图。如果您单击其中一个,它会出现在衣柜左侧的镜子中。因此,瞥一眼镜子总是会告诉您您正在扮演哪个角色。

但是,您的角色不能立即在舞台上看到。如果您在聊天窗口下方的输入字段中键入一些文本,您的头像将充当画外音。当您第一次单击舞台窗口时,头像会出现在那里,其话语可以作为气泡阅读(图 5)。UpStage 是否在舞台上以文本形式显示头像的名称可以通过使用粉红色的名称按钮来触发。

当您单击舞台上的其他位置时,您的头像会慢慢移动到那里。如果您希望它立即跳到那里,请先单击绿色的“快速”按钮;橙色的“慢速”按钮会将您带回到慢动作模式。要使角色完全停止,请使用红色的“停止”按钮。

要为您的头像配备道具,请单击舞台窗口下方图像库右侧部分的相应缩略图。然后它会在您的头像的所有移动中跟随您的头像。

当您单击衣柜中的另一个缩略图时,您的旧角色仍留在舞台上,但可能会被您的合作玩家超越。当您当前拥有的头像需要离开舞台时,请使用黄色的“丢弃”按钮。目前,这也是摆脱道具的唯一方法。即使可以通过单击另一个道具图标来更改道具(尽管这并非完全没有副作用),但当前 UpStage 版本还没有“摆脱道具”按钮。

灰色的“清除”按钮会清空舞台,除了您的合作玩家正在持有的头像。但是,整个操作有一个副作用:在您的合作玩家可以再次移动他们的角色之前,他们必须在衣柜中重新选择他们。

有时看起来好像有些东西没有从舞台上消失。在大多数情况下,浏览器重新加载会有所帮助,但那时您需要再次抓住您的头像。

当由于某种原因您需要从头开始时,可以使用红色的“重置”按钮。在表演期间或当其他人也在同一舞台上时,不应这样做,因为它会戏剧性地将所有人赶下台并需要重新加载浏览器。有些玩家甚至可能需要重新登录。将“重置”按钮移动到不太诱人的位置是优先修复列表中的一项。

Performers Go Web

图 6. 为了鼓掌或喝倒彩,观众可以在聊天中输入内容。

如果未登录,则只能看到舞台和聊天窗口(图 6)。但这并不意味着观众没有声音。非演员输入的所有内容都可以被聊天窗口中的所有人看到,这使得 UpStage 成为在线教学和演示的绝佳选择。您可以选择回应或忽略观众的评论。唯一的区别是观众文本以灰色字体显示,不附加头像名称,并且不会大声说出来。因此,UpStage 中的掌声是无声的。

即使不安装 UpStage,您也可以试用它。Avatar Body Collision 每月都会为那些有兴趣体验和了解更多关于使用 UpStage 进行互动表演的人提供公开课程。请注意下一个日期(请参阅资源)。其他帮助可通过用户手册和邮件列表获得。

本文资源: /article/8056

Patricia Jung (trish@answergirl.de) 在 Open Source Press (www.opensourcepress.de) 担任编辑和系统管理员。因此,她很荣幸能够专门处理 Linux 和 UNIX。

加载 Disqus 评论