Skip to content

Commit cf73b41

Browse files
committed
Add TTS
1 parent 9c575f1 commit cf73b41

File tree

5 files changed

+69
-11
lines changed

5 files changed

+69
-11
lines changed

.github/workflows/Test.yml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,11 @@ jobs:
2323
with:
2424
prefix-key: 'test'
2525

26+
- run: |
27+
echo "OPENAI_KEY=${{ secrets.OPENAI_KEY }}" > test.env
28+
echo "DEEPINFRA_KEY=${{ secrets.DEEPINFRA_KEY }}" >> test.env
29+
2630
- run: cargo test --all-features
31+
32+
- name: Cleanup before Post Run
33+
run: rm test.env

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,4 @@
22
**/*.rs.bk
33
ata.toml
44
Cargo.lock
5+
test.env

Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ tokio = { version = "1", features = ["macros", "rt-multi-thread"] }
1111
transformrs = { git = "https://github.com/rikhuijzer/transformrs.git", rev = "06b759f" }
1212
anyhow = "1"
1313

14-
15-
1614
[dev-dependencies]
1715
assert_cmd = "2"
1816
predicates = "3"
1917
pretty_assertions = "1"
18+
tempfile = "3"
19+
toml = "0.8"

src/main.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
use clap::Parser;
2+
use std::fs::File;
23
use std::io::Read;
4+
use std::io::Write;
35
use transformrs::Key;
46
use transformrs::Provider;
57

@@ -24,7 +26,6 @@ struct Arguments {
2426
}
2527

2628
enum Task {
27-
Chat,
2829
TTS,
2930
}
3031

@@ -53,7 +54,6 @@ fn default_voice(provider: &Provider) -> Option<String> {
5354
fn default_model(provider: &Provider, task: &Task) -> Option<String> {
5455
match provider {
5556
Provider::OpenAI => match task {
56-
Task::Chat => Some("gpt-4o".to_string()),
5757
Task::TTS => Some("tts-1".to_string()),
5858
},
5959
_ => None,
@@ -67,7 +67,6 @@ async fn main() {
6767
let mut input = String::new();
6868
std::io::stdin().read_to_string(&mut input).unwrap();
6969

70-
// TODO: add logic to transformrs to just get the key without .env file.
7170
let keys = transformrs::load_keys(".env");
7271
let key = find_single_key(keys);
7372
let provider = key.provider.clone();
@@ -82,6 +81,11 @@ async fn main() {
8281
.unwrap()
8382
.structured()
8483
.unwrap();
84+
let bytes = resp.audio.clone();
85+
let ext = resp.file_format;
86+
let filename = format!("output.{ext}");
87+
let mut file = File::create(filename).unwrap();
88+
file.write_all(&bytes).unwrap();
8589
} else {
8690
error_and_exit("No action specified.");
8791
}

tests/cli.rs

Lines changed: 52 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
1-
use assert_cmd::prelude::*;
1+
use assert_cmd::Command;
22
use predicates::prelude::*;
3-
use std::process::Command;
3+
use std::io::BufRead;
4+
use transformrs::Provider;
5+
6+
fn ata() -> Command {
7+
Command::cargo_bin("ata").unwrap()
8+
}
49

510
#[test]
611
fn unexpected_argument() -> Result<(), Box<dyn std::error::Error>> {
7-
let mut cmd = Command::cargo_bin("ata")?;
8-
12+
let mut cmd = ata();
913
cmd.arg("foobar");
1014
cmd.assert()
1115
.failure()
@@ -16,12 +20,54 @@ fn unexpected_argument() -> Result<(), Box<dyn std::error::Error>> {
1620

1721
#[test]
1822
fn help() -> Result<(), Box<dyn std::error::Error>> {
19-
let mut cmd = Command::cargo_bin("ata")?;
20-
23+
let mut cmd = ata();
2124
cmd.arg("--help");
2225
cmd.assert()
2326
.success()
2427
.stdout(predicate::str::contains("Usage: ata"));
2528

2629
Ok(())
2730
}
31+
32+
/// Load a key from the local .env file.
33+
///
34+
/// This is used for testing only. Expects the .env file to contain keys for providers in the following format:
35+
///
36+
/// ```
37+
/// DEEPINFRA_KEY="<KEY>"
38+
/// OPENAI_KEY="<KEY>"
39+
/// ```
40+
fn load_key(provider: &Provider) -> String {
41+
fn finder(line: &Result<String, std::io::Error>, provider: &Provider) -> bool {
42+
line.as_ref()
43+
.unwrap()
44+
.starts_with(&provider.key_name())
45+
}
46+
let path = std::path::Path::new("test.env");
47+
let file = std::fs::File::open(path).expect("Failed to open .env file");
48+
let reader = std::io::BufReader::new(file);
49+
let mut lines = reader.lines();
50+
let key = lines
51+
.find(|line| finder(line, provider))
52+
.unwrap()
53+
.unwrap();
54+
key.split("=").nth(1).unwrap().to_string()
55+
}
56+
57+
#[test]
58+
fn tts_no_args() -> Result<(), Box<dyn std::error::Error>> {
59+
let dir = tempfile::tempdir().unwrap();
60+
let mut cmd = ata();
61+
let key = load_key(&Provider::OpenAI);
62+
cmd.arg("--tts")
63+
.env("OPENAI_KEY", key)
64+
.write_stdin("Hello world")
65+
.current_dir(&dir)
66+
.assert()
67+
.success();
68+
69+
let path = dir.path().join("output.mp3");
70+
assert!(path.exists());
71+
72+
Ok(())
73+
}

0 commit comments

Comments
 (0)