有没有办法让R在手写结束时发出嘟嘟声/播放声音?

时间:2010-07-29 18:08:28

标签: r

当我运行R脚本时,我会在另一个桌面上执行其他操作。如果我不经常检查,我永远不知道什么时候完成。有没有办法调用蜂鸣声(如系统蜂鸣声)或让R播放声音或通过脚本末尾的某些代码通知咆哮?

19 个答案:

答案 0 :(得分:125)

我有一个包(beepr),其唯一目的是在R中发出通知声音,这应该可以跨平台工作。运行以下命令安装beepr并发出声音:

install.packages("beepr")
library(beepr)
beep()

github上的更多信息:https://github.com/rasmusab/beepr

答案 1 :(得分:87)

alarm()

Tha警报功能。

答案 2 :(得分:54)

在MacOSX上,您可以让电脑说话:

system("say Just finished!")

你也可以改变说话的人造声音:

system("say -v Kathy Just finished!")

您可以选择计算机上可用的任何语音。在Yosemite上,您可以在系统偏好设置 - >中看到安装了哪些声部。听写与演讲 - >文字转语音

答案 3 :(得分:47)

答案 4 :(得分:32)

alarm在我的Windows机器上不起作用,所以我创建了一个实际上会产生噪音的功能。

beep <- function(n = 3){
    for(i in seq(n)){
        system("rundll32 user32.dll,MessageBeep -1")
        Sys.sleep(.5)
    }
}

这显然只适用于Windows,但我不保证它甚至可以在任意Windows计算机上运行。我只是在我的机器上进行了测试,但我想我会发布它,以防任何人遇到与我alarm相同的问题。

答案 5 :(得分:27)

  

cat('Hello world!\ a')

答案 6 :(得分:16)

不仅如此,当程序完成循环时,你还可以从Youtube上放一些史诗音乐:)(对于Ubuntu / Debian:)

system("xdg-open 'http://www.youtube.com/watch?v=9jK-NcRmVcw'")

答案 7 :(得分:11)

更新:

使用macOS 10.9(Mavericks)及更高版本,您可以使用普通的AppleScript发布通知:

theTitle <- "A Title"
theMsg <- "A message here"

cmd <- paste("osascript -e ", "'display notification ", '"', theMsg, '"', ' with title ', '"', theTitle, '"', "'", sep='')
system(cmd)

这样就无需安装terminal-notifier,如下所述。

-

我已经在我的Mac上安装了terminal-notifier来从命令行获取桌面通知。然后你可以像这样结束对system()命令的调用(显然改变路径):

notify <- function(msgString='Message from R', titleString='Message from R', speakIt=FALSE) {
    cmd <- paste('~/terminal-notifier/terminal-notifier.app/Contents/MacOS/terminal-notifier -message ', '"', msgString, '"  -title "', titleString, '"', sep='')
    system(cmd)

    if (speakIt) {
        system(paste('say', msgString))
    }

}

你可以像这样调用这个函数

notify("R is done", "Message from R", speakIt=TRUE)

获取这样的消息:

enter image description here

更新:包含@ VLC&#39; say命令。

答案 8 :(得分:10)

请使用shell.exec("url")在Windows上打开一些YouTube剪辑

答案 9 :(得分:9)

对于具有GUI和Web浏览器的操作系统,某些合理的OS独立性如何?它甚至适用于RStudio Server!

browseURL('https://www.youtube.com/watch?v=QH2-TGUlwu4')

答案 10 :(得分:8)

或者,如果您正在使用GNU / Linux发行版并将 pcspkr 模块列入黑名单(PC扬声器总是令我烦恼),请尝试将system与一些听觉/视觉通知相结合,例如< / p>

system("aplay -t wav /usr/share/sounds/phone.wav") # for auditive bell (an I mean it literary)
system("zenity --title=\"R script info\" --text=\"Script has finished with zero exit status\" --info") # for GTK dialog

如果您更喜欢警报,例如通知区域,您可以查看 zenity 手册...但是,使用system功能,您几乎可以做任何事情:发送电子邮件,运行其他一些脚本,重启机器,sudo rm -rf *.*任何 ......我的意思是。

但这只是 IF 你正在运行GNU / Linux(或UNIX)发行版,否则,坚持使用Windows特定命令,不过在这种情况下,我可以不给你太多信息......

答案 11 :(得分:5)

看看这个包:RPushBullet

  

Pushbullet消息传递服务的R接口,提供快速   计算机之间的高效通知(和文件传输),   手机和平板电脑

RPushbullet是完全免费的多平台。至于你的问题,你可以使用这个库向你的浏览器发送推送,但显然当你需要的东西比你不在时通知你时它会变得惊人。 此外,R包的创造者与众所周知的Rcpp,Dirk Eddelbuettel相同。我说它值得一试!

答案 12 :(得分:4)

beepr的启发,这是我目前用于解决这类问题的功能:D

work_complete <- function() {
  cat("Work complete. Press esc to sound the fanfare!!!\n")
  on.exit(beepr::beep(3))

  while (TRUE) {
    beepr::beep(4)
    Sys.sleep(1)
  }
}

答案 13 :(得分:4)

播放一些音乐怎么样?

shell.exec("foo/Born.to.be.wild.mp3")

答案 14 :(得分:2)

您可以使用notify-send命令:

system("notify-send \"R script finished running\"")

答案 15 :(得分:0)

由于这些主意,我创建了一个无法访问Internet的解决方案,因为我使用Windows的VPN客户端。因此,它可以播放典型的Windows声音,通常可以在任何Windows操作系统上使用。

#Function with loop, press Esc to stopp      
    alarm2 <- function(){
      while(TRUE){
        system("cmd.exe",input="C:/Windows/WinSxS/amd64_microsoft-windows-shell-sounds_31bf3856ad364e35_10.0.17134.1_none_fc93088a1eb3fd11/tada.wav")
        Sys.sleep(1)
      }
    }

无循环功能

    alarm3 <- function(){
        system("cmd.exe",input="C:/Windows/WinSxS/amd64_microsoft-windows-shell-sounds_31bf3856ad364e35_10.0.17134.1_none_fc93088a1eb3fd11/tada.wav")
        Sys.sleep(1)
    }

答案 16 :(得分:0)

如何使用Windows SpeechSynthesizer

message <- "job done!"

system2(command = "PowerShell", 
        args = c("-Command", 
                 "\"Add-Type -AssemblyName System.Speech;",
                  "$speak = New-Object System.Speech.Synthesis.SpeechSynthesizer;",
                  paste0("$speak.Speak('", message, "');\"")
        ))
                                               

这可以很好地用于迭代操作中,并读取诸如“第一项工作已完成”,“第二项工作已完成”等内容:

say_something <- function(message) {
    
     message <- paste0("$speak.Speak('", message, "');\"")
    
     system2(command = "PowerShell", 
             args = c("-Command", 
                       "\"Add-Type -AssemblyName System.Speech;",
                       "$speak = New-Object System.Speech.Synthesis.SpeechSynthesizer;",
                                    
                       message
            ))
  }

operations <- c("1st.", "2nd.", "3rd.")
lapply(operations, function(x) say_something(message=paste(x, "job done")))

 

*请注意,这使用系统默认语言设置。该示例基于英语讲师,可以使用SelectVoice方法进行更改。要检查可用的讲师,请使用:

  system2(command = "PowerShell", 
        args = c("-Command", 
                 "\"Add-Type -AssemblyName System.Speech;",
                  "$speak = New-Object System.Speech.Synthesis.SpeechSynthesizer;",
                 "$speak.GetInstalledVoices().VoiceInfo")
        )

给出:

    Gender                : Female
Age                   : Adult
Name                  : Microsoft Paulina Desktop
Culture               : pl-PL
Id                    : TTS_MS_PL-PL_PAULINA_11.0
Description           : Microsoft Paulina Desktop - Polish
SupportedAudioFormats : {}
AdditionalInfo        : {[Age, Adult], [Gender, Female], [Language, 415], [Name, Microsoft Paulina Desktop]...}

Gender                : Male
Age                   : Adult
Name                  : Microsoft David Desktop
Culture               : en-US
Id                    : TTS_MS_EN-US_DAVID_11.0
Description           : Microsoft David Desktop - English (United States)
SupportedAudioFormats : {}
AdditionalInfo        : {[Age, Adult], [Gender, Male], [Language, 409], [Name, Microsoft David Desktop]...}

最后一个功能,可以通过他的“名字”(例如“ David”,“ Paulina”或“ Hazel”)来选择演讲人:

say_something <- function(message , voice) {
        
  voice <- paste0("\"$speak.SelectVoice('Microsoft ", voice, " Desktop');" )
  message <- paste0("$speak.Speak('", message, "');\"")
      
  system2(command = "PowerShell", 
          args = c("-Command", 
                    "\"Add-Type -AssemblyName System.Speech;",
                    "$speak = New-Object System.Speech.Synthesis.SpeechSynthesizer;",
                    voice,
                    message
          ))
}


operations <- c("1st.", "2nd.", "3rd.")

lapply(operations, function(x) say_something(message=paste(x, "job done"), voice="David"))

答案 17 :(得分:0)

以下代码会产生提示音,并且不依赖于 .mp3 或 .wav 文件:

switch(Sys.info()[['sysname']],
Linux = {
    system('play -n synth 0.1 tri  1000.0')}
)

答案 18 :(得分:0)

这样做:

song <- function() {
    for(i in 1:2) {
        for(i in 1:4) {
            for(i in 1:4) {
                beep(7)
                Sys.sleep(0.25)
                beep()
                Sys.sleep(0.22)
            }
            beep(2)
        }
        beep(11)
    }
    beep(4)
} 

song()

你可以全力以赴。