RAM中的音频文件并播放 - Bash 4.3.42

时间:2016-01-12 18:33:07

标签: macos bash shell audio

我在这里用El Capitan在MacBook上工作。 OS X具有集成的文本到语音程序,您可以通过命令say使用。

我对这个命令的问题是我的MacBook有点陈旧并且很快耗尽了RAM。所以,我可以使用这个命令,但前两个句子听起来真的很好,而下一个句子听起来很完美。

我在警报和egg-timer脚本结束时使用say命令,发出消息。现在我使用bsay这是我写的一个小脚本:

#!/bin/bash

path="/Users/joe/.joe_script/resources/bsay/"
name=".$(date "+%s").ogg"
say -o ${path}$name "$*"
afplay ${path}$name
rm $path$name

到目前为止这个工作非常好。然而,我认为它应该更好。我想把它放在RAM中并在RAM中播放而不是在我的驱动器上写下来。我不知道如何实现这一目标。起初,我想象一个字符串会做到这一点。我试着通过使用以下行来完成它:

audio=$(say "Whatever I want to say")

它大声说出来。比我想象的,我只是添加了概念验证并尝试了这个:

say -o output.ogg "Whatever I want to say"
audio="$(cat output.ogg)"
afplay $audio

这只是给了我一个解释afplay是如何工作的解释......好吧,真可惜.. afplay并不支持变量。但作为概念的证明,我试过这个:

say -o output.ogg "Whatever I want to say"
audio="$(cat output.ogg)"
echo $audio >> output2.ogg
afplay output2.ogg

反过来只给了我一个错误信息:

Error: AudioFileOpen failed ('typ?')

所以,我认为我的尝试远远不够。有人可以给我任何暗示或指示,我可以在那里做出类似的事情吗?

1 个答案:

答案 0 :(得分:2)

您的尝试非常符合逻辑且仅失败,因为bash变量不能包含NUL字节:

class Foo {
  template <typename T>
  using templated_class_t = templated_class<T>;

  void (templated_class_t in);
};

void Foo::do(templated_class_t in) {
   // definition starts here.
}

有多种选择:

  • 坚持使用临时文件。因为它太短暂了,所以它可能永远不会到达磁盘

  • 创建ram disk并将文件存储在那里。

  • 使用Application.Screenupdating = False 'your code here Application.Screenupdating = True 或类似内容将二进制数据转换为文本并返回,因此您可以将其保存在变量中。

  • 管道到<?php ob_start(); include_once('connect.php'); session_start(); ?> <html> <head> <title>Upload an image</title> </head> <body> <form enctype="multipart/form-data" action="index.php" method="POST"> <input type="file" name="image"> <input type="submit" value="Upload"> </form> <?php //file properties $file = $_FILES['image']['tmp_name']; if(!isset($file)) { echo 'Please select an image.'; }else{ $image = addslashes(file_get_contents($_FILES['image']['tmp_name'])); $image_name = addslashes($_FILES['image']['name']); $image_size = getimagesize($_FILES['image']['tmp_name']); if($image_size == false){ echo 'That is not an image'; }else{ if (!$insert = mysqli_query($con,"INSERT INTO uploading_image(name,image) VALUES('$image_name','$image')")){ echo 'Problem uploading image'; }else{ $lastid = mysqli_insert_id(); echo 'Image uploaded. <br>Your image:<br><img src="get.php? id='.$lastid.'">'; } } } ?> </body> </html> 之类的工具,可以吸收输入,然后一次输出。

<?php include_once('connect.php'); $id = addslashes($_REQUEST['id']); $image = mysqli_query($con,"SELECT * FROM uploading_image WHERE id='$id'"); $find_image = mysqli_query($row = mysqli_fetch_array($image)); $image_db = $row['image']; header("Content-type: image/png"); echo $image_db; ?> 管道音频数据而不是写入文件是另一回事,可能需要像命名管道这样的解决方法。