我在这里用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?')
所以,我认为我的尝试远远不够。有人可以给我任何暗示或指示,我可以在那里做出类似的事情吗?
答案 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;
?>
管道音频数据而不是写入文件是另一回事,可能需要像命名管道这样的解决方法。