mirror of
https://github.com/storytold/artcraft.git
synced 2026-11-03 00:47:53 +00:00
297 lines
8.6 KiB
Rust
297 lines
8.6 KiB
Rust
//! NB: From wavy library
|
|
//!
|
|
//! This example records audio and plays it back in real time as it's being recorded.
|
|
|
|
extern crate tensorflow;
|
|
extern crate wavy;
|
|
extern crate world_sys;
|
|
extern crate zmq;
|
|
|
|
pub mod ipc;
|
|
pub mod synthesis;
|
|
|
|
use wavy::*;
|
|
|
|
use std::collections::VecDeque;
|
|
use std::fs::File;
|
|
use std::io::Read;
|
|
use std::path::Path;
|
|
use std::process::exit;
|
|
use std::thread;
|
|
|
|
use tensorflow::Code;
|
|
use tensorflow::Graph;
|
|
use tensorflow::ImportGraphDefOptions;
|
|
use tensorflow::Session;
|
|
use tensorflow::SessionOptions;
|
|
use tensorflow::SessionRunArgs;
|
|
use tensorflow::Status;
|
|
use tensorflow::Tensor;
|
|
use tensorflow::version;
|
|
use zmq::{Error, Socket};
|
|
|
|
use ipc::{QueueSender, AudioQueue};
|
|
use std::sync::Arc;
|
|
|
|
const INPUT_NAME : &'static str = "input_A_test";
|
|
const OUTPUT_NAME : &'static str = "generator_A2B_3/output_transpose";
|
|
|
|
fn main() {
|
|
print_version();
|
|
//load_model(); // TODO: This works. Temporarily commented out
|
|
run_audio().expect("should work");
|
|
//run_audio().expect("should work");
|
|
}
|
|
|
|
fn print_version() {
|
|
// Python TensorFlow version: 1.14.0
|
|
// Rust TensorFlow version: 1.13.1 (default, must be hand-upgraded)
|
|
let version = version().expect("version");
|
|
println!("Tensorflow version: {}", version);
|
|
}
|
|
|
|
struct VoiceModel {
|
|
graph: Graph,
|
|
session: Session,
|
|
}
|
|
|
|
impl VoiceModel {
|
|
pub fn load(dir_name: &str) -> Self {
|
|
let mut graph = Graph::new();
|
|
let session = Session::from_saved_model(
|
|
&SessionOptions::new(),
|
|
&["serve"],
|
|
&mut graph,
|
|
dir_name,
|
|
).expect("Should load");
|
|
|
|
VoiceModel {
|
|
graph,
|
|
session,
|
|
}
|
|
}
|
|
|
|
pub fn evaluate(&self, input: &Tensor<f32>) {
|
|
println!(">>> Input tensor dims: {:?}", input.dims());
|
|
|
|
// Run the graph.
|
|
let mut args = SessionRunArgs::new();
|
|
|
|
// input_A_test:
|
|
// Tensor("input_A_test:0", shape=(?, 24, ?), dtype=float32)
|
|
args.add_feed(&self.graph.operation_by_name_required(INPUT_NAME)
|
|
.expect(INPUT_NAME), 0, &input);
|
|
|
|
// generation_B_test:
|
|
// Tensor("generator_A2B_3/output_transpose:0", shape=(?, 24, ?), dtype=float32)
|
|
let z = args.request_fetch(
|
|
&self.graph.operation_by_name_required(OUTPUT_NAME)
|
|
.expect(OUTPUT_NAME), 0);
|
|
|
|
self.session.run(&mut args).expect("Run success");
|
|
|
|
// Check our results.
|
|
let z_res = args.fetch::<f32>(z).expect("ret");
|
|
|
|
println!("z_rez.dims(): {:?}", z_res.dims());
|
|
println!("z_rez: {:?}", z_res);
|
|
}
|
|
}
|
|
|
|
|
|
fn load_model() {
|
|
let model_dir = "/home/bt/dev/voder/saved_model";
|
|
let model = VoiceModel::load(model_dir);
|
|
|
|
// ] generation_B_test: Tensor("generator_A2B_3/output_transpose:0", shape=(?, 24, ?), dtype=float32)
|
|
// ] input_A_test: Tensor("input_A_test:0", shape=(?, 24, ?), dtype=float32)
|
|
// ] inputs.shape: (1, 24, 380) -- the last dimension is the signal
|
|
|
|
let mut input = Tensor::new(&[1, 24, 10])
|
|
.with_values(&[
|
|
0.0f32, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
|
|
0.0f32, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
|
|
0.0f32, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
|
|
0.0f32, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
|
|
0.0f32, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
|
|
0.0f32, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
|
|
0.0f32, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
|
|
0.0f32, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
|
|
0.0f32, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
|
|
0.0f32, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
|
|
0.0f32, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
|
|
0.0f32, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
|
|
0.0f32, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
|
|
0.0f32, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
|
|
0.0f32, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
|
|
0.0f32, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
|
|
0.0f32, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
|
|
0.0f32, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
|
|
0.0f32, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
|
|
0.0f32, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
|
|
0.0f32, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
|
|
0.0f32, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
|
|
0.0f32, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
|
|
0.0f32, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
|
|
])
|
|
.unwrap();
|
|
|
|
model.evaluate(&input);
|
|
model.evaluate(&input);
|
|
model.evaluate(&input);
|
|
}
|
|
|
|
/*fn load_model_2() {
|
|
// from regression_checkpoint.rs example
|
|
|
|
let filename = "/home/bt/dev/voder/saved_model/saved_model.pb";
|
|
|
|
let mut graph = Graph::new();
|
|
let mut proto = Vec::new();
|
|
|
|
File::open(filename)
|
|
.expect("opened")
|
|
.read_to_end(&mut proto)
|
|
.expect("cannot read");
|
|
|
|
graph.import_graph_def(&proto, &ImportGraphDefOptions::new()).expect("cannot import");
|
|
|
|
let session = Session::new(&SessionOptions::new(), &graph).expect("cannot session");
|
|
|
|
/*let op_x = graph.operation_by_name_required("x").expect("x");
|
|
let op_y = graph.operation_by_name_required("y").expect("y");
|
|
let op_init = graph.operation_by_name_required("init").expect("init");
|
|
let op_train = graph.operation_by_name_required("train").expect("train");
|
|
let op_w = graph.operation_by_name_required("w").expect("w");
|
|
let op_b = graph.operation_by_name_required("b").expect("b");
|
|
let op_file_path = graph.operation_by_name_required("save/Const").expect("const");
|
|
let op_save = graph.operation_by_name_required("save/control_dependency").expect("save");*/
|
|
|
|
//let file_path_tensor: Tensor<String> =
|
|
// Tensor::from(String::from("/home/bt/dev/voder/extra_model/sf1_tm1.ckpt.data-00000-of-00001"));
|
|
//println!("Tensor: {:?}", file_path_tensor);
|
|
}*/
|
|
|
|
fn run_audio() -> Result<(), AudioError> {
|
|
println!("Opening microphone system");
|
|
let mut mic = MicrophoneSystem::new(SampleRate::Normal)?;
|
|
|
|
println!("Opening speaker system");
|
|
let mut speaker = SpeakerSystem::new(SampleRate::Sparse)?;
|
|
|
|
println!("Done");
|
|
|
|
//let mut buffer = VecDeque::new();
|
|
|
|
let mut audio_queue = Arc::new(AudioQueue::new());
|
|
let mut audio_queue_2 = audio_queue.clone();
|
|
|
|
thread::spawn(move || {
|
|
//let mut queue_sender = QueueSender::new();
|
|
//queue_sender.connect();
|
|
|
|
let mut context = zmq::Context::new();
|
|
let mut socket = context.socket(zmq::REQ).unwrap();
|
|
|
|
/*let mut socket = ctx.socket(zmq::REQ).unwrap();
|
|
socket.connect("tcp://127.0.0.1:1234").unwrap();
|
|
socket.send("hello world!", 0).unwrap();*/
|
|
|
|
socket.connect("tcp://127.0.0.1:5555").unwrap();
|
|
|
|
let mut reconnect = false;
|
|
|
|
loop {
|
|
let mut drained = audio_queue_2.drain();
|
|
println!("Len drained: {}", drained.len());
|
|
|
|
for val in drained {
|
|
let bytes = val.to_be_bytes();
|
|
loop {
|
|
if reconnect {
|
|
reconnect = false;
|
|
|
|
socket = match context.socket(zmq::REQ) {
|
|
Ok(s) => s,
|
|
Err(e) => {
|
|
println!("Error creating socket: {:?}", e);
|
|
continue
|
|
},
|
|
};
|
|
|
|
match socket.connect("tcp://127.0.0.1:5555") {
|
|
Ok(_) => {
|
|
println!("B");
|
|
},
|
|
Err(err) => {
|
|
println!("Err B: {:?}", err);
|
|
},
|
|
}
|
|
|
|
}
|
|
match socket.send(&bytes[..], 0) {
|
|
Ok(_) => { break; },
|
|
Err(e) => {
|
|
println!("send err: {:?}", e);
|
|
reconnect = true;
|
|
},
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|
|
});
|
|
|
|
loop {
|
|
mic.record(&mut |_index, l, r| {
|
|
audio_queue.push_back(l);
|
|
/*if !queue_sender.enqueue(l) {
|
|
queue_sender.connect();
|
|
}*/
|
|
//buffer.push_back((l, l));
|
|
});
|
|
|
|
/*speaker.play(&mut || {
|
|
if let Some((lsample, rsample)) = buffer.pop_front() {
|
|
AudioSample::stereo(lsample, rsample)
|
|
} else {
|
|
AudioSample::stereo(0, 0)
|
|
}
|
|
});*/
|
|
}
|
|
}
|
|
|
|
fn zeromq_test() {
|
|
thread::spawn(|| {
|
|
let ctx = zmq::Context::new();
|
|
let mut socket = ctx.socket(zmq::REQ).unwrap();
|
|
let mut reconnect = false;
|
|
socket.connect("tcp://127.0.0.1:5555").unwrap();
|
|
|
|
loop {
|
|
if reconnect {
|
|
match ctx.socket(zmq::REQ) {
|
|
Err(_) => {},
|
|
Ok(s) => {
|
|
match s.connect("tcp://127.0.0.1:5555") {
|
|
Err(_) => {},
|
|
Ok(_) => {
|
|
socket = s;
|
|
reconnect = false;
|
|
},
|
|
}
|
|
},
|
|
}
|
|
}
|
|
match socket.send("hello world!", 0) {
|
|
Ok(_) => {
|
|
println!("Sent");
|
|
},
|
|
Err(_) => {
|
|
reconnect = true;
|
|
},
|
|
}
|
|
}
|
|
});
|
|
}
|