使用声音包:React应用程序中的声音效果

也许事实是我专业从事声音,但是我希望网络声音更大。

我知道许多人不会支持我这种愿望。并非没有原因!从历史上看,互联网上的声音使用极其不成功且难看:

  • 在网络的早期,一些页面播放了背景MIDI音乐。
  • 弹出式诈骗者使用声音来达到他们的坏目标。他们借助声音寻求吸引用户的注意力,并使欺诈行为更加可信。
  • 声音会出现在自动开始播放的视频中(嗯,这绝对是一场噩梦)。

没错,我敢肯定,完全放弃声音就像孩子被水泼了一样。声音可以强调用户的操作;它们可以增强反馈。声音可以使一些乏味的动作变亮。如果网页上的声音带有品味,它们可以改善用户对项目的体验,使其更加“有形”和真实。 这个想法并不新鲜:在游戏和移动应用程序中,声音不断被使用。实际上,网络是大势所趋的一个奇怪的例外。我想到的大多数数字产品都使用声音。我不是在谈论移动应用程序中使用的触觉响应,以使它们更接近现实。





在撰写博客的过程中,我想尝试声音。用户与之交互的博客的许多界面元素都会产生安静的声音。例如,在右上部分博客的有几个按钮来切换主题,打开和关闭声音。

由于很少使用网络声音,因此声音的使用会对用户对网站的感知产生重大影响。这是开发人员的一种秘密武器,使用它可能对某些项目产生令人惊讶的巨大积极影响。

为了简化声音的使用,我设计了一个独立的npm包 形式的用于处理声音的挂钩,use-sound并将其发布。在这里,我将讨论该挂钩的功能,并分享在网络上使用声音的技巧。

如果您渴望查看代码并开始使用此挂钩- 这是其GitHub存储库。

总览


该软件包use-sound是一个React挂钩,可帮助开发人员使用声音效果。这是一个例子:

import useSound from 'use-sound';
import boopSfx from '../../sounds/boop.mp3';
const BoopButton = () => {
  const [play] = useSound(boopSfx);
  return <button onClick={play}>Boop!</button>;
};

使用此钩子将为项目构建增加大约1 Kb。的确,他在异步模式下加载了第三方Howler依赖项,其大小为10 KB。

该挂钩为开发人员提供了许多不错的功能。其中,我要注意以下几点:

  • 过早停止播放,以及暂停并继续播放。
  • 下载诸如声音“精灵表”之类的东西并将其划分为单独的声音。
  • 可以设置播放速度,以加快和减慢声音的播放速度。
  • 很多事件监听器。
  • 借助Howler,可以使用许多高级功能。

是hook文档,您可以在其中找到有关其用法和API参考的详细指南。

使用声音基础


▍安装


首先,您需要使用yarn或npm安装软件包:

#  yarn
yarn add use-sound
#  NPM
npm install use-sound

▍进口


程序包use-sound导出唯一的默认值-这是一个挂钩useSound您可以这样导入:

import useSound from 'use-sound';

另外,您将需要导入计划使用的音频文件。

如果在处理React项目时使用的是create-react-appGatsby之类的东西,那么您应该能够以与导入其他资源(如图像)相同的方式导入MP3文件:

import boopSfx from '../../sounds/boop.mp3';

如果使用自写的Webpack配置,则将需要使用文件加载器加载器来处理.mp3文件

此外,您可以使用放置在文件夹public或中的声音文件static例如,本文显示的演示使用公共文件夹中的静态文件。

搜索并准备声音


安装依赖关系和编写代码只是成功的一半。对于计分页面,我们需要选择适当的声音。

我最喜欢的用于查找声音的资源是freesound.org我在那里找到了几乎所有在我的博客中使用的声音。创用CC零下有许多声音许可要下载文件,您需要在资源上注册。您可以免费使用声音。

要做好以下准备:选择正确的声音,您必须认真浏览freesound.org的内容。例如,这里的要点是许多声音质量较差。可以将找到正确声音的过程与在大海捞针中寻找针头的过程进行比较。实际使用中的声音准备就像未切割的钻石一样。

s声音的准备


freesound.org的许多声音需要一些改进:

  • 声音像字符串一样,可以用空白框起来。通常会切出无声片段,因此,在发声事件发生后立即会重现相应的声音效果。
  • 准备声音时,您可能需要调整其音量,以使一个项目中使用的所有声音具有相同的音量。
  • Freesound.org具有以各种音频格式存储的声音。您可能非常需要将您喜欢的声音转换为MP3。

您可以使用Audacity完成所有这些编辑。这是一个免费的开源跨平台音频编辑器。在这里,我不会讨论如何使用此编辑器,但是有很多很棒的教程。

为什么我要谈论将声音转换为MP3?事实是,以前所有浏览器都不支持音频格式。因此,在项目中包含MP3,AIFF和WAV文件并在支持它们的环境中使用它们是司空见惯的。

在现代情况下,对我们来说幸运的是,所有主流浏览器(包括IE 9)都支持MP3格式。MP3格式存储的声音也得到了很好的压缩。这样一来,您可以转到比使用其他格式编码声音小得多的文件,而不损失质量。

声音和可用性


尽管我主张在网络上使用声音,但我承认并非所有用户都喜欢它。在这里,我们谈论的是超越主观沉默的考虑。

有视力障碍的人使用屏幕阅读器来访问网页。而且,我们不仅在谈论那些看不见页面的人。例如,屏幕阅读器供有阅读困难的阅读障碍者和其他类似问题的人们使用。屏幕阅读器是用于解析文档和阅读文本的程序。如果站点包含很多声音效果,则它们可能会干扰从屏幕读取文本的程序的正常运行。反过来,这将阻止依赖于此类程序的人们使用该网站。

因此,在站点页面中包括一个用于打开和关闭声音的按钮很重要。此外,此类按钮应可用于键盘导航(使用Tab键)。理想情况下,在用户使用Tab键到达此类按钮之前,不应播放任何声音。另外,Web项目必须记住该按钮的状态-这样用户不必经常使用它来使声音静音。

另一方面,听力障碍的用户甚至不会知道与页面的某些交互伴随声音。对于在关闭声音的情况下在Internet上工作的人也是如此。因此,重要的是在执行某些重要动作时不要完全依赖声音。如果将声音用作对某些用户操作的确认,请确保在此页面上还显示对此操作的视觉确认。网站应保持完整功能且无声音。

菜谱


让我们看几个示例(在本文原文的相应部分,您可以进行交互地实验并聆听不同控件发出的声音)。

▍复选框


我真的很喜欢这个标志。如果您使用鼠标,请先非常快地单击它,然后在单击和释放鼠标按钮之间稍作停顿。

function Demo() {
  const [isChecked, setIsChecked] = React.useState(
    false
  );

  const [playActive] = useSound(
    '/sounds/pop-down.mp3',
    { volume: 0.25 }
  );
  const [playOn] = useSound(
    '/sounds/pop-up-on.mp3',
    { volume: 0.25 }
  );
  const [playOff] = useSound(
    '/sounds/pop-up-off.mp3',
    { volume: 0.25 }
  );

  return (
    <Checkbox
      name="demo-checkbox"
      checked={isChecked}
      size={24}
      label="I agree to self-isolate"
      onChange={() => setIsChecked(!isChecked)}
      onMouseDown={playActive}
      onMouseUp={() => {
        isChecked ? playOff() : playOn();
      }}
    />
  );
}

▍及早中断声音再现


有时,您只希望在用户与某个控件交互时才播放声音。请注意以下示例中仅当指针位于控件上方时才再现声音的方式。

function Demo() {
  // ,  ,  'rising-pops' :
  // - fanfare
  // - dun-dun-dun
  // - guitar-loop
  const soundUrl = '/sounds/rising-pops.mp3';

  const [play, { stop }] = useSound(
    soundUrl,
    { volume: 0.5 }
  );

  const [isHovering, setIsHovering] = React.useState(
    false
  );

  return (
    <Button
      onMouseEnter={() => {
        setIsHovering(true);
        play();
      }}
      onMouseLeave={() => {
        setIsHovering(false);
        stop();
      }}
    >
      <ButtonContents isHovering={isHovering}>
        Hover over me!
      </ButtonContents>
    </Button>
  );
}

pitch增加音高


这是一个有趣效果的示例。它包含以下事实:下次单击“赞”按钮所产生的声音要高于其上一次单击所产生的声音:

function Demo() {
  const soundUrl = '/sounds/glug-a.mp3';

  const [playbackRate, setPlaybackRate] = React.useState(0.75);

  const [play] = useSound(soundUrl, {
    playbackRate,
    volume: 0.5,
  });

  const handleClick = () => {
    setPlaybackRate(playbackRate + 0.1);
    play();
  };

  return (
    <Button onClick={handleClick}>
      <span role="img" aria-label="Heart">
      </span>
    </Button>
  );
}

▍按钮开始和暂停播放


这是用于启动和暂停声音的按钮的实现代码,这将帮助您开发新的Spotify:

function Demo() {
  const soundUrl = '/sounds/guitar-loop.mp3';

  const [play, { stop, isPlaying }] = useSound(soundUrl);

  return (
    <PlayButton
      active={isPlaying}
      size={60}
      iconColor="var(--color-background)"
      idleBackgroundColor="var(--color-text)"
      activeBackgroundColor="var(--color-primary)"
      play={play}
      stop={stop}
    />
  );
}

ound声音“精灵列表”


如果您打算在React组件中使用很多声音,那么使用声音“精灵列表”可能是有意义的。声音精灵列表是一个包含许多不同声音的文件。通过将它们打包到一个文件中,我们增加了使用它们的便利性,并且避免发出许多并行HTTP请求来下载单个文件(我希望有一天我们能够使用HTTP / 2复用)。

在这里,我们使用声音“精灵列表”创建鼓机。您可以使用鼠标或键盘上的1-4键来播放虚拟卷轴。

function Demo() {
  const soundUrl = '/sounds/909-drums.mp3';

  const [play] = useSound(soundUrl, {
    sprite: {
      kick: [0, 350],
      hihat: [374, 160],
      snare: [666, 290],
      cowbell: [968, 200],
    }
  });

  //  ,   'keydown',
  //    .
  useKeyboardBindings({
    1: () => play({ id: 'kick' }),
    2: () => play({ id: 'hihat' }),
    3: () => play({ id: 'snare' }),
    4: () => play({ id: 'cowbell' }),
  })

  return (
    <>
      <Button
        aria-label="kick"
        onMouseDown={() => play({ id: 'kick' })}
      >
        1
      </Button>
      <Button
        aria-label="hihat"
        onMouseDown={() => play({ id: 'hihat' })}
      >
        2
      </Button>
      <Button
        aria-label="snare"
        onMouseDown={() => play({ id: 'snare' })}
      >
        3
      </Button>
      <Button
        aria-label="cowbell"
        onMouseDown={() => play({ id: 'cowbell' })}
      >
        4
      </Button>
    </>
  );
}

在包装中使用声音“精灵列表”的详细信息use-sound,可以发现在这里

摘要


在开发网站时使用声音的领域中,我最担心的事实是这是一个研究很少的领域。我已经尝试了一段时间的声音,但是我仍然觉得我才刚刚起步。

因此,现在您可以使用各种工具来开始自己的声音实验。我建议您这样做,并找出它将引导您的地方。

亲爱的读者们!您如何在网页上使用声音?


All Articles